Interrupt-Problem AVR8515

Hallo, irgendwie stehe ich bei der Verwendung des Interrups und T/C0 beim AVR auf dem Schlauch. Vielleicht sieht jemand sofort, wo der Fehler in dem Miniprogramm liegt? Das Programm soll nichts weiter tun, als bei bei jedem Interrupt den Zähler count um eins zu erhöhen und das Ergebnis auf PORTC auszugeben. Das 'Hauptprogramm' ist einfach eine Endlosschleife. Auf den Pins PC0-PC7 sollten dann dementsprechend verschiedene Takte zu messen/hören sein. Der Timer T/C0 zählt den vorgeteilten Systemtakt jeweils von 0x00 bis 0xff und löst beim Überlauf den Interrupt aus. Je nach Einstellung des Vorteilers funktioniert das Ganze - oder auch nicht. Bis CK/64 geht es, bei größeren Teilern aber nicht. Hat jemand eine Idee, woran das liegen könnte? Einzig fällt mir noch ein, dass der Timer beim Verlassen der IRQ-Routine noch nicht weitergezählt hat. Wird dann unmittelbar die IRQ-Routine wieder angesprungen, bei noch irgendein IRQ-Flag steht? Jann-Gerrit

.include "8515def.inc"

.def status =r0 .def temp =r16 .def count =r17

;**** Anfang Reset- und IRQ-Vektoren ********************************* .CSEG .ORG 0x000 ;Vektoren rjmp RESET ;Reset Vektor und Programmstart nop ;IRQ0 nop ;IRQ1 nop ;Timer1 Capture nop ;Timer1 CompareA nop ;Timer1 CompareB nop ;Timer1 Overflow rjmp MILLIS ;Timer0 Overflow nop ;SPI nop ;UART RX nop ;UDR nop ;UART TX nop ;Analog Comparator ;**** Ende IRQ-Vektoren **********************************************

.CSEG .ORG 0x00c ;Programm

RESET: ldi temp,0x00 out PORTC,temp ldi temp,0xff out DDRC,temp ;PC0-PC7 als Ausgänge ldi temp,0x05 ;0x01 CK Bruchteil µC-Takt, ;0x02 CK/8 mit dem T/C0 ;0x03 CK/64 getriggert wird ;0x04 CK/256 ;0x05 CK/1024

out TCCR0,temp ;Vorteiler setzen ldi temp,0x00 out TCNT0,temp ldi temp,0x02 out TIMSK,temp ;enable T/C0 interrupts ldi temp,0x00 out GIMSK,temp ;keine externen Interrups sei ;enable global interrupts RUNEVER: rjmp RUNEVER

;**** T/C0 IRQ Routine **********************************************

MILLIS: in status,SREG ldi temp,0x00 out TCNT0,temp out PORTC,count inc count out SREG,status reti

---------------------------------------------------------------------------- Reply to Jann_Gerrit (auf) gmx.de

Reply to
Jann-Gerrit
Loading thread data ...

Ups, die Spalten waren ja ganz scheusslich durchgeschüttelt. Jetzt ist es hoffentlich wieder besser lesbar. Jann-Gerrit

----------------------------------------------------------------------------

Reply to Jann_Gerrit (auf) gmx.de

Reply to
Jann-Gerrit

Hallo Jann,

auf die Schnelle fällt mir als erstes auf, das Du den Stackpointer nicht initialisiert hast. Sollte als erstes vom Prog an der RESET-Adresse durchgeführt werden, in etwa so:

ldi temp,RAMEND out SP,temp

Nach anderen Fehlermöglichkeiten habe ich noch nicht geschaut, prüf bitte erstmal mit korrekt initialisierten SP.

Gruß Rolf

Reply to
Rolf Bredemeier

Jann-Gerrit schrieb:

[...]

Passt das? Ist nicht der ADC-Interruptvektor auf $c? .ORG 0x00d

Stackpointer wurde schon genannt: ldi temp,low(RAMEND) out SPL,temp ldi temp,high(RAMEND) out SPH,temp

Hier läuft der Zähler doch schon. Sollte TCNT0 nicht vor TCCR0 beschrieben werden?

[...]

Wozu? Der Overflow-Interrupt zeigt doch nun gerade den Überlauf von TCNT0 ($ff -> $00) an.

Grüsse Gunther

Reply to
Gunther Mannigel

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.