Господа, помогите разобраться с багом.
Существует ли взаимосвязь между режимом работы ног OC1A/OC1B и нулевого таймера
Ситуация:
ATmega32 Системные часы 4МГц.
Нулевой таймер:
TCCR0=0x79;
TCNT0=0x00;
OCR0=0x5F;
Т.е. fast PWM, единицу на выход когда compare match. считаем на частоте ядра.
На переполнение висит обработчик прерывания, которых раз в 32, в 64, в 128 и в 256 раза поднимает соответствующие флажки.
Для дела интересен только последний, на остальных пока ничего не висит.
Итак, у нас есть флажок, который по таймеру 0 при помощи прерывания TIMER0_OVF_vect взводится около 60 раз в секунду.
На нём висит перерисовка интерфейса и почти вся логика.
Таймер 1:
TCCR1A=0xA2;
TCCR1B=0x1B;
ICR1H=0xF4;
ICR1L=0x24;
Т.е.:
CS1 = 011 ( clk/64 ) 62,5 kHz
WGM1 = 1110 (режим №14, Fast PWM переполнение в ICR1)
COM1A = 10, COM1B = 10 ( Т.е. на соответствующей ноге после переполнения единица, по достижению OCR1A/B - ноль )
В ICR1 пишем 62500, чтоб таймер1 переполнялся раз в секунду. По переполнению инкрементим системные часы и прочее.
Собственно всё работает, но не стабилно, Пока не таймер 1 не достигает OCR1A/B всё весело обновляется и отрисовуется, по достижению OCR1 система замирает.
Выглядит это глупо, пока светодиодик горит, экран обновляется, гаснет, экран не рисуется. Дело не в подключении экрана, система перестаёт реагировать на изменения напряжений на ADC которые отвабатываются в том же месте где и отрасовка.
Грубо говоря выглядит это так, как будто После Compare Match в первом таймере перестаёт вызываться TIMER0_OVF_vect, а после TIMER1_OVF всё возобновляется.
Веселее всего то, что я этого не замечал, до тех пор, пока не переставил режим ножки OC1B в Normal port operation и увидел что интерфейс не обновляется вообще.
Внимание, вопрос: Какого лешего.
В догонку.
TIMSK=0x05