|
Хочется программно инициировать прерывание, Но не INT0/INT1, как бы погламурнее |
|
|
|
May 20 2008, 11:52
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем? Самый простой способ - использовать INT0, например, и сконфигурировать прерывание по изменению состояния ноги (нога на вывод), в результате - достаточно шевельнуть ножкой (изменив ее, скажем OUT'ом в PINx) и флаг прерывания установится; соответственно, когда будет разрешено прерывание INT0 - оно и произойдет. Но, к сожалению, INT0 и INT1 заняты, надо изобретать что-то другое. Вот мысль появилась использовать прерывание от компаратора, причем следующим образом: Компаратор штатно выключен (он не нужен в проекте), для установки флага прерывания от него использовать последовательность Код ACSR=(1<<ACD)|(1<<ACIS1)|(1<<ACIS0); //Comparator Interrupt on Rising Output Edge. ACSR=(1<<ACD)|(1<<ACIS1); //Comparator Interrupt on Falling Output Edge. Т.е. переключить туда-сюда "по фронту/по спаду". На идею натолкнула фраза Цитата When changing the ACIS1/ACIS0 bits, the Analog Comparator Interrupt must be disabled by clearing its Interrupt Enable bit in the ACSR Register. Otherwise an interrupt can occur when the bits are changed. в даташите. К сожалению, сейчас негде попробовать этот чит. Посему пара вопросов: 1. Может кто делал такое и уже знает результат? 2. Может у кого есть под рукой макеточка, проверить бы? 3. А может кто гламурнее способ знает?
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
 |
Ответов
|
May 20 2008, 12:34
|

Йа моск ;)
     
Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610

|
Цитата а оно возникает когда пустой регистр данных передатчика УСАП Занято, и кроме того, как и следующий вариант Цитата А использование прерывания от EEPROM не будет гламурным способом? не годится. Мне не нужно прерывание, запрос которого сам по себе устанавливается, мне нужно его запрос руками (программно) поднять только в нужный мне момент времени. Т.е. из более приоритетного прерывания запустить менее приоритетное после окончания обработки более приоритетного. Ну нечто такое: Код __interrupt void slow_irq(void) { DISABLE_SLOW_IRQ(); SLOW_IRQ_LOCK=1; __enable_interrupt(); .... ....много всякой долгой каки... .... __disable_interrupt(); SLOW_IRQ_LOCK=0; ENABLE_SLOW_IRQ(); }
__interrupt void fast_irq(void) { DISABLE_SLOW_IRQ(); __enable_interrupt(); .... .... .... if (....) SET_SLOW_IRQ(); .... .... __disable_interrupt(); if (!SLOW_IRQ_LOCK) ENABLE_SLOW_IRQ(); }
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 20 2008, 13:39
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Rst7 @ May 20 2008, 16:34)  Мне не нужно прерывание, запрос которого сам по себе устанавливается, мне нужно его запрос руками (программно) поднять только в нужный мне момент времени. Т.е. из более приоритетного прерывания запустить менее приоритетное после окончания обработки более приоритетного. Так вроде с готовностью EEPROM всё хорошо получается. Только ещё флаг в ОЗУ нужно завести, а м.б. счётчик (от задачи зависит). В обработчике __interrupt void fast_irq(void) вместо if (....) SET_SLOW_IRQ(); пишите if (....) Счётчик++;, а в конце вместо if (!SLOW_IRQ_LOCK) ENABLE_SLOW_IRQ(); пишите if (!Счётчик) ENABLE_SLOW_IRQ();. А в обработчике __interrupt void slow_irq(void) в начале DISABLE_SLOW_IRQ() (==cbi EECR,EERIE), а в конце делаете Счётчик--; и ещё раз if (!Счётчик) ENABLE_SLOW_IRQ(); Ещё могу рекомендовать более экзотический способ: использования совпадений у таймеров/счётчиков. Там при обработке флаг прерывания сам сбрасывается. 2 Палыч Чтобы прерывание от EEPROM возникло никакого чтения EEPROM делать не нужно. Оно сразу возникнет - после его разрешения (если в этот момент EEPROM не пишется/читается).
|
|
|
|
|
May 20 2008, 14:14
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(galjoen @ May 20 2008, 16:39)  Чтобы прерывание от EEPROM возникло никакого чтения EEPROM делать не нужно. Оно сразу возникнет - после его разрешения (если в этот момент EEPROM не пишется/читается). Да, конечно! Это результат спешки... Вместо "делаете чтение" - "разрешаете прерывание"... Счетчик предлагаете завести для подсчета числа разрешений прерывания? 2 Rst7 Почему запрещать прерывания - не годиться? Это равнозначно сбросу флага. Желаете иметь два "рычага" управления: разрешение прерывания и флаг? Ну, и аппетиты у Вас... Так, что из ресурсов свободно? Цитата(prottoss @ May 20 2008, 16:53)  Можно пойти таким путем - в конце более приоритетного прерывания закидывать в стек возврата адрес менее приоритетного прерывания. Правда, надо будет вставочку на асме соорудить, и после вставочки не должно буть, естественно, ни каких вызовов. Тагда уж и закидывание в стек адреса - не нужно: в конце процедуры обработки прерывания сделать вызов процедуры обработки другого прерывания. Но, автору вопроса понадобилось зачем-то настоящее прерывание Цитата(Rst7 @ May 20 2008, 16:49)  Тут следующий момент: счетчики надо инкрементировать/декрементировать с запрещенными прерываниями. Да еще и сохранять регистр SREG. К сожалению, это занимает слишком много времени, у меня тут жестко все... Из-за этого - весь сыр-бор? Но, ведь запретить/разрешить прерывания - гораздо быстрее, чем вход/выход в/из прерывания...
|
|
|
|
Сообщений в этой теме
Rst7 Хочется программно инициировать прерывание May 20 2008, 11:52 prottoss Цитата(Rst7 @ May 20 2008, 19:52) Тут зад... May 20 2008, 11:58 VladimirYU Цитата(Rst7 @ May 20 2008, 15:52) Тут зад... May 20 2008, 11:58 prottoss Цитата(Rst7 @ May 20 2008, 19:52) ,Вот мы... May 20 2008, 12:01 ReAl Цитата(prottoss @ May 20 2008, 15:01) Как... May 20 2008, 20:31 Rst7 ЦитатаА почему хочется именно пограммное прерывани... May 20 2008, 12:12 sKWO Цитата(Rst7 @ May 20 2008, 14:52) Тут зад... May 20 2008, 12:16 galjoen Цитата(Rst7 @ May 20 2008, 15:52) Тут зад... May 20 2008, 12:25 Палыч Не понятно, чем Вам не угодило прерывание от EEPRO... May 20 2008, 13:01 prottoss Цитата(Rst7 @ May 20 2008, 20:34) Мне не ... May 20 2008, 13:53 Палыч Цитата(Rst7 @ May 20 2008, 14:52) Тут зад... May 20 2008, 12:44 Rst7 ЦитатаКак раз от компаратора в scmRTOS и использую... May 20 2008, 12:52 singlskv Цитата(Rst7 @ May 20 2008, 16:52) Только ... May 20 2008, 13:01 &-rey Цитата(Rst7 @ May 20 2008, 15:52) Ага, пр... May 20 2008, 13:01 defunct Цитата(Rst7 @ May 20 2008, 15:52) Все не ... May 20 2008, 15:03 Rst7 ЦитатаЕсли, память не используете,
Использую.
Кро... May 20 2008, 13:03 Палыч Цитата(Rst7 @ May 20 2008, 16:03) Мне нуж... May 20 2008, 13:09 Rst7 ЦитатаРазрешили прерывание - получили прерывание.
... May 20 2008, 13:15 &-rey так и не понял, нога которая ICP используется ? May 20 2008, 13:16 Rst7 ЦитатаICP используется ?
Занята. Да и дрыгать нож... May 20 2008, 13:24 ILYAUL Цитата(Rst7 @ May 20 2008, 15:52) Тут зад... May 20 2008, 13:31 Rst7 ЦитатаТак вроде с готовностью EEPROM всё хорошо по... May 20 2008, 13:49 galjoen Цитата(Rst7 @ May 20 2008, 17:49) К сожал... May 20 2008, 14:16 defunct Цитата(Rst7 @ May 20 2008, 16:49) Сбрасыв... May 20 2008, 15:11 =GM= Цитата(Rst7 @ May 20 2008, 10:52) Тут зад... May 20 2008, 14:59 SasaVitebsk Я использую от таймера. У меня мега640 - там этих ... May 20 2008, 15:05 SasaVitebsk 2 GM - ты немного задачу не осознал.
Например ... May 20 2008, 15:11 defunct Цитата(SasaVitebsk @ May 20 2008, 18:11) ... May 20 2008, 15:16  galjoen Цитата(defunct @ May 20 2008, 19:16) Не, ... May 20 2008, 15:51   Палыч Цитата(galjoen @ May 20 2008, 18:51) Т.е.... May 20 2008, 16:08    galjoen Цитата(Палыч @ May 20 2008, 20:08) Приори... May 20 2008, 16:52   defunct Цитата(galjoen @ May 20 2008, 18:51) Не. ... May 20 2008, 20:56    singlskv Цитата(defunct @ May 21 2008, 00:56) Насч... May 20 2008, 21:16     defunct Цитата(singlskv @ May 21 2008, 00:11) Ну ... May 20 2008, 21:19      singlskv Цитата(defunct @ May 21 2008, 01:19) Неск... May 20 2008, 21:35       defunct Цитата(singlskv @ May 21 2008, 00:35) Те ... May 20 2008, 23:30        Dog Pawlowa Цитата(defunct @ May 21 2008, 02:30) Ну т... May 21 2008, 05:44      galjoen Цитата(defunct @ May 21 2008, 01:19) Неск... May 20 2008, 21:59 Палыч Цитата(SasaVitebsk @ May 20 2008, 18:11) ... May 20 2008, 15:19  SasaVitebsk Цитата(Палыч @ May 20 2008, 18:19) Почему... May 20 2008, 15:35   Палыч Цитата(SasaVitebsk @ May 20 2008, 18:35) ... May 20 2008, 15:41 _Pasha Привет, телепаты
1. Какая у Вас мега в проекте?
... May 20 2008, 16:04 SasaVitebsk Вот уж не знаю как вам объяснить.
Ещё раз... May 20 2008, 16:12 Палыч Цитата(SasaVitebsk @ May 20 2008, 19:12) ... May 20 2008, 16:34 Rst7 Давайте я попробую все-таки подробностей добавить.... May 20 2008, 16:29 singlskv Не знаю точно поможет ли это Вам в конкретной зада... May 20 2008, 18:19 singlskv Если свободен пин nSS(SPI SlaveSelect) я бы еще по... May 20 2008, 20:50 ReAl Кстати, я очень обижен на атмел в том, что битики ... May 20 2008, 21:03 Дон Амброзио У меня для "быстрых" потоков, которые до... May 21 2008, 05:13 Rst7 Ну вообщем, проверил на железе - не приводит к уст... May 21 2008, 05:48 galjoen Цитата(Rst7 @ May 21 2008, 09:48) Код#pra... May 21 2008, 06:58 sKWO Цитата(Rst7 @ May 21 2008, 08:48) В принц... May 21 2008, 08:21 SasaVitebsk В принципе предложений накидали. Обсуждать подх... May 21 2008, 07:15 Dog Pawlowa Цитата(SasaVitebsk @ May 21 2008, 10:15) ... May 21 2008, 07:23 Rst7 ЦитатаЗато прерывания от таймера вообще возникать ... May 21 2008, 07:37 galjoen М.б. конечно я уже надоел своим занудством, но...
... May 21 2008, 09:30 Rst7 ЦитатаМне вот это всё не нравится (некрасивым каже... May 21 2008, 09:38
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|