Что это такое и зачем оно нужно, я знаю. А кто может объяснить все тонкости этого процесса, какие приоритеты исполнения они имеют, что делается, если код в первом прерывании не выполнился,а второе прерывание в этот момент наступило, что можно делать в прерываниях, что нельзя? Вот к примеру , делал часы/вольтметр на тини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);
}
в основной процедуре, то все отлично пашет. Тоисть лучше весь основной код исполнять из в основного тела программы, а в прерываниях менять только значения переменных и исполнять короткие действия ???