Внутренние прерывания

alexbmd
Offline
Зарегистрирован: 15.01.2016

nik182 пишет:

. Единицу можно записать разными способами. 

ага, можно пример? как вы в EIFR единицу пишите

nik182
Offline
Зарегистрирован: 04.05.2015

Можно загрузить в регистр целый байт, можно установить один бит. Думаю sbi и в скече пройдет на ура. Все команды ассемблера avr которые могут дотянуть единчку до бита Вам в помощь. Остается знать какие команды си в какие команды ассемблера компилируются. Вот это повод для изучения. Но и в интернете можно найти кое что. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

alexbmd пишет:
ага, можно пример? как вы в EIFR единицу пишите
Ну, тебе ж уже кто только не объяснял, как и что туда пишется! Сколько ж можно тупить-то!

Держи. Тут есть и запись нуля, и запись единицы.

//
// запись 1 в EIFR (в бит INTF0)
//
void setEIFR(void) {
	asm ( "sbi	9, 2" );
}

//
// запись 0 в EIFR (в бит INTF0)
//
void clearEIFR(void) {
	EIFR |= bit(INTF0);
}

void printing(const int mustBe) {
	Serial.print("Must be: ");
	Serial.print(mustBe);
	Serial.print(";  actually: ");
	Serial.println((uint8_t) EIFR);
}

void setup(void) {
	Serial.begin(57600);
	EICRA = 1;
	EIFR = 3; // очистим EIFR
	
	clearEIFR();
	printing(0);

	setEIFR();
	printing(1);

	setEIFR();
	printing(1);
	
	clearEIFR();
	printing(0);
}

void loop(void) {}

Запускай, проверяй, всё работает.

alexbmd
Offline
Зарегистрирован: 15.01.2016

Ворота, конкретно это код и не компилиться и даже если сделать чтоб компилился выводит четыре нуля тк содержит ошибки.... [зато хайпа сколько]

НО идея понятно , и я её реализовал, спасибо!.

НО только голословничать не надо! в теме асм код упомянулся только раз и совершенно в другом аспекте. поэтому прежде чем рвать на себе рубашку и стучать кулаком какие мы крутые, да еще и во множественном числе (это уже посыл крикунам и критикам которые кроме криков и критики ничего не в несли в эту тему), надо бы хотябы читать тему вначале. пусть даже черезмерно въедливо как Евгений, зато он пустого не говорит. да грубит и глумиться, но его слова по делу много стоят. ну такой он человек что поделаешь

alexbmd
Offline
Зарегистрирован: 15.01.2016

dimax пишет:

При записи в флаговый регистр единицы происходит инверсия содержимого.  0 + 1 = 1  и соответссно  1 + 1 =0

поэкспереминтировал да так получается. на ноль не реагирует. а еденица инвертирует. НО. есть два но

1) еденицу вручную мы можем записать только через асемблер вставку. 

2) если вспомнить мой вопрос почему мы говорили об этой записи (там фигурировал or'ing |=) так вот ввиду того что без ассемблера, мы можем только очистить флаг, когда там уже есть единица. то очистить мы его можем любым способом. и все они прекрасно его очистят EIFR=EIFR, EIFR=1, EIFR|=1, т.е. оринг вполне себе валидная инструкция тоже.

а по повду Дима предложенной вами очистки EIFR = EIFR есть такое мнение с другой стороны океана :)

That code has a race condition.  Loading the value into a general purpose register (the stuff to the right of the equals) takes at least one machine instruction.  Writing the value (the part on the left side) takes at least one machine instruction.  In between it is possible for a flag to be set.

  EIFR = EIFR;

Becomes...

  Rnn = EIFR;
  EIFR = Rnn;

So, it is possible for this to happen...

  Rnn = EIFR;
  /* a new flag is set */
  EIFR = Rnn;

That new flag is not cleared.  This solves that specific problem...

  EIFR = 0xFF;

Евгений я не учю я дискутирую

Green
Offline
Зарегистрирован: 01.10.2015

Ужас какой то. Уже месяц жуём.(

nik182
Offline
Зарегистрирован: 04.05.2015

Вы хоть поняли, о чём идет речь на английском? К чему нужно прикладывать это знание ? 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

alexbmd пишет:

Евгений, я не учю я дискутирую

Друг мой! Дискуссия уместна в философии, религии, искусстве. Можно устроить диспут о влиянии 9-й симфонии Антона Брукнера на творчество Пинк Флойд. То есть там, где равноправны альтернативные мнения.

Но категорически невозможны дискуссии по предметам, основанным на фактах. Невозможны диспуты о таблице умножения, или правилах Кирхгофа. Смешна дискуссия о месте гелия в периодической таблице. Или альтернативный взгляд на закон всемирного тяготения.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

alexbmd пишет:

Ворота, конкретно это код и не компилиться и даже если сделать чтоб компилился выводит четыре нуля тк содержит ошибки.... [зато хайпа сколько]

У всех компилируется и работает, кроме тебя. Похоже, либо на брехню, либо на то, что у тебя уж очень экзотический компилятор.

Озвучь, пожалуйста, в чём же ты её, родной, компилируешь? Версию IDE можешь назвать?

alexbmd пишет:

НО только голословничать не надо! в теме асм код упомянулся только раз и совершенно в другом аспекте. 

Не учи меня, что мне надо, а что не надо. Тебе не нравится ассемблерная вставка? Вот так вежливо и скажи.

Замени её на строку

digitalWrite(2, !digitalRead(2));

и всего делов. Работает точно также.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexbmd пишет:
1) еденицу вручную мы можем записать только через асемблер вставку.

Кто Вам сказал такую глупость? Вот кто? Вы несете бред, выделяете его болдом и всё это с таким апломбом, прости Господи. То, что Ворота использовал вставку, вовсе не значит, что это не пишется на С. Просто ему было так удобнее, да и требований по отсутствию вставок я не видел. Это запросто делается на С/С++ и он Вам уже написал как. 

Кстати, у меня его код нормально компилируется и работает. IDE 1.8.9

alexbmd пишет:
Евгений я не учю я дискутирую

С кем??? С dimax? А у Вас дискутилка точно выросла?

Разница в уровне такова, что Вам, если Вам кажется, что он сказал что-то не то, нужно вежливо спрашивать, "поясните тупому, что Вы имели в виду", а не дискутировать. Дискуссия между Вам и dimax просто смешна, поверьте.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

alexbmd пишет:

1) еденицу вручную мы можем записать только через асемблер вставку.

Нельзя, Green ещё в #81 написал про это, сколько можно мусолить?

А в #203 Ворота написал программу-шутку,  я чуть сам не купился. Флаг в итоге ставится, но не записью в EIFR :-)

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ну, вот, убил интригу!

Надеюсь, у тебя она, как у всех нормальных людей скомпилировалась и заработала :)

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Ворота, заработала. Пока не посмотрел что сидит по адресу 0x9 верил в чудеса святага ассемблера ;-)

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ну, дык, чо надо, то и сидит :))) Результат ведь "на табло" как говорится :)

nik182
Offline
Зарегистрирован: 04.05.2015

И что характерно в точности в соответствии с мануалом. 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

dimax пишет:

Ворота, заработала. Пока не посмотрел что сидит по адресу 0x9 верил в чудеса святага ассемблера ;-)

Димах! Да ладно?! ;)) То ж "грубый солдатский юмор"! ;))) (Ворота! Без обид!)

alexbmd
Offline
Зарегистрирован: 15.01.2016

Ворота, (что за манера общения фи)

насчёт компилируется, вы правы, в последней компилируется но работать конечно же не работает ведь нет ничего волшебного в 9. четыре нуля как выводило так и выводит.

кстати старый компилятор(иде) в этом плане лучше , хоть недавал такое издевательство как записать просто 9.

dimiax, я уже и забыл про комент Грина. но вон и nik182 стучал себя вгрудь что пишется но не показал. и ворота тоже :)

но да бог с ними как написал выше я, у меня получилось записать. можно виртуально симулировать срабатывание прерывания.

Евгений, можно пример на  С показать как пишется в EIFR единица? а то не вижу кто и что показал

dimax,  а насчёт race condition что скажите есть зерно правды в этом ? если нет то почему?

 

 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Вот ненадо мне приписывать твои измышления. В ручную  установить прямо бит в регистре невозможно. Только косвенно, как это изящно сдалал Ворота. Можно только обнулить путем записи единицы в бит. Например средствами Ардуино https://www.arduino.cc/reference/en/language/functions/bits-and-bytes/bitset/

Заметь, что битсет в данном случае срботает с точностью до наоборот - очистит бит. 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

alexbmd пишет:

dimax, а насчёт race condition что скажите есть зерно правды в этом ? если нет то почему?

Да, всё правильно написано.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

alexbmd пишет:
компилируется но работать конечно же не работает

У меня работает (выводит единицы, где надо). У dimax и ЕвгенийП - тоже работает. Похоже, что и у nik182 работает.  Не работает у тебя одного. Ты в консерватории чё-нить поправить не пробовал?

alexbmd пишет:
ничего волшебного в 9. .
А что там в 9? Твоя беда в том, что ты ничему не учишься, а только "дискутируешь". По адресу 9 есть самое то, что нужно, чтобы всё нормально работало и оно работает. Не нравится вставка, я тебе уже сказал, как сделать без неё.

Сдаётся мне, ты её вообще не запускал - ты не по части запустить, а больше "подискутировать".

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexbmd пишет:

Евгений, можно пример на  С показать как пишется в EIFR единица? а то не вижу кто и что показал

Вы ещё и постов не читаете? Смотрите #209, там написано.

Кстати, Вас уже спрашивали, чем Вы компилируете и на чём запускаете пример Ворот? Не работать на 328P он не может, а если у Вас не работает, значит Вы его либо компилируете чем-то экзотическим, либо запускаете на чём-то экзотическом. Или он прав, и Вы его вообще не запускали, а про "не работает" слегка "прибрехнули в порядке дискуссии"?

b707
Offline
Зарегистрирован: 26.05.2017

человек три года одни и те же вопросы задает... по-моему, это просто троль

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

да, тролль бы что-то новенькое придумал, а он одну и ту же воду в ступе толчёт.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ЕвгенийП пишет:

да, тролль бы что-то новенькое придумал, а он одну и ту же воду в ступе толчёт.

Методичка?

Beginer123
Offline
Зарегистрирован: 23.11.2018

Кмк, предложенный способ - это программно дернуть INT0, то есть отобрать пин из использования заради решения вопроса о внутреннем прерывании? То есть, из имеющихся ДВУХ внешних прерываний в УНО, НАНО занимаем 50% .. иного способа точно нет?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Beginer123 пишет:
иного способа точно нет?
Архатушка, ты пойди передохни, почеши ЧСВ репу, придумай способ и расскажи нам, ладно. 

Я-то один способ уже привёл, а тут приходишь ты и требуешь продолжения банкета - не жирно? Давай-ка сам потрудись, а мы посмеёмся у тебя поучимся.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

alexbmd пишет:
но работать конечно же не работает
Ну, чо, так и не заработало? Ну, ты уникум! Уже даже у, прости Господи, архата и то заработало! Нет, явно в консерватории что-то надо подправить!

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Beginer123 пишет:

Кмк, предложенный способ - это программно дернуть INT0, то есть отобрать пин из использования заради решения вопроса о внутреннем прерывании? То есть, из имеющихся ДВУХ внешних прерываний в УНО, НАНО занимаем 50% .. иного способа точно нет?

1. Это  цитата из ДШ:

The External Interrupts are triggered by the INT pins or any of the PCINT pins. Observe that, if enabled,
the interrupts will trigger even if the INT or PCINT pins are configured as outputs. This feature provides a
way of generating a software interrupt.

2. В Уно и Нано не два внешних прерывания, а на ВСЕХ ногах, в отличии от Меги.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

wdrakula, не пытайтесь учить Великого, бесполезно.

alexbmd
Offline
Зарегистрирован: 15.01.2016

о нашёл интересное и про рэйс кондишн и про ORинг

https://www.microchip.com/webdoc/AVRLibcReferenceManual/FAQ_1faq_intbits...

nik182 но ты же кричал что возможно и рубаху рвал

Ворота А что там в 9? то что ты хочешь у меня в PD0, но яж тебе другой вопрос задавал

ЕвгенийП а зачем мне пост 209 когда я вас просил код записи в EIFR а не PD2

b707
Offline
Зарегистрирован: 26.05.2017

alexbmd - что-то я уже нить потерял. Цель-то какая у вас? Чего добиться хотите?

nik182
Offline
Зарегистрирован: 04.05.2015

Кто ж виноват что у тебя мозги криво повернуты? Я аж два раза тебе написал, что можно только обнулить, записав единицу. Если писать ноль то ничего не произойдёт. Можешь как операцию NOP процессора использовать. Единицу для обнуления(!!!) можно записывать разными способами, я даже тебе мануал об этом за бесплатно перевёл. 

nik182
Offline
Зарегистрирован: 04.05.2015

alexbmd пишет:

.... А что там в 9? то что ты хочешь у меня в PD0... 

На третий день наблюдательный индеец Джо заметил что у камеры нет четвёртой стены... 

alexbmd
Offline
Зарегистрирован: 15.01.2016

Ни мануал ни код записи в eifr (а не сброс) мне никто не приводил, первый ворота попытался, но тоже солдатский юмор. Но идею я понял и как писал выше получилась запись ... правда там другая фигня произошла потом. Короче это вопрос уже не важен.

B707, цель - знания. Хотел для себя понять почему оринг не правильно для флагового регистра. Уже разобрался. (Лично для себя сделал вывод можно и через оринг. Но просто в этом никакого смысла а прямой сброс еще и быстрее. )
Просто тему надо читать не с последнего сообщения

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

alexbmd пишет:

Ворота А что там в 9? то что ты хочешь у меня в PD0, но яж тебе другой вопрос задавал

Я хочу, чтобы ты извинился за брехню о том, что мой код якобы не работает.

Beginer123
Offline
Зарегистрирован: 23.11.2018

wdrakula пишет:

Beginer123 пишет:

Кмк, предложенный способ - это программно дернуть INT0, то есть отобрать пин из использования заради решения вопроса о внутреннем прерывании? То есть, из имеющихся ДВУХ внешних прерываний в УНО, НАНО занимаем 50% .. иного способа точно нет?

1. Это  цитата из ДШ:

The External Interrupts are triggered by the INT pins or any of the PCINT pins. Observe that, if enabled,
the interrupts will trigger even if the INT or PCINT pins are configured as outputs. This feature provides a
way of generating a software interrupt.

2. В Уно и Нано не два внешних прерывания, а на ВСЕХ ногах, в отличии от Меги.

пасибки. Про PCINT в курсях, но за них речь не шла тут выше. Мне так вообще непонятно зачем ТС поднял старую тему, зачем ему понадобились программные прерывания (внутренние) - явно последний ТС захотел странного, и зачем понадобилось решать вопрос именно таким способом.

В общем дочитал тему понял что мне оно не надо. :)

А то, что оно у ТС не заработало - так это просто: у него же Леонарда, а там другие пины или нет? :)

alexbmd
Offline
Зарегистрирован: 15.01.2016

У меня он не работает. Рад что у тебя работает.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

alexbmd пишет:

ЕвгенийП ... я вас просил код записи в EIFR 

Код, который привёл Ворота записывает 1 в EIFR. Она там появляется и спокойно читается. 

Да, это делается косвенно. Как говорил Козьма Петрович: "Щёлкни кобылу в нос, она вильнёт ховстом". Но единица же туда записывается! Так какого рожна Вам ещё надо?

Вообще, мне почему-то кажется, что Вам уже ВСЁ объяснили, ВСЁ показали. К чему Вы продолжаете этот бессмысленный балаган. Чего добиваетесь-то?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

alexbmd пишет:
У меня он не работает.
Значит, ты действительно уникум. Бывают такие парни, которым даже вокзальные не дают :(

Beginer123
Offline
Зарегистрирован: 23.11.2018

alexbmd пишет:
Ни мануал ни код записи в eifr (а не сброс) мне никто не приводил, первый ворота попытался, но тоже солдатский юмор. Но идею я понял и как писал выше получилась запись ... правда там другая фигня произошла потом. Короче это вопрос уже не важен. B707, цель - знания. Хотел для себя понять почему оринг не правильно для флагового регистра. Уже разобрался. (Лично для себя сделал вывод можно и через оринг. Но просто в этом никакого смысла а прямой сброс еще и быстрее. ) Просто тему надо читать не с последнего сообщения

alexbmd, насколько читал мануал на Мега2560, там все сделано так, что можно программно включить пин И прочитать его значение, а также можно включить альтернативную функцию пина И снова прочитать результат, а также (цитата выше мне) можно получить и прерывание по пину. Как рассказывал Архат, это сделано в т.ч. и для целей программного тестирования микроконтроллера и у него есть такой тест для Мега2560 в т.ч. и для проверки всего флеша на чтение/запись.

То что сделал Ворота - он просто программно взвел флаг для ноги INT0 через ассемблерный digitalWrite(), если не напутал чего. У вас на Леонардо, скорее всего этот INT0 сидит на иной ноге, поэтому и не работает.

alexbmd
Offline
Зарегистрирован: 15.01.2016

Да я знаю что сделал ворота. Только он не удосужился почитать тему как другие. Знал бы тогда что оно у меня впринципе не заработает. Но за идею его спасибо я уже сказал. Помогла записать не косвенно а прямо.
Все Евгений я умолкаю. По данной теме мне большое нечего спросить :)

Green
Offline
Зарегистрирован: 01.10.2015

alexbmd пишет:
По данной теме мне большое нечего спросить :)
Отчего то ассоциация "прекратите мне сказать!". И вообще, я где то спрашивал, вы не из md домена часом? Тогда вопросов больше нет.(