Задача казалась простой - до моделирования в 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.
Кому интересно поковырятся милости прошу.
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 скачиваний
Ошибок не делает тот, кто ничего не делает!
