Таймер на attiny2313

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 147
Зарегистрирован: Вс мар 09, 2014 09:13:00

Сообщение DenChik87 »

Помогите с таймером. Хочу чтобы через каждую минуту в PortВ инкрементировался на единицу, для этого написал нижеприведенный текст программы. Но при первом прохождении цикла программы значение выводимое в PortB увеличивается сразу на два, а с каждым последующем циклом на 1 как и задумано. Так программа ведет себя и в реале и при симуляции в протеусе. Почему так?

.device ATtiny2313
.include "tn2313def.inc"
.def t1=R16
.def t2=R17
.def t3=R18
.def t4=R19
.def counter=R20
.def t26=r26
.def t27=r27

rjmp Reset ;вектора прерываний
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP

;Reset:
INT_0:
INT_1:
Timer1_capt1:
;Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
reti


Reset: ldi t1,low(RAMEND)
out SPL,t1

ldi t1,0b11111111 ;настройка порта В
out DDRB,t1

ldi t1,0 ;настройка порта D
out DDRD,t1
ldi t1,0xff
out PORTD,t1

ldi counter,0


ldi t1,0xe2 ;загружаем число e4e2
ldi t2,0xe4 ;в регистр сравнения т.е. 1мин
out ocr1ah,t2
out ocr1al,t1

ldi t1,1<<ocie1a ;разреш маски прерывания
out timsk,t1 ;таймера1 по совподению

ldi t1,1<<cs12|1<<cs10 ;предделитель 1024
out tccr1b,t1

sei

Cikl: rjmp Cikl


Timer1_comp1:
ldi t1,0 ;обнуляем регистр сравнения
out tcnt1l,t1
out tcnt1h,t1

inc counter ;выводим что насчитали в порт
out portb,counter

reti
Реклама
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Может быть из-за того, что запись в 16-разрядный регистр периферии TCNT1 сделана неправильно.

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

Timer1_comp1:
	ldi t1,0 ;обнуляем регистр сравнения
	;out tcnt1l,t1
	out tcnt1h,t1
	out tcnt1l,t1
По мне, лучше использовать режим CTC, тогда вышеприведённые команды не нужны.
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 147
Зарегистрирован: Вс мар 09, 2014 09:13:00

Сообщение DenChik87 »

А что неправильного? И как иначе тогда обнулить регистр счета TCNT1L И TCNT1H?
akl
Друг Кота
Сообщения: 4468
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Из DS
To do a 16-bit write, the high byte must be written before the low byte. For a 16-bit read, the low byte must be read before the high byte.
Реклама
Эиком - электронные компоненты и радиодетали
ks0
Прорезались зубы
Аватара пользователя
Сообщения: 238
Зарегистрирован: Чт фев 28, 2013 14:16:10

Сообщение ks0 »

Пишут сначало в H, потом в L. Читают наоборот.
И да, правильно в СТС делать, тогда обнулять ниче не надо. Просто установите в TCCR1B WGM12 (или че там), тогда счетчик сбрасывается по достижению OCR1A
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 147
Зарегистрирован: Вс мар 09, 2014 09:13:00

Сообщение DenChik87 »

Да действительно если с начало очистить H, а затем L все работает как надо. Спасибо всем за помощь :))
Реклама
Ответить

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