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
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