Liste der Anhänge anzeigen (Anzahl: 2)
mare_crisium,
bin ratlos...
FIFO8_V02.asm ist unveraendert die Version von Dir.
Bei LernPrgrm_FIFO_TEST_V02.asm habe ich doch nur die
.equ FIFO_FROM_SERIAL_CAP = 211 anstatt die 23 geschrieben.
Die anderen Aenderungen sind in einer V03 gemacht... :-k
Hier noch der Codeabschnitt....beim Aufruf von FIFO8_WRITE.
Ist FIFO_FROM_SERIAL_CAP <64 fuellt sich der RAM, bei >64 springt er zum Ende der Prozedur (FIFO8_WR_EXIT:).
Code:
; Hauptprogramm
;
; Jetzt füllen wir mal FIFO_FROM_SERIAL mit 1,2,3,4 ... bis sie voll ist
clr r16
ldi zl,low(FIFO_FROM_SERIAL)
ldi zh,high(FIFO_FROM_SERIAL)
RS_00:
inc r16
rcall FIFO8_WRITE
brts RS_00 ; wenn Schreiben erfolgreich, weiter schreiben
; so jetzt ist sie voll
Liste der Anhänge anzeigen (Anzahl: 2)
robo_wolf,
der Grund für das Problem besteht darin, dass der ATmega beim Vergleichen von "signed integer"-Werten ausgeht. Wenn Bit7 von FIFO_CAP gesetzt ist, stellt das für ihn eine negative Zahl dar. Wenn jetzt der Zähler auch 0x00 ist - die Kapazität ist auf alle Fälle kleiner. Deshalb führt er das Programm auf direktem Weg zum EXIT.
Die Lösung des Problems habe ich in _V03 eingebaut (nicht ohne Kommentar ;-) ). Ich hoffe, das Wochenende ist gerettet!
Ciao,
mare_crisium
Liste der Anhänge anzeigen (Anzahl: 2)
Guten Abend mare_crisium,
- weiter am FIFO -
habe in den Code nun noch die beiden Prozeduren FIFO8_FLUSH und FIFO8_GETCOUNT eingefuegt.
Leider weis ich nicht genau wo und wann sie aufzurufen sind.
FIFO8_GETCOUNT kann bei jedem MAIN-Durchlauf aufgerufen werden...
FIFO8_FLUSH setzt ein Fehlverhalten voraus. Dieses muss erst erkannt werden, bevor der FIFO resetet wird.
Kannst Du mir da noch ein paar Infos geben?
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Abend robo_wolf,
ich habe Dein überarbeitetes Modul durchgesehen - die Kommentare, wie üblich, in der .asm-Datei im Anhang. Viel ist mir nicht mehr dazu eingefallen ;-) .
Die GETCOUNT und FLUSH Prozeduren braucht man erst im Zusammenhang mit der konkreten Anwendung: Bei der RS232-Anwendung, die wir planen, kommt es z.B. vor, dass eine Botschaft fehlerhaft empfangen wurde. Dann hat's keinen Sinn, viel Zeit damit zu vertun, die Botschaft Byte für Byte aus der FIFO auszulesen, nur um sie zu löschen. Mit der FLUSH-Prozedur geht das viel effektiver. Besonders bei langen FIFOs.
GETCOUNT braucht man in dieser Anwendung oft, um zu prüfen, ob die Botschaft auf dem PC richtig zusammengestellt wurde. Z.B. kommt es oft vor, dass ein bestimmter Befehl vom PC an den ATmega eine bestimmte Anzahl Bytes als Parameter braucht. Da ist es praktisch, gleich mal nachzugucken, ob genug Parameter da sind, bevor man anfängt, sich durch die Dekodierung des Befehls zu quälen.
So, wie Du siehst, geht's schon los mit der RS-232-Anwendung :-) !
Ciao,
mare_crisium
Liste der Anhänge anzeigen (Anzahl: 1)
mare_crisium,
zum Thema FIFO8_CTRL_ANFADR_* hast Du natuerlich Recht.
Fuer den Anfang war es fuer mich uebersichtlicher diese Groesse als Variable zu sehen und damit arbeiten zu koennen.
Der logische Schritt ist aber nun den Code schlanker und schneller zu machen.
...wollte eigentlich auch auf ENDADR verzichten, da ist der Code(zumindestens bei mir) deutlich mehr
Hier nun die geaenderte Version.
Liste der Anhänge anzeigen (Anzahl: 1)
robo_wolf,
so, jetzt geht's weiter. Ich habe mir Deine Version V05 vorgenommen und noch etwas verbessert (wie ich hoffe). Die Schreibprozedur kostet jetzt max. 70 und die Leseprozedur 68 Zyklen. D.h. beide bleiben bei 16MHz unter 5 Mikrosekunden. Damit sollten sie für die RS232-Anwendung fit genug sein.
Wenn Du für die RS232 einen neuen Thread aufmachen willst: Nur zu :-) !
Ciao,
mare_crisium