robo_wolf,
da hast Du Dir einen sehr guten und erfolgsversprechenden Zugang ausgesucht! Ein paar Anmerkungen zu Deinem Programm:
Du musst bedenken, dass die Interrupt-Dienstprozedur INT0_ISR dieselben Register verwendet, wie das Hauptprogramm. Wenn also die Haupschleife MAIN mit bestimmten Registern etwas ausrechnen wollte, als der Interrupt sie unterbrach, dann erwartet sie, dass die Register bei der Rückkehr aus dem Interrupt wieder dieselben Werte haben wie vorher. Du musst also dafür sorgen, dass die Registerinhalte gleich zu Beginn von INT0_ISR auf den Stack gesichert (push rxx) und unmittelbar vor der Rückkehr (reti) wiederhergestellt (pop rxx) werden. Wichtig ist auch, den aktuellen Inhalt des SREG auf dem Stack zu sichern. Sonst gehen dem Hauptprogramm so wichtige Sachen wie der aktuelle Stand des Carry- oder Zero-Flags verloren. Also brauchst Du parallel zum Sichern der Register noch die Zeilen
Aus leidvoller () Erfahrung habe ich mir angewöhnt, vor jedem Unterprogramm und jedem Interruptdienst aufzuschreiben, welche Register wie verwendet werden. Z.B. so:
Weiterhin viel Spass und viel Erfolg!Code:/* Der Steuerblock und die Daten der FIFO werden im RAM angelegt. Die Offsets der Steuerdaten sind +0 : FIFO_FLAGS +1 : FIFO_WR zeigt auf nächste Schreibposition +2 : FIFO_RD zeigt auf nächste Leseposition +3 : FIFO_CAP FIFO-Kapazität, maximal 255 Byte Datenblock: +4 : <1. Datenbyte> Die Bedeutung der Bits in FIFO_FLAGS ist: XXXX XXXX || |+------ 0: FIFO ist nicht voll | 1: FIFO ist voll | +------- 0: FIFO ist nicht leer 1: FIFO ist leer */ ;------------------------------------------ ; ; FIFO-KONSTANTEN ; ; BYTE-OFFSETs .equ FIFO_FLAGS = 0 .equ FIFO_WR = 1 ; zeigt auf nächste freie Position .equ FIFO_RD = 2 ; zeigt auf nächste belegte Position .equ FIFO_CAP = 3 ; .equ FIFO_LNG = 4 ; Länge des Datenblocks ;BIT-OFFSETs .equ FIFO_VOLL = 0 .equ FIFO_LEER = 1 ; ; Der Platzbedarf im RAM ; berechnet sich als ; FIFO_SIZE = FIFO_LNG + FIFO_CAP /*------------------------------------------ PROCEDURE FIFO8_CREATE erzeugt die Struktur einer leeren FIFO für 1-Byte-Daten im RAM Eingangsvariablen zh:zl: enhält den Zeiger auf die RAM-Adresse, an der die FIFO angelegt werden soll r16: enthält die FIFO-Kapazität Ausgangsvariablen zh:zl : enthält den Zeiger auf die FIFO r16: enthält die FIFO-Kapazität geänderte Register keine geänderte Ports keine */ FIFO8_CREATE: push r17 in r17,SREG push r17 push r18 ; FIFO-Steuerblock mit Nullen füllen ldi r18,FIFO_LNG clr r17 FIFO_CREAT01: tst r18 breq FIFO_CREAT_00 st z+,r17 dec r18 rjmp FIFO_CREAT01 FIFO_CREAT_00: ; zh:zl wieder auf Anfang der FIFO stellen sbiw zh:zl,FIFO_LNG ; Anfangszustand der Flags einstellen ldi r17,(1<<FIFO_LEER); Flag "FIFO_LEER" setzen std z+FIFO_FLAGS,r17 dec r16 ; std z+FIFO_CAP,r16 ; FIFO-Kapazität speichern inc r16 ; pop r18 pop r17 out SREG,r17 pop r17 ret
mare_crisium







Zitieren

Lesezeichen