Цитата
что посоветуете ?
Для начала взять IAR или Гнусь.
После чего уяснить, что
а) Не стоит вызывать в прерывании другие фунцкии (это я про st_T0(), лучше ее написать прямо по месту или заинлайнить);
б) Произвести выпрямление рук и мозгов в части понимания разницы между локальными и глобальными переменными (особенно, когда глобальные переменные еще и volatile), я про дикий набор "OCR2A+=..."
Рекомендую оформить код вот так
Код
#pragma interrupt_handler timer2_compa_isr:8
void timer2_compa_isr(void){
unsigned char ocr=OCR2A;
ocr+=16;idle=1;
if(bit==10){/*
if(bit==2){ocr+=H1;if(START==0){TCCR0A=0x42;st_T0();TCCR0B=0x01;}idle=1;}
if(bit==3){ocr+=(12-H1);TCCR0A=0xc0;TCCR0B=0x80;st_T0();bit=0;idle=1;}
if(bit==6){ocr+=14;PCIFR=7;PCICR=2;PCMSK1=2;bit=0;idle=1;}*/
}
OCR2A=ocr;
}
И на посошок - посматривайте в листинг, который генерит компилятор, будет сразу понятно, где самая большая дупа.
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин