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

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

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

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

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

Сообщение iustat »

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

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

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

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

Сообщение Flasher »

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

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

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

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

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

Сообщение Flasher »

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

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

Сообщение iustat »

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

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

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

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

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

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

Сообщение asteroid7 »

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

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

   ;загрузка в TCNT1 0x01FF
   ldi r17,0x01
   ldi r16,0xFF
   out TCNT1H,r17
   out TCNT1L,r16


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

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

Сообщение iustat »

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

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

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

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

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

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

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