реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Хочется программно инициировать прерывание, Но не INT0/INT1, как бы погламурнее
Rst7
сообщение May 20 2008, 11:52
Сообщение #1


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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. А может кто гламурнее способ знает?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 20 2008, 11:58
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Rst7 @ May 20 2008, 19:52) *
Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем?
в scmRTOS, по моему, что то подобное реализовано именно для программных прерываний.


--------------------
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение May 20 2008, 11:58
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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. А может кто гламурнее способ знает?


А почему хочется именно пограммное прерывание, почему нелзя обычный вызов обработчика.
Go to the top of the page
 
+Quote Post
prottoss
сообщение May 20 2008, 12:01
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(Rst7 @ May 20 2008, 19:52) *
,Вот мысль появилась использовать прерывание от компаратора
Как раз от компаратора в scmRTOS и используют, но вроде как внешне что то к выводу компаратора припаивать надо... Лучше обратиться к первоисточнику. К сожалению адреса не знаю - но по моему в форуме про RTOS тема травой не заростает.


--------------------
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 20 2008, 12:12
Сообщение #5


Йа моск ;)
******

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



Цитата
А почему хочется именно пограммное прерывание, почему нелзя обычный вызов обработчика.


Потому что на момент установки флагов это прерывание обычно запрещено (хотя может быть и не запрещено, в этом случае будет вызвано сразу). А разрешается совсем в другом месте, и если оно отложено, то после разрешения оно выполнится.

Как бы так объяснить, нафиг это надо... Ну типа эмуляция прерываний с приоритетом...


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
sKWO
сообщение May 20 2008, 12:16
Сообщение #6


Местный
***

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



Цитата(Rst7 @ May 20 2008, 14:52) *
Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем?

Не знаю для чего Вам это нужно, но если строить програму на прерываниях то основной код я обычно пишу в следующем прерывании
Код
USART_UDRE_vect   /* USART, Data Register Empty */

а оно возникает когда пустой регистр данных передатчика УСАП


--------------------
нельзя недооценивать предсказуемость глупости
Go to the top of the page
 
+Quote Post
galjoen
сообщение May 20 2008, 12:25
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640



Цитата(Rst7 @ May 20 2008, 15:52) *
Тут задача возникла следующего характера. Как бы инициировать прерывание программным путем?
3. А может кто гламурнее способ знает?

А использование прерывания от EEPROM не будет гламурным способом?
1. Думаю, что его никто не использует. По крайней мере я - ни разу.
2. Разрешается одной командой sbi EECR,EERIE.
3. Генерируется всё время пока EEWE сброшен (EEPROM не пишется).
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 20 2008, 12:34
Сообщение #8


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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();
}


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 20 2008, 12:44
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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. Может быть "подрыгать" режимом - аналогично компаратору. Такая же мысль и мне приходила в голову, но не проверял...
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 20 2008, 12:52
Сообщение #10


Йа моск ;)
******

Группа: Модераторы
Сообщений: 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

Все не годятся, причину объяснил выше.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 20 2008, 13:01
Сообщение #11


Гуру
******

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



Не понятно, чем Вам не угодило прерывание от EEPROM. Если, память не используете, то "ручками" делаете чтение, и получаете прерывание. Не чуть не хуже дрыгания ногой для получения INTx.

Так какие ресурсы у Вас свободны? Как вариант - использование прерывания от свободного таймера. Настроить его на работу без прескалера с генерацией прерывания по одному тику. Разрешили прерывание - получили прерывание.
Go to the top of the page
 
+Quote Post
singlskv
сообщение May 20 2008, 13:01
Сообщение #12


дятел
*****

Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065



Цитата(Rst7 @ May 20 2008, 16:52) *
Только raise делается ногодрыгом. А у меня эти лапы заняты.
А какие ноги свободные ? (если есть конечно)
и что из переферии не задействованно ?
и какой чип ?
Go to the top of the page
 
+Quote Post
andrvisht
сообщение May 20 2008, 13:01
Сообщение #13


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



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

Все не годятся, причину объяснил выше.

Код
ICR ?
Go to the top of the page
 
+Quote Post
Rst7
сообщение May 20 2008, 13:03
Сообщение #14


Йа моск ;)
******

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



Цитата
Если, память не используете,

Использую.

Кроме того, "The EEPROM Ready interrupt generates a constant interrupt
when EEPE is cleared."

Т.е. пока EEPE очищен, прерывание генерируется. А мне так не годится. Мне нужно флаг установить, а сбросится он при выполнении процедуры прерывания.


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Палыч
сообщение May 20 2008, 13:09
Сообщение #15


Гуру
******

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



Цитата(Rst7 @ May 20 2008, 16:03) *
Мне нужно флаг установить, а сбросится он при выполнении процедуры прерывания.
Руками сбросить в процедуре обработки прерывания - религия не позволяет?

Какой у Вас контроллер и какие ресурсы свободны?
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01481 секунд с 7
ELECTRONIX ©2004-2016