-         
+ Antworten
Ergebnis 1 bis 7 von 7

Thema: Anfängerfrage zu Interrupt

  1. #1
    Gast

    Anfängerfrage zu Interrupt

    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.


    Code:
    .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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    28
    Beiträge
    2.624
    Hi!
    Du kannst nur die register ab r16 benutzen und nicht schon ab r15! :o)
    Viel Erfolg noch! :o)

  3. #3
    Gast
    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.

  4. #4
    Gast
    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.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    28
    Beiträge
    2.624
    Na, dann hat es sich ja zum Glücklichen gewendet!
    Viel Erfolg noch weiterhin! :o)

  6. #6
    talentraspel_kai
    Gast

    Cut & Paste

    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.

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.11.2003
    Ort
    Freiburg im Breisgau
    Alter
    28
    Beiträge
    2.624
    Danke für den Hinweis, ich habe das Buch nämlich auch! ;o)
    Und dafür bezahlt man so viel geld! *lol*

+ Antworten

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •