Страница 1 из 1

attiny2313 не работает прескалер

Добавлено: Вс сен 18, 2011 17:00:16
iustat
День добрый,

Проблема заключается в том, что как только указываешь прескаллер - таймер перестает тикать (ну или прерывание не вызывается). В протеусе тот же код работает.

Важные моменты кода:

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

.equ T1_Interval = 65536-15625



TMR1_OVF:


	; kasaemo taimera
	outi TCNT1H, High(T1_Interval)
	outi TCNT1L, Low(T1_Interval)  ; initializiruem nacialinie znaceniya

	;in temp, PORTB

	inc Reg1

	out PORTD, Reg1
reti

RESET:
	ldi temp, LOW(RAMEND) 
	out SPL, temp

	outi TCNT1H, High(T1_Interval)
	outi TCNT1L, Low(T1_Interval)  ; initializiruem nacialinie znaceniya

	outi TCCR1B,0x01  ; prescallera netu  

	outi TIMSK, (1<<TOIE1) 	; razreshaem prerivanie po perepolneniu

         ldi Reg1, 0x3
         out PORTD, Reg1

         sei
rjmp MAIN

MAIN:
rjmp MAIN

При такой инициализазии - все работает. Контроллер мигает своими лампочками с высокой частотой. Стоит мне только изменить в коде outi TCCR1B,0x01 на outi TCCR1B,0x02 (прескаллер 8), то прерывание не вызывается. Как при ресете зажигаются два диода (ldi Reg1, 0x3), так больше никаких движений. Уже хз что думать. Убираю прескаллер - опять начинается мерцание :(

Re: attiny2313 не работает прескалер

Добавлено: Вс сен 18, 2011 17:47:06
iustat
Попробовал с Timer0 - таже ерунда. Выставляю прескаллер для таймер0 отличный от единицы - не работает. Без прескаллера - работает.

Re: attiny2313 не работает прескалер

Добавлено: Вс сен 18, 2011 17:51:16
alexx82

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

TMR1_OVF:


   ; kasaemo taimera
   outi TCNT1H, High(T1_Interval)
   outi TCNT1L, Low(T1_Interval)  ; initializiruem nacialinie znaceniya

   ;in temp, PORTB

   inc Reg1

   out PORTD, Reg1
reti
Так никто не делает. Чтобы увеличить частоту срабатывания прерывания, нужно уменьшить значение TOP'а таймера и использовать прерывание по совпадению.

Возможно, вы нашли ошибку в МК, которая никогда ни у кого не проявлялясь именно по той причине, что так никто не делает. Если Вам не лениво, напишите в техподдержку Атмела - не исключено что после этого список errata в даташите данного МК увеличится на один пункт.

Учитывая то, что ошибки у Вас совсем детские, могу посоветовать перейти на C - там писать значительно проще.

Re: attiny2313 не работает прескалер

Добавлено: Вс сен 18, 2011 18:10:20
Flasher
Приведи код полнее. Где настройка порта на выход?

Re: attiny2313 не работает прескалер

Добавлено: Вс сен 18, 2011 19:12:33
iustat

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

.include "tn2313def.inc"

;.equ T1_Interval = 65536-10
;.equ T1_Interval = 65536-15625	; budet sobitie  po perepolneniu timera

.def temp  = r16
.def Reg1 = r17


.org	0x0000
	rjmp	RESET

.org	OVF1addr	; Overflow1 Interrupt Vector Address
	rjmp TMR1_OVF

.org    OVF0addr    ;Overflow0 Interrupt
	rjmp	TMR0_OVF
.org	PCIaddr
	reti
.org    INT0addr	;External Interrupt0
	reti
.org    INT1addr    ;External Interrupt1
	reti
.org    ICP1addr	;Input capture interrupt 1
	reti
.org    OC1Aaddr    ;Timer/Counter1 Compare Match A 
	reti  
.org    URXC0addr   ;USART0 RX Complete Interrupt
	reti
.org    UDRE0addr   ;USART0 Data Register Empty Interrupt
	reti
.org    UTXC0addr   ;USART0 TX Complete Interrupt 
	reti
.org    ACIaddr     ;Analog Comparator Interrupt 
	reti
.org    OC1Baddr    ;Timer/Counter1 Compare Match B
	reti
.org    OC0Aaddr    ;Timer/Counter0 Compare Match A
	reti     
.org    OC0Baddr    ;Timer/Counter0 Compare Match B 
	reti    
.org    USI_STARTaddr ;USI start interrupt
	reti
.org    USI_OVFaddr   ;USI overflow interrupt
	reti
.org    ERDYaddr      ;EEPROM write complete
	reti
.org   WDTaddr        ;Watchdog Timer Interrupt
	reti



.cseg

	.MACRO outi			
	LDI 	R16,@1 			
	OUT 	@0,R16 	
	.ENDM

TMR0_OVF:

	outi PORTB, 0xff
reti

TMR1_OVF:

cli
	; kasaemo taimera
;	outi TCNT1H, High(T1_Interval)
;	outi TCNT1L, Low(T1_Interval)  ; initializiruem nacialinie znaceniya

	;inc Reg1

	ror Reg1

	out PORTD, Reg1

sei

reti

RESET:	 
	; zapreshaem prerivaniya
	cli

	; initializatsiya steka
	ldi temp, LOW(RAMEND) 
	out SPL, temp

	; nastraivaem pini
	
	; pini kotorie ne ispolzuiutsia kajetsia toje nastraivaiutsia na vivod
	outi DDRB, (1<<DDB0)|(1<<DDB1)|(1<<DDB2)|(1<<DDB3)|(1<<DDB4)|(0<<DDB5)|(0<<DDB6)|(0<<DDB7)
	

	ser temp
	out DDRD, temp
	

	; kasaemo taimera
;	outi TCNT1H, High(T1_Interval)
;	outi TCNT1L, Low(T1_Interval)  ; initializiruem nacialinie znaceniya




   ; etih registrov ne bilo, no uje testa radi reshil dobaviti
	outi CLKPR, (1<<CLKPCE)
	outi GTCCR, (1<<PSR10)

	; prescaler
	outi TCCR1B,(1<<CS11)|(1<<CS10)

	outi TIMSK, (1<<TOIE1)	; razreshaem prerivanie po perepolneniu

	
	
	outi TCCR0B,(1<<CS01)
	outi TIMSK, (1<<TOIE0)	; vkliuciaem timer0



	ldi Reg1, 5

	out PORTD, Reg1

	; razreshaem prerivaniya
	sei

rjmp MAIN

MAIN:
sei ;etoi erundi tut toje ne doljno biti, no na vsiakii sluciai dlia testa postavil
	rjmp MAIN

В этом коде я вообще убрал начальное значение таймера1 и включил таймер0 так же без начального значения.

На всякий случай описание схемы (хотя она тут примитивная).

Подключен внешний кварц ( пробовал с внутренним RC генератором - таже хрень). PORTD - полностью настроен на вывод. PIND0-PIND5 через резисторы подключены светодиоды. PINB0-PINB3 так же подключены светодиоды. PINB4 -весит в воздухе, PINB5-PINB7 - кнопки, которые с другой стороны подключены на GND. Два кондера на 18пк на лапах кварца и 2 кондера на питании. В принципе все. Если в RESET записывать в portb и portd значение 0xff, то все диоды (как и положено) загораются.

Я так понимаю, что если бы я перегрел контроллер при пайке - мало вероятно что у него могли бы проснуться подобные глюки

Re: attiny2313 не работает прескалер

Добавлено: Вс сен 18, 2011 19:37:58
Flasher
а зачем перед reti делать sei ?

Re: attiny2313 не работает прескалер

Добавлено: Вс сен 18, 2011 20:48:50
iustat
Так что бы наверняка :).

Попробую сделать через сравнение, посмотрим если что-то получится.

Re: attiny2313 не работает прескалер

Добавлено: Вс сен 18, 2011 21:03:01
iustat
Проблема в том, что как я устанавливаю прескаллер - перестает тикать таймер. Выяснил я это путем добавления следующего фрагмента в MAIN:

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

ldi count1,0xff
ldi count2,0xff

; zaderjka
WAIT:
dec count1
brne WAIT
ldi count1,0xFF
dec count2
brne WAIT


in temp, TCNT1L  ; proboval i TCNT1H - odin fig
out PORTD, temp 
все диоды PORTD гаснут :(

Походу это реально бага именно этого контроллера (либо я его перегрел каким-то удивительным образом при пайке)
Думаю что по сравнению делать даже не стоит, т.к. если таймер не меняет значение - то до прерывания уже пофиг

Re: attiny2313 не работает прескалер

Добавлено: Пн сен 19, 2011 08:13:12
asteroid7
OMG!
Вы прескаллером называете загрузку в счётный TCNTхх?
outi - что это? это хитрый макрос? в задницу его!

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

	;загрузка в TCNT1 0x01FF
	ldi r17,0x01
	ldi r16,0xFF
	out TCNT1H,r17
	out TCNT1L,r16
И да, перед загрузкой нового значения таймер хорошо бы останавливать.

Re: attiny2313 не работает прескалер

Добавлено: Пн сен 19, 2011 10:50:11
iustat
Прескалер в данном случае

outi TCCR1B,(1<<CS11)|(1<<CS10) ; tak ne rabotaet

outi TCCR1B,(1<<CS10) ; prescaler=1. Tak rabotaet

Так как только прескалера не хватает, я еще загружаю в счетный регистр значение ( но тут это не важно. Я это вообще закомментил и заметил что таймер вообще не считает)

Re: attiny2313 не работает прескалер

Добавлено: Пн сен 19, 2011 11:49:05
md5sum
iustat писал(а):outi TCCR1B,(1<<CS11)|(1<<CS10) ; tak ne rabotaet
outi TCCR1B,(1<<CS10) ; prescaler=1. Tak rabotaet
Про макрос писали уже... но раз он Вам так дорог, то может так:
outi TCCR1B,((1<<CS11)|(1<<CS10))