Использование переполнения счетчика для ATMEGA8A-PU

Обсуждаем цифровые устройства...
Ответить
z11
Родился
Сообщения: 6
Зарегистрирован: Вс июн 21, 2015 10:07:14

Сообщение z11 »

В процессе изучения прерываний компаратора ATMEGA8A-PU решил попробовать задействовать переполнение счетчика. Согласно даташиту добавил в TIMSK разрешение на прерывание по переполнении таймера, но этот вид прерывания почему-то не срабатывает - не происходит перехода на метки TIM1_OVF и TIM0_OVF. Программа реализует "бегущий огонек" из четырех (PB0-PB3) красных СИДов (это работает), по истечению 255 циклов зеленый СИД (PD0) должен погаснуть, а движение огонька на красных СИДах остановиться. Подскажите пожалуйста, где может быть ошибка или в каком направлении надо копать.

Код: Выделить всё

.device atmega8a
.nolist
.include "D:\prg\AVRStudio419\AvrAssembler2\Appnotes\m8Adef.inc"
.list
;=======Прерывание компаратора (переполнение счетчика) Вариант2

.def temp=r16
.def temp1=r17

.cseg
.org 0

rjmp RESET ;Переход на обработку сброса
rjmp EXT_INT0 ;Переход на обработку запроса IRQ0
rjmp EXT_INT1 ;Переход на обработку запроса IRQ1
rjmp TIM2_COMP ;Переход на обработку сравнения Timer2
rjmp TIM2_OVF ;Переход на обработку при переполнении Timer2
rjmp TIM1_CAPT ;Переход на обработку при захвате фронта Timer1
rjmp TIM1_COMPA ;Переход на обработку при срабатывании компаратора A Timer1
rjmp TIM1_COMPB ;Переход на обработку при срабатывании компаратора B Timer1
rjmp TIM1_OVF ;Переход на обработку при переполнении Timer1
rjmp TIM0_OVF ;Переход на обработку при переполнении Timer0
rjmp SPI_STC ;Переход на обработку при завершении передачи SPI
rjmp USART_RXC ;Переход на обработку при завершении приема УСАПП0
rjmp USART_UDRE ;Переход на обработку при освобождении регистра
rjmp USART_TXC ;Переход на обработку при завершении передачи
rjmp ADC_END ;Переход на обработку при завершении преобразования AЦП
rjmp EE_RDY ;Переход на обработку при готовности EEPROM
rjmp ANA_COMP ;Переход на обработку при срабатывании аналогового компаратора
rjmp TWSI ;Двухпроводный Последовательный интерфейс
rjmp SPM_RDY ;Переход на обработку прерывания при Готовности записи в память программ

;RESET:
EXT_INT0:
EXT_INT1:
TIM2_COMP:
TIM2_OVF:
TIM1_CAPT:
;TIM1_COMPA:
TIM1_COMPB:
;TIM1_OVF:
;TIM0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
ADC_END:
EE_RDY:
ANA_COMP:
TWSI:
SPM_RDY:
 reti

RESET:
 rjmp Init

Init:
 ser temp			;в результате temp=0xFF
 out DDRB,temp		;весь регистр B ориентировали на выход
 out DDRD,temp		;весь регистр D ориентировали на выход

 ldi temp,Low(RamEnd)	;в temp посл. адрес ОЗУ (младший байт)
 out SPL,temp		;задать младший байт указателя стека
 ldi temp,High(RamEnd)	;в temp посл. адрес ОЗУ (старший байт)
 out SPH,temp		;задать старший байт указателя стека

 ldi temp,0b00000001
 out PortB,temp		;включить красный СИД1
 ldi temp,0b00000000
 out PortD,temp		;включить зеленый (инверсный) СИД1

 ldi temp,0b00010001
 out TIMSK,temp		;разрешить прерывание компаратора (в т.ч. по переполнению)

 ldi Temp,0b00000010   ;тактовый сигнал = CK/8
 out TCCR1B,Temp

 ldi Temp,0x4C         ;инициализация компаратора
 out OCR1AH,Temp
 ldi Temp,0x4B
 out OCR1AL,Temp

 ldi Temp1,0b00000001  ;инициализация индикатора

 sei                   ;разрешить прерывания

 ldi Temp,0            ;обнуление таймера
 out TCNT1H,Temp
 out TCNT1L,Temp

Inf: rjmp Inf              ;бесконечный цикл

TIM1_COMPA:
 rol Temp1             ;сдвиг влево
 out PortB,Temp1       ;вывод в порт
 reti                  ;выход из обработчика

TIM1_OVF:
TIM0_OVF:
 ldi temp,0b00000001
 out PortD,temp		;выключить зеленый (инверсный) СИД1
 ret					;выход из обработчика с последующим запретом прерываний
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

1. Ветку форума не удачную выбрали. Есть специальная тема по AVR.
2. Запустите пошаговую симуляцию и сами найдете.
3. Таймеру 0 надо дать источник сигнала чтобы он переполнился.
4. Маска переполнения таймера 1 находится в бит2 TIMSK , его надо включить (TOIE1).
5. Не забудьте сохранять и восстанавливать значения регистра STATUS и других регистров в обработчиках прерываний, если в основном теле программы вдруг будет какая то обработка.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

После того как будут разрешено прерывание TOV1 и подано тактирование на T0 выходить из прерываний переполнения лучше по RETI. Иначе, зависон обеспечен.
z11
Родился
Сообщения: 6
Зарегистрирован: Вс июн 21, 2015 10:07:14

Сообщение z11 »

Z_h_e, akl, большое спасибо, разобрался. Причина ошибки была из-за моего неправильном понимания работы счетчика и компаратора. Если кому интересно, вот пример реализации бегущего огонька на основе прерывания по переполнению 16-разрядного счетчика 1.
Спойлер

Код: Выделить всё

.device atmega8a
.nolist
.include "D:\prg\AVRStudio419\AvrAssembler2\Appnotes\m8Adef.inc"
.list
;=======Бегущий огонек на основе прерывания по переполнению счетчика 1

.cseg
.org 0

rjmp RESET ;Переход на обработку сброса
rjmp EXT_INT0 ;Переход на обработку запроса IRQ0
rjmp EXT_INT1 ;Переход на обработку запроса IRQ1
rjmp TIM2_COMP ;Переход на обработку сравнения Timer2
rjmp TIM2_OVF ;Переход на обработку при переполнении Timer2
rjmp TIM1_CAPT ;Переход на обработку при захвате фронта Timer1
rjmp TIM1_COMPA ;Переход на обработку при срабатывании компаратора A Timer1
rjmp TIM1_COMPB ;Переход на обработку при срабатывании компаратора B Timer1
rjmp TIM1_OVF ;Переход на обработку при переполнении Timer1
rjmp TIM0_OVF ;Переход на обработку при переполнении Timer0
rjmp SPI_STC ;Переход на обработку при завершении передачи SPI
rjmp USART_RXC ;Переход на обработку при завершении приема УСАПП0
rjmp USART_UDRE ;Переход на обработку при освобождении регистра
rjmp USART_TXC ;Переход на обработку при завершении передачи
rjmp ADC_END ;Переход на обработку при завершении преобразования AЦП
rjmp EE_RDY ;Переход на обработку при готовности EEPROM
rjmp ANA_COMP ;Переход на обработку при срабатывании аналогового компаратора
rjmp TWSI ;Двухпроводный Последовательный интерфейс
rjmp SPM_RDY ;Переход на обработку прерывания при Готовности записи в память программ

;RESET:
EXT_INT0:
EXT_INT1:
TIM2_COMP:
TIM2_OVF:
TIM1_CAPT:
TIM1_COMPA:
TIM1_COMPB:
;TIM1_OVF:
TIM0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
ADC_END:
EE_RDY:
ANA_COMP:
TWSI:
SPM_RDY:
 reti

RESET:
 rjmp Init

Init:
 ser r16			;в результате r16=0xFF
 out DDRB,r16		;весь регистр B ориентировали на выход

 ldi r16,Low(RamEnd)	;в r16 посл. адрес ОЗУ (младший байт)
 out SPL,r16		;задать младший байт указателя стека
 ldi r16,High(RamEnd)	;в r16 посл. адрес ОЗУ (старший байт)
 out SPH,r16		;задать старший байт указателя стека

 ldi r16,0b00000001
 out PortB,r16		;включить красный СИД1

 ldi r16,0b00000100
 out TIMSK,r16		;разрешить прерывание по переполнению счетчика 1

 ldi r16,0b00000010   ;тактовый сигнал = CK/8 для счетчика 1
 out TCCR1B,r16

 ldi r17,0b00000001  ;инициализация индикатора

 sei                  ;разрешить прерывания

 ldi r16,0            ;обнуление таймера счетчика 1
 out TCNT1H,r16
 out TCNT1L,r16

Inf: rjmp Inf              ;бесконечный цикл

TIM1_OVF:
 rol r17				;сдвиг влево
 out PortB,r17			;вывод в порт
 reti					;выход из обработчика
а это, аналогичный пример, но на основе прерывания по переполнению 8-разрядного счетчика 0.
Спойлер

Код: Выделить всё

.device atmega8a
.nolist
.include "D:\prg\AVRStudio419\AvrAssembler2\Appnotes\m8Adef.inc"
.list
;=======Переполнение счетчика 0 (бегущий огонек)

.cseg
.org 0

rjmp RESET ;Переход на обработку сброса
rjmp EXT_INT0 ;Переход на обработку запроса IRQ0
rjmp EXT_INT1 ;Переход на обработку запроса IRQ1
rjmp TIM2_COMP ;Переход на обработку сравнения Timer2
rjmp TIM2_OVF ;Переход на обработку при переполнении Timer2
rjmp TIM1_CAPT ;Переход на обработку при захвате фронта Timer1
rjmp TIM1_COMPA ;Переход на обработку при срабатывании компаратора A Timer1
rjmp TIM1_COMPB ;Переход на обработку при срабатывании компаратора B Timer1
rjmp TIM1_OVF ;Переход на обработку при переполнении Timer1
rjmp TIM0_OVF ;Переход на обработку при переполнении Timer0
rjmp SPI_STC ;Переход на обработку при завершении передачи SPI
rjmp USART_RXC ;Переход на обработку при завершении приема УСАПП0
rjmp USART_UDRE ;Переход на обработку при освобождении регистра
rjmp USART_TXC ;Переход на обработку при завершении передачи
rjmp ADC_END ;Переход на обработку при завершении преобразования AЦП
rjmp EE_RDY ;Переход на обработку при готовности EEPROM
rjmp ANA_COMP ;Переход на обработку при срабатывании аналогового компаратора
rjmp TWSI ;Двухпроводный Последовательный интерфейс
rjmp SPM_RDY ;Переход на обработку прерывания при Готовности записи в память программ

;RESET:
EXT_INT0:
EXT_INT1:
TIM2_COMP:
TIM2_OVF:
TIM1_CAPT:
TIM1_COMPA:
TIM1_COMPB:
TIM1_OVF:
;TIM0_OVF:
SPI_STC:
USART_RXC:
USART_UDRE:
USART_TXC:
ADC_END:
EE_RDY:
ANA_COMP:
TWSI:
SPM_RDY:
 reti

RESET:
 rjmp Init

Init:
 ser r16			;в результате r16=0xFF
 out DDRB,r16		;весь регистр B ориентировали на выход

 ldi r16,Low(RamEnd)	;в r16 посл. адрес ОЗУ (младший байт)
 out SPL,r16		;задать младший байт указателя стека
 ldi r16,High(RamEnd)	;в r16 посл. адрес ОЗУ (старший байт)
 out SPH,r16		;задать старший байт указателя стека

 ldi r16,0b00000001
 out PortB,r16		;включить красный СИД1

 ldi r16,0b00000001
 out TIMSK,r16		;разрешить прерывание по переполнению счетчика 0

 ldi r16,0b00000101   ;источник для счетчика 0 - такт. сигнал с предделением 1024
 out TCCR0,r16

 ldi r17,0b00000001  ;инициализация индикатора

 sei                  ;разрешить прерывания

 ldi r16,0            ;обнуление таймера счетчика 1
 out TCNT1H,r16
 out TCNT1L,r16

Inf: rjmp Inf              ;бесконечный цикл

TIM0_OVF:
 rol r17				;сдвиг влево
 out PortB,r17			;вывод в порт
 reti					;выход из обработчика
Оба примера для МК ATMega8A-PU с собственным источником тактового сигнала (1 Мегагерц). СИДы подключены к выводам регистра PB. Кстати, интересный момент: обнаружил различие между даташитами для ATMega8 и для ATMega8A в описании регистра TCCR0. В виду того, что в рунете нет на русском даташита для ATMega8A, это плохая новость.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «Цифровая техника»