PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Anfängerfrage zu Interrupt



07.09.2004, 17:26
Hallo zusammen, ich hoffe ihr könnt mir helfen.

Ich fange gerade an mich mit den AVR's "anzufreunden" und hab nachfolgendes Programm geschrieben (Der meiste Teil stammt aus dem Buch AVR-RISC Mikrocontroller). Eigentlich soll es mit 2Hz ein Wechselblinklicht sein. Im Simulator funktioniert das ganze auch, aber wenn ich das Prog im Chip habe passiert rein gar nix, ausser das die LED an Port PB1 leuchtet.

Das ganze stimmt mich ziemlich ratlos und für eine kleine Hilfe wäre ich sehr dankbar.




.INCLUDE "C:\ATMEL\ASM\APPNOTES\2313def.inc"

.def Stat = R15 ;Zwischenspeicher für SREG
.def Icnt = R16 ;Interruptzähler
.def Blink = R17 ;Statusregister Blinken
.def Temp = R18 ;Arbeitsregister Blinkroutine
.def Work = R19 ;Arbeitsregister Hauptprogramm

.equ Time = 80000 / 1024 ;Zählerwert für Interrupt

rjmp Main ;nach Reset zum Hauptprogramm
reti ;Externer Interrupt 0 nicht verwendet
reti ;Externer Interrupt 1 nicht verwendet
reti ;T/C1 Capture Interrupt nicht verwendet
reti ;T/C1 Compare A Interrupt nicht verwendet
reti ;T/C1 Compare B Interrupt nicht verwendet
reti ;T/C1 Überlauf Interrupt nicht verwendet


;= Blinkroutine
Timer0: ;Timer0 Überlauf Interrupt
in Stat, SREG ;Flags des Hauptprogramms retten

dec Icnt ;Zähler -1
breq D1 ;Sprung wenn gleich 0
rjmp IntEnd ;zum Interrupt Ende

D1:
ldi Icnt, 25 ;Programmzähler neu laden

sbrc Blink, 0 ;welche LED ist gerade an?
rjmp Led1

ldi Blink, 0b00000001
rjmp IntEnd

Led1:
ldi Blink, 0b00000010

IntEnd:
out PORTB, Blink ;LED Stellung ausgeben

ldi Temp, -Time
out TCNT0, Temp ;T/C0 nachladen

out SREG, Stat ;Flags des Hauptprogramms wiederherstellen
reti




;= Hauptprogramm
Main:
ldi Work, High(Ramend)
out sph, Work
ldi Work, Low(Ramend)
out spl, Work ;Stack initialisiert

ldi Work, $FF
out DDRB, Work ;alle Bits von Port B sind Ausgang

ldi Blink, 0b00000001
out PortB, Blink ;LED1 einschalten

ldi Icnt, 25 ;Programmzähler setzen

ldi Work, $02 ;der Interrupt bei T/C0 Überlauf
out TIMSK, Work ;wird durch TOIE0 freigegeben
ldi Work, -Time ;Startwert für Timer0
out TCNT0, Work ;ausgeben
ldi Work, $05 ;kein Vorteiler für T/C0
out TCCR0, Work ;ausgeben und damit T/C0 starten
sei ;Interrupts global freigeben

Wait: ;Warteschleife
nop
rjmp Wait

Florian
07.09.2004, 18:20
Hi!
Du kannst nur die register ab r16 benutzen und nicht schon ab r15! :o)
Viel Erfolg noch! :o)

07.09.2004, 21:01
Das löst das Problem aber nicht, das Register R15 verwende ich nur zur Rettung von SREG über IN und das geht, wird im Programm aus dem Buch ebenso gemacht und der Compiler meldet auch keinerlei Fehler und - wie gesagt - im Simulator läuft das ganze...

Der Chip ist auch in Ordnung, wenn ich die Ports mit anderen Programmen teste läuft alles problemlos und bei einem zweiten Chip tritt das gleiche Problem auf. Der Fehler muß also im Programm liegen aber kruzifix ich komm einfach nicht dahinter.

07.09.2004, 21:42
Danke hat sich erledigt, irgend ein Spaßvogel hat was falsches in das Buch gedruckt - kaum zu fassen.

Beim AT90S2313 gibt es keinen "T/C1 Compare B Interrupt". Somit ist mein Programm immer in ein RETI reingesprungen - zumindest im Chip. Im Simulator hatte ich nicht den richtigen Chip Typ angegeben, deshalb hat es dort funktioniert.

Bähhh....blöder Fehler.

Florian
07.09.2004, 21:58
Na, dann hat es sich ja zum Glücklichen gewendet!
Viel Erfolg noch weiterhin! :o)

talentraspel_kai
07.09.2004, 22:09
Hallo.

Da hat der Autor des Buches einfach Copy & Paste gemacht. Und zwar von einem Programm für einen anderen Chip-Typ.

SPH gibt es beim 2313 nämlich auch nicht.

Übrigens:
Auch die TIMSK-Bits sind nicht bei allen Chip-Typen identisch. Da kann man drauf reinfallen, wenn man zwischen AT90 und ATMega wechselt.

Grüße,
Kai.

Florian
07.09.2004, 22:13
Danke für den Hinweis, ich habe das Buch nämlich auch! ;o)
Und dafür bezahlt man so viel geld! *lol*