|
|
  |
Хочется программно инициировать прерывание, Но не 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, 11:58
|
Местный
  
Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782

|
Цитата(Rst7 @ May 20 2008, 15:52)  Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем? Самый простой способ - использовать 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. Т.е. переключить туда-сюда "по фронту/по спаду". На идею натолкнула фраза в даташите. К сожалению, сейчас негде попробовать этот чит. Посему пара вопросов: 1. Может кто делал такое и уже знает результат? 2. Может у кого есть под рукой макеточка, проверить бы? 3. А может кто гламурнее способ знает? А почему хочется именно пограммное прерывание, почему нелзя обычный вызов обработчика.
|
|
|
|
|
May 20 2008, 12:16
|

Местный
  
Группа: Участник
Сообщений: 355
Регистрация: 27-03-07
Из: Україна, Чуднів
Пользователь №: 26 530

|
Цитата(Rst7 @ May 20 2008, 14:52)  Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем? Не знаю для чего Вам это нужно, но если строить програму на прерываниях то основной код я обычно пишу в следующем прерывании Код USART_UDRE_vect /* USART, Data Register Empty */ а оно возникает когда пустой регистр данных передатчика УСАП
--------------------
нельзя недооценивать предсказуемость глупости
|
|
|
|
|
May 20 2008, 12:25
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Rst7 @ May 20 2008, 15:52)  Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем? 3. А может кто гламурнее способ знает? А использование прерывания от EEPROM не будет гламурным способом? 1. Думаю, что его никто не использует. По крайней мере я - ни разу. 2. Разрешается одной командой sbi EECR,EERIE. 3. Генерируется всё время пока EEWE сброшен (EEPROM не пишется).
|
|
|
|
|
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, 12:44
|

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

|
Цитата(Rst7 @ May 20 2008, 14:52)  Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем?... Но, к сожалению, INT0 и INT1 заняты, надо изобретать что-то другое. ИМХО, в начале нужно определиться - какие ресурсы у Вас свободны? В зависимости от используемого МК можно, наверное, использовать INT0-INT7 EEPROM Ready USART0 Data Register Empty USART1 Data Register Empty SPM Ready Возможно, не обязательно дрыгать ногой для вызова INTx. Может быть "подрыгать" режимом - аналогично компаратору. Такая же мысль и мне приходила в голову, но не проверял...
|
|
|
|
|
May 20 2008, 12:52
|

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

|
Цитата Как раз от компаратора в scmRTOS и используют Ага, прерыванием от компаратора и пользуются. Щас посмотрел в сорсы. Только raise делается ногодрыгом. А у меня эти лапы заняты. Цитата INT0-INT7 Всего 2, оба заняты Цитата EEPROM Ready USART0 Data Register Empty USART1 Data Register Empty SPM Ready Все не годятся, причину объяснил выше.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
May 20 2008, 13:01
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(Rst7 @ May 20 2008, 16:52)  Только raise делается ногодрыгом. А у меня эти лапы заняты. А какие ноги свободные ? (если есть конечно) и что из переферии не задействованно ? и какой чип ?
|
|
|
|
|
May 20 2008, 13:01
|
Местный
  
Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064

|
Цитата(Rst7 @ May 20 2008, 15:52)  Ага, прерыванием от компаратора и пользуются. Щас посмотрел в сорсы. Только raise делается ногодрыгом. А у меня эти лапы заняты. Всего 2, оба заняты
Все не годятся, причину объяснил выше. Код ICR ?
|
|
|
|
|
May 20 2008, 13:03
|

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

|
Цитата Если, память не используете, Использую. Кроме того, "The EEPROM Ready interrupt generates a constant interrupt when EEPE is cleared." Т.е. пока EEPE очищен, прерывание генерируется. А мне так не годится. Мне нужно флаг установить, а сбросится он при выполнении процедуры прерывания.
--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|