Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Atmega128 Timer2
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
alx71
CODE
.EQU COUNT_LED_OFF = 0xF0
.EQU COUNT_LED_ON = 0xF0

.org 0
jmp RESET
.org OVF2addr
jmp OVF2

.org 0x46
OVF2:
push R16
push R30
push R31

; остановим таймер
clr R16
out TCCR2,R16
sbi PORTA,2 ; фронт импульса на осциллограф
ldi R16,COUNT_LED_ON
out TCNT2,R16
; запустим таймер
ldi R16,0b00000101; частота 16 МГц/1024 = 15.625 кГц, период 64 мкс
out TCCR2,R16
pop R31
pop R30
pop R16
cbi PORTA,2
reti
RESET:

ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16

ldi R16,0xFF
out DDRC,R16
ldi R16,0b00000111
out DDRA,R16

ldi R16,0b00000101; частота 16 МГц/1024 = 15.625 кГц, период 64 мкс
out TCCR2,R16
in R16,TIFR
andi R16,0b00111111
out TIFR,R16
in R16,TIMSK
ori R16,0b01000000
out TIMSK,R16
andi R24,0b11111100
ldi R16,COUNT_LED_OFF
out TCNT2,R16
sei

loop:
rjmp loop


Осцилом встал на bit 2 порта A.
Проблема в том, что период между фронтами импульсов непостоянный - то 1 мс, то ~ 0.7 мс, т.е. прерывания по таймеру возникают с разным периодом.
Никакие другие прерывания не разрешены.
Где порыть?
RabidRabbit
Мож прескейлер надо сбрасывать?
zombi
WDT ?
ILYAUL
Код
    .org    0x46
    push    R16    push    R30    push    R31
pop        R31    pop        R30    pop        R16

Зачем это всё? И почитайте FREE TAIMER
alx71
Цитата(ILYAUL @ Feb 4 2013, 02:46) *
И почитайте FREE TAIMER

Ни FREE TAIMER, ни FREE TIMER в доке не нашел, о чем речь?


alx71
Цитата(RabidRabbit @ Feb 4 2013, 00:37) *
Мож прескейлер надо сбрасывать?

Prescaler может давать ошибку +- 64 мкс, а у меня разница в 0,3 мс...
adc
Кроме этой задачи в программе ничего не делается?
Попробуйте не останавливать таймер, а просто переписывать TCNT2.
alx71
Цитата(zombi @ Feb 4 2013, 02:01) *
WDT ?


Он выключен после RESET.

Цитата(adc @ Feb 4 2013, 11:02) *
Кроме этой задачи в программе ничего не делается?

Нет, поубирал все, в первом посте полный код.

Цитата(adc @ Feb 4 2013, 11:02) *
Попробуйте не останавливать таймер, а просто переписывать TCNT2.

Попробую.
ae_
Цитата(alx71 @ Feb 4 2013, 10:38) *
Ни FREE TAIMER, ни FREE TIMER в доке не нашел, о чем речь?

Скорее всего речь про Clear Timer on Compare Match (CTC) Mode.
Таймер досчитывает до числа, записанного в регистр OCRx и сбрасывается в ноль автоматически. Не требуется что-либо дополнительно писать в таймер в прерывании.
ILYAUL
Цитата
Попробуйте не останавливать таймер, а просто переписывать TCNT2
-1 такт ( задержка выполнения считывание -запись) = free timer
Если у Вас одно значение то проще сделать
Цитата
Таймер досчитывает до числа, записанного в регистр OCRx и сбрасывается в ноль автоматически
adc
Цитата
-1 = free timer

Ну что Вы все заладили?
Ну есть режим CTC у таймера , как уже писал выше ув. ae_, причина то явно не ясна почему интервалы разные?
Естественно в этой задаче CTC mode, наиболее удобное решение.
ae_
alx71, может M103C fuse забыли снять?
Да, и вот этот код не_сбрасывает флаги OCF2 и TOF2
Код
in        R16,TIFR
andi        R16,0b00111111
out        TIFR,R16

Их надо сбрасывать записью "1"
Код
ldi        R16, 0b_1100_0000
out        TIFR, R16
alx71
Цитата(zombi @ Feb 4 2013, 01:01) *
WDT ?

Действительно WDT.
ILYAUL
Цитата(ae_ @ Feb 4 2013, 16:45) *
Да, и вот этот код не_сбрасывает флаги OCF2 и TOF2

А зачем , если у него работает аппаратный сброс
ae_
Цитата(ILYAUL @ Feb 5 2013, 01:42) *
А зачем , если у него работает аппаратный сброс

Разумеется, флаги будут аппаратно сброшены при входе в прерывание.
Я указал на ошибку не в качестве решения вопроса нестабильного периода прерываний,
а с целью обратить внимание ТС и остальных, кто будет читать эту ветку, что флаги нужно сбрасывать записью "1", а не "0".
alx71
Цитата(ae_ @ Feb 4 2013, 18:45) *
alx71, может M103C fuse забыли снять?
Да, и вот этот код не_сбрасывает флаги OCF2 и TOF2
Код
in        R16,TIFR
andi        R16,0b00111111
out        TIFR,R16

Их надо сбрасывать записью "1"
Код
ldi        R16, 0b_1100_0000
out        TIFR, R16


Да, действительно.
Цитата
Alternatively, OCF2 is cleared by writing a logic one to
the flag.
adc
Цитата(ae_ @ Feb 5 2013, 03:02) *
...а с целью обратить внимание ТС и остальных, кто будет читать эту ветку, что флаги нужно сбрасывать записью "1", а не "0".

Спасибо! И в правду, нашел у себя в инициализации таймеров именно запись нулей в регистр TIFR, вместо единиц. (На работу программы это конечно не влияло, но переносится из проекта в проект довольно давно :-))
Все это из-за невнимательного ознакомления с DS smile3046.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.