Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: взаимосвязь между режимом работы ног OC1A/OC1B и нулевого таймера
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Vlad Adamenko
Господа, помогите разобраться с багом.
Существует ли взаимосвязь между режимом работы ног 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
IGK
Цитата(Vlad Adamenko @ Jul 26 2009, 20:36) *
В догонку.
TIMSK=0x05


Так, после первого прочтения. А почему прерывание TOIE1? должно быть TICIE1, раз уж пользуете ICR. Т.е. TIMSK=0x21.

Попробуйте, я в таком же режиме 1-й таймер гоняю.
В даташите рис.45 на 98 странице и текст соответственно.

Кстати, плохо писать 0х21 - глазам не зацепиться за ошибку. Лучше (1<<TICIE1)|(1<TOIE0). Здесь об этом писали. Давно, правда...
Vlad Adamenko
TICIE1 Input Capture Interrupt Enable: Это несколько не то. Мне нужно именно прерывание по переполнению, а это: TOIE1 - Overflow Interrupt Enable
Кстати, на 45-ой странице таблица векторов прерываний.
А метод обьявления флагов интересный. Надо попробовать взять на вооружение.

В любом случае, я уже разобрался.

Господа, всем спасибо. Полез проверять всё под ряд на предмет помех. Больно нестабилный баг получался.
Ноги INT0 и INT1 висели в воздухе, а прерывания разрешены. А поскольку макетная плата и всё на проводках, то на эти ноги попросту наводило. Они разведены в схеме, но на макете забил я на них забил, а код не поправил.

Вобшем, ложная тревога.
IGK
Цитата(Vlad Adamenko @ Jul 27 2009, 00:24) *
Кстати, на 45-ой странице таблица векторов прерываний.


Страница 98, рисунок 45.

Цитата(Vlad Adamenko @ Jul 27 2009, 00:24) *
А метод обьявления флагов интересный. Надо попробовать взять на вооружение.


Вот видите, я понял, что режим СТС, пока складывал в уме эти 1-2-4-8.
А для него TOP=ICR1...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.