| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Прерывания АVR, Code vision https://radiokot.ru/forum/viewtopic.php?f=57&t=81368 |
Страница 1 из 1 |
| Автор: | mich91 [ Ср ноя 28, 2012 18:51:47 ] |
| Заголовок сообщения: | Прерывания АVR, Code vision |
Что это такое и зачем оно нужно, я знаю. А кто может объяснить все тонкости этого процесса, какие приоритеты исполнения они имеют, что делается, если код в первом прерывании не выполнился,а второе прерывание в этот момент наступило, что можно делать в прерываниях, что нельзя? Вот к примеру , делал часы/вольтметр на тини26,4 7SEG LED дисплее, при частоте 32768гц. Так вот , таймер 1, настроен на прерывание с частотой в 1 Гц, в этом прерывании есть переменная СЕК, которая постоянно инкрементируется. Во 0 таймере, частота прерывания равна 256 Гц и он отвечает за динамическую индикацию Код: char numbers[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x18,0x7F,~0x1C,0x3F,0x2B,0x9,0x2F}; . Вот в этой процедуре реализован вольт метр void show(void) { if(ON) { PORTA=0x7F; PORTB=(1<<d)|(1<<6); TCCR0=0x01; PORTA=numbers[digit[d]]; d++ ; if(d>3)d=0; } else { TCCR0=0x00; PORTB=0xF0; } } Код: void voltage(void) { char t; volt=read_adc(6)*150/255; t=volt-100; digit[0]=volt/100; digit[1]=t/10; digit[2]=t%10; digit[3]=11; } и если ее вызывать из под прерывания первого счетчика, тоисть 1 раз в секунду, то в этот момент мерцает экран, а если на писать вот так Код: while(1) в основной процедуре, то все отлично пашет. Тоисть лучше весь основной код исполнять из в основного тела программы, а в прерываниях менять только значения переменных и исполнять короткие действия ???
{ voltage(); delay_ms(1000); } |
|
| Автор: | Enigm [ Ср ноя 28, 2012 18:57:14 ] |
| Заголовок сообщения: | Re: Прерывания АVR, Code vision |
Пока не завершится одно из прерываний, другое не сработает. |
|
| Автор: | ibiza11 [ Ср ноя 28, 2012 19:11:58 ] |
| Заголовок сообщения: | Re: Прерывания АVR, Code vision |
Enigm писал(а): Пока не завершится одно из прерываний, другое не сработает. если его не разрешить!ТС, Вы вообще разобрались почему у Вас начинает все мерцать? |
|
| Автор: | mich91 [ Ср ноя 28, 2012 20:08:37 ] |
| Заголовок сообщения: | Re: Прерывания АVR, Code vision |
Я думаю что преобразование АЦП занимало много времени, и прерывание на отображение дин индикации не срабатовало . А как можно разрешить исполнение другого прерывания ? |
|
| Автор: | ibiza11 [ Чт ноя 29, 2012 09:27:59 ] |
| Заголовок сообщения: | Re: Прерывания АVR, Code vision |
mich91 писал(а): Я думаю что преобразование АЦП занимало много времени, и прерывание на отображение дин индикации не срабатовало Все верно. В прерываниях все должно происходить быстро. Никаких задержек. Никаких float и double и никакого деления/умножения (по крайней мере на AVR). В прерывании выставляется флаг, что оно произошло и действий по минимуму, требующих безотлагательной обработки. В основном цикле - проверка всех флагов и обработка всех задач не требовательных ко времени реакции (как например Ваше разделение числа на цифры и вывод в промежуточный буфер индикатора)mich91 писал(а): А как можно разрешить исполнение другого прерывания ? Выставляете флаг I глобальных прерываний. В Си это делается так: sei() или __interrupt_enable() (последнее для IAR)
|
|
| Автор: | mark13121971 [ Чт ноя 29, 2012 13:30:47 ] |
| Заголовок сообщения: | Re: Прерывания АVR, Code vision |
mich91 писал(а): Я думаю что преобразование АЦП занимало много времени, и прерывание на отображение дин индикации не срабатовало . А как можно разрешить исполнение другого прерывания ? Никак. Пока не отработало одно прерывание другое установит флаг, но обработчик будет вызван только по завершении предыдущего. Просто адрес нового прерывания помещается в стек адресов. P.S. Чем меньше в программе прерываний тем лучше, тем стабильнее и понятнее работает программа. Это закон. |
|
| Автор: | ibiza11 [ Чт ноя 29, 2012 13:52:09 ] |
| Заголовок сообщения: | Re: Прерывания АVR, Code vision |
mark13121971 писал(а): Никак. Пока не отработало одно прерывание другое установит флаг, но обработчик будет вызван только по завершении предыдущего. Просто адрес нового прерывания помещается в стек адресов. Откуда такие познания? Вы хотя бы слышали про вложенные прерывания?mark13121971 писал(а): P.S. Чем меньше в программе прерываний тем лучше, тем стабильнее и понятнее работает программа. Это закон. Прошу пруфлинк на закон.
|
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


