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







Zitieren


Lesezeichen