Проблема заключается в том, что как только указываешь прескаллер - таймер перестает тикать (ну или прерывание не вызывается). В протеусе тот же код работает.
.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 (прескаллер , то прерывание не вызывается. Как при ресете зажигаются два диода (ldi Reg1, 0x3), так больше никаких движений. Уже хз что думать. Убираю прескаллер - опять начинается мерцание
Так никто не делает. Чтобы увеличить частоту срабатывания прерывания, нужно уменьшить значение TOP'а таймера и использовать прерывание по совпадению.
Возможно, вы нашли ошибку в МК, которая никогда ни у кого не проявлялясь именно по той причине, что так никто не делает. Если Вам не лениво, напишите в техподдержку Атмела - не исключено что после этого список errata в даташите данного МК увеличится на один пункт.
Учитывая то, что ошибки у Вас совсем детские, могу посоветовать перейти на C - там писать значительно проще.
.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, то все диоды (как и положено) загораются.
Я так понимаю, что если бы я перегрел контроллер при пайке - мало вероятно что у него могли бы проснуться подобные глюки
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 гаснут
Походу это реально бага именно этого контроллера (либо я его перегрел каким-то удивительным образом при пайке)
Думаю что по сравнению делать даже не стоит, т.к. если таймер не меняет значение - то до прерывания уже пофиг
Так как только прескалера не хватает, я еще загружаю в счетный регистр значение ( но тут это не важно. Я это вообще закомментил и заметил что таймер вообще не считает)