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

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 13
Зарегистрирован: Пн авг 23, 2010 11:52:37

Сообщение 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), так больше никаких движений. Уже хз что думать. Убираю прескаллер - опять начинается мерцание :(
Реклама
Родился
Сообщения: 13
Зарегистрирован: Пн авг 23, 2010 11:52:37

Сообщение iustat »

Попробовал с Timer0 - таже ерунда. Выставляю прескаллер для таймер0 отличный от единицы - не работает. Без прескаллера - работает.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 64
Зарегистрирован: Ср июл 06, 2011 19:11:44
Откуда: В цветущих акациях город

Сообщение 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 - там писать значительно проще.
Контактная информация:
Мудрый кот
Аватара пользователя
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Сообщение Flasher »

Приведи код полнее. Где настройка порта на выход?
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 13
Зарегистрирован: Пн авг 23, 2010 11:52:37

Сообщение 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, то все диоды (как и положено) загораются.

Я так понимаю, что если бы я перегрел контроллер при пайке - мало вероятно что у него могли бы проснуться подобные глюки
Реклама
Мудрый кот
Аватара пользователя
Сообщения: 1802
Зарегистрирован: Ср сен 07, 2011 21:40:30

Сообщение Flasher »

а зачем перед reti делать sei ?
Реклама
Родился
Сообщения: 13
Зарегистрирован: Пн авг 23, 2010 11:52:37

Сообщение iustat »

Так что бы наверняка :).

Попробую сделать через сравнение, посмотрим если что-то получится.
Родился
Сообщения: 13
Зарегистрирован: Пн авг 23, 2010 11:52:37

Сообщение 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 гаснут :(

Походу это реально бага именно этого контроллера (либо я его перегрел каким-то удивительным образом при пайке)
Думаю что по сравнению делать даже не стоит, т.к. если таймер не меняет значение - то до прерывания уже пофиг
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

OMG!
Вы прескаллером называете загрузку в счётный TCNTхх?
outi - что это? это хитрый макрос? в задницу его!

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

	;загрузка в TCNT1 0x01FF
	ldi r17,0x01
	ldi r16,0xFF
	out TCNT1H,r17
	out TCNT1L,r16
И да, перед загрузкой нового значения таймер хорошо бы останавливать.
Родился
Сообщения: 13
Зарегистрирован: Пн авг 23, 2010 11:52:37

Сообщение iustat »

Прескалер в данном случае

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

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

Так как только прескалера не хватает, я еще загружаю в счетный регистр значение ( но тут это не важно. Я это вообще закомментил и заметил что таймер вообще не считает)
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Вт окт 27, 2009 22:39:19
Откуда: Москва

Сообщение 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))
— Не говорите мне что делать и я не скажу куда Вам идти...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»