Господа, помогите разобраться с багом. Существует ли взаимосвязь между режимом работы ног 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
|