Hi,
ich bin dabei meine defekte Heizungselektronik durch einen Mega16 zu ersetzen.
Das soll natürlich relativ rasch geschehen, denn die Heizperiode steht vor der Tür bzw. hat schon begonnen ...!
Beim Tiny13 und Mega8 hatte ich bislang keine Probleme mit den Timern bzw. den Vektor-Sprüngen bei Overflow.
Den Mega16 verwende ich das erste Mal.
Ich benötige alle 3 Timer.
Beim debuggen mit dem AVR Studio staunte ich nicht schlecht, als kein einziger TmrOvf auf die richtige Vektoradresse gesprungen ist.
Nun habe ich ein Testprogramm zusammen gestellt.
Bei diesem ist es genauso der Fall!
Beim Testen dieses Testprogrammes (und in meinem eigentlichen ebenso) mit AVR Studio 4.12 und 4.19 springen die Timer Interrupts auf eine komplett andere Vectoradresse als es sein soll!!!
Der Tmr0-Ovf-Int springt auf INT2 External Interrupt Request 2,
der Tmr1-Ovf-Int auf ANA_COMP Analog Comparator und
der Tmr2-Ovf-Int auf TIMER1 OVF Timer/Counter1 Overflow!
Wo hab ich bloß meinen Gedanken- und Programmfehler!??
Kann mir bitte jemand helfen?
Gruß Heinz
Code:
#include "m16def.inc"
; Interrupt Vektoren lt. Datenblatt und m16def.inc
.cseg
.org 0x000
rjmp INIT ; POR oder Reset
reti ;INT0 External Interrupt Request 0
reti ;INT1 External Interrupt Request 1
reti ;TIMER2 COMP Timer/Counter2 Compare Match
rjmp TMR2OVF ;TIMER2 OVF Timer/Counter2 Overflow
reti ;TIMER1 CAPT Timer/Counter1 Capture Event
reti ;TIMER1 COMPA Timer/Counter1 Compare Match A
reti ;TIMER1 COMPB Timer/Counter1 Compare Match B
rjmp TMR1OVF ;TIMER1 OVF Timer/Counter1 Overflow
rjmp TMR0OVF ;TIMER0 OVF Timer/Counter0 Overflow
reti ;SPI, STC Serial Transfer Complete
reti ;USART, RXC USART, Rx Complete
reti ;USART, UDRE USART Data Register Empty
reti ;USART, TXC USART, Tx Complete
reti ;ADC ADC Conversion Complete
reti ;EE_RDY EEPROM Ready
reti ;ANA_COMP Analog Comparator
reti ;TWI Two-wire Serial Interface
reti ;INT2 External Interrupt Request 2
reti ;TIMER0 COMP Timer/Counter0 Compare Match
reti ;SPM_RDY Store Program Memory Ready
INIT:
cli ;disable Interrupts
; Stack anlegen
ldi R16,LOW(RAMEND)
out SPL,R16
ldi R16,HIGH(RAMEND)
out SPH,R16
; Interrupt enabling
ldi R16,69 ;Tmr0+1+2 IntEn
out TIMSK,R16
sei ;Interrupts freigeben
;*****************************************************************
; Start Timer0
ldi R16,250
out TCNT0,R16 ;TimerCounter auf 250
ldi R16,1 ;no Prescaler
out TCCR0,R16 ;StartTimer0
; Start Timer1
ser R17
ldi R16,245
out TCNT1H,R17 ;TimerCounter auf 255
out TCNT1L,R16 ;TimerCounter auf 245
ldi R16,1 ;no Prescaler
out TCCR1B,R16 ;StartTimer1
; Start Timer2
ldi R16,240
out TCNT2,R16 ;TimerCounter auf 240
ldi R16,1 ;no Prescaler
out TCCR2,R16 ;StartTimer2
; Loop zum Testen der TmrOvf Interrupts
LOOP:
nop
rjmp loop
;******************** START INTERRUPTROUTINEN ********************
TMR0OVF:
in R18,SREG
cli
out SREG,R18
reti
TMR1OVF:
in R19,SREG
cli
out SREG,R19
reti
TMR2OVF:
in R20,SREG
cli
out SREG,R20
reti
;******************** ENDE INTERRUPTROUTINEN *********************
.EXIT
Lesezeichen