mega128 мультипрерывание по Т1

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Аватара пользователя
Сообщения: 13
Зарегистрирован: Вт авг 03, 2010 15:13:33
Откуда: РБ г.Бобруйск

Сообщение frolikum »

Задача казалась простой - до моделирования в Proteuse.
1. Таймер Т1 сконфигурировать на тактирование от внешнего сигнала (нога Т1) и подать на него выход таймера Т0
2. Режим таймера Phase and Frequency Correct PWM (№8 в таблице режимов) с вершиной счёта до значения ICR1 (0x00FF)
3. Вызов прерывания при TCNT1=0x0000 и выполнение обработчика
4. Вызов прерывания при TCNT1=ICR1 и выполнение обработчика
В книге А. В. Евстифеева «Микроконтроллеры AVR семейств Tiny и Mega фирмы ATMEL 5 е издание» на стр.298 говорится:
«Как и в остальных режимах, при работе с какими либо фиксированными значениями модуля счета, для задания его рекомендуется использовать регистр захвата. При этом регистр OCR1A (OCR3A) может использоваться для формирования ШИМ сигнала. Если же в процессе формирования ШИМ сигнала его частота меняется очень часто, для задания модуля счета рекомендуется использовать регистр сравнения. При достижении счетчиком максимального значения происходит смена направления счета, но счетчик остается в этом состоянии в течение одного периода сигнала clkT1 (clkT3). В этом же такте устанавливается флаг ICF1 либо OCF1A (зависит от того, какой из регистров используется для задания модуля счета). При достижении счетчиком минимального значения ($0000) направление счета опять изменяется. При этом устанавливается флаг прерывания TOV1 (TOV3) регистра TIFR (ETIFR) и производится обновление содержимого регистра сравнения.»
По логике вещей при вот такой настройке Т1 (TIMSK=0b00100100 ETIMSK=0x00) я должен получить 2 прерывания за цикл счёта Т1:
1-ое при TCNT1=0x0000 и 2-ое при TCNT1=0x00FF.
Но они происходят последовательно при TCNT1=0x0000 сначала прерывание по ICF (ЗАХВАТУ) т.е. как будто бы сейчас 0x00FF, а потом по TOV1 0x0000.

Кому интересно поковырятся милости прошу.
Вложения
Снимок-12.jpg
А вот последовательность событий в узле Т1 из отладчика в PROTEUS
(68.17 КБ) 358 скачиваний
Ошибок не делает тот, кто ничего не делает!
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

И где же тут " поковырятся"?
Ни файла протеуса, ни кода глючного.

Вообще, насколько я заметил, у вас кроется небольшая ошибка в логической цепочке размышлений.
Режим таймера Phase and Frequency Correct PWM (№8 в таблице режимов) с вершиной счёта до значения ICR1 (0x00FF)
1-ое при TCNT1=0x0000 и 2-ое при TCNT1=0x00FF.
Если вершина счета 0x00FF, то выставляется почти мгновенно два флага один - флаг совпадения с регистром сравнения, второй по очистке счетчика ведь до верха уже дошли! и происходит сброс счетчика.
Далее наблюдается следующее- смотрим по таблице прерываний у которого больше приоритет, тот выполняется первым, после его выполнения опять проверяется регистр флагов и таблица прерываний.
Контактная информация:
Реклама
Родился
Аватара пользователя
Сообщения: 13
Зарегистрирован: Вт авг 03, 2010 15:13:33
Откуда: РБ г.Бобруйск

Сообщение frolikum »

Спасибо за оказанное внимание к моим изысканиям.
Только я не просил поковыряться в моих потрохах. У меня проблема не в коде, так как его просто нет, а в настройке таймера на два прерывания за цикл счёта. Поковыряться я предлагал в даташите для определения возможно ли это вообще, а то как то загадочно, там всё это описано.
И по поводу логики моего мышления :
vitalik_1984 писал(а):Если вершина счета 0x00FF, то выставляется почти мгновенно два флага один - флаг совпадения с регистром сравнения, второй по очистке счетчика ведь до верха уже дошли! и происходит сброс счетчика.
как я и предпологал этим режимом пользуются не все и очень легко спутать его с "быстрым ШИМ" где TCNT1 обнуляется при достижении вершины. Поэтому будет не лишним ещё раз привести цитату из книги:
"При достижении счетчиком максимального значения происходит смена направления счета, но счетчик остается в этом состоянии в течение одного периода сигнала clkT1 (clkT3). В этом же такте устанавливается флаг ICF1 либо OCF1A (зависит от того, какой из регистров используется для задания модуля счета).---Счёт продолжается но на уменьшение--- и при достижении счетчиком минимального значения ($0000) направление счета опять изменяется. При этом устанавливается флаг прерывания TOV1 (TOV3) регистра TIFR (ETIFR) и производится обновление содержимого регистра сравнения."

А поковыряться в даташите на 128 мегу стр126-128 и картинка + надписи на стр127 + блок схема таймера на стр 110

В приложеном файле Снимок-12 последовательность событий в Т1.
Так вот хочется чтобы строки:
[AVR INTERRUPT] Handling TIMER1_CAPT(Timer/Counterl Capture Event), address=0x002C
[AVR INTERRUPT] TIMER1_CAPT completed
были не после строки [AVR TIMER/COUNTER 1] Overflow (0x0000)
а после строки [AVR TIMER/COUNTER 1] Top (0x00FF).

И всё должно выглядеть вот так:
[AVR TIMER/COUNTER 1] Overflow (0x0000)
[AVR INTERRUPT] Handling TIMER1_OVF(Timer/Counterl Оverflow], address=0x0038.
[AVR INTERRUPT] TIMER1_OVF completed.
Другие события по сравнению в каналах ШИМ
[AVR TIMER/COUNTER 1] Top (0x00FF)
[AVR INTERRUPT] Handling TIMER1_CAPT(Timer/Counterl Capture Event), address=0x002C
[AVR INTERRUPT] TIMER1_CAPT completed
Другие события по сравнению в каналах ШИМ
[AVR TIMER/COUNTER 1] Overflow (0x0000)
[AVR INTERRUPT] Handling TIMER1_OVF(Timer/Counterl Оverflow], address=0x0038.
[AVR INTERRUPT] TIMER1_OVF completed.
И так в цикле.
Ошибок не делает тот, кто ничего не делает!
Ответить

Вернуться в «AVR»