Hallo,
ich programmiere einen PIC 16f88 in Assembler.
Mein Problem ist folgendes:
1.)Leider bin ich noch ein Anfänger!
2.)Ich bekomme über die USART Schnittstelle ein 22Byte langes
Datenpaket.
(7E 00 12 92 00 13 A2 00 40 2D A8 39 3D 35 01 01 08 00 00 08 00 E6)
Mich interessiert eigentlich nur die beiden vorletzten Bytes. Wie kann
ich dieses Datenpaket speichern um es weiter bearbeiten zu können?
Ich habe an eine Art Array gedacht. Weiß aber nicht wie ich das am
einfachsten hin bekomme.
Meine Ansätze sehen so aus:
daten equ 0x20
main btfss PIR1,RCIF
goto main
movfw RCREG
movwf daten
Das klappt natürlich so nicht. Komme aber nicht weiter!
Habe einen Tipp mit der indirekten Adressierung bekommen, aber die
verstehe ich nicht. Verstanden habe ich das soweit:
Ich vergebe eine absolute Adresse 0x20 und speichere die Adresse in dem
Register FSR
daten equ 0x20
movlw daten
movwf FSR
main btfss PIR1,RCIF
goto main
movfw RCREG
movwf INDF
Das Register INDF soll dann auf die Adresse von FSR zeigen. Aber wie
kann ich damit ein Art Array basteln, damit ich das Byte 20 und 21
verarbeiten kann?
wenn dich wirklich nur die letzten interessieren, dann zähl doch eine
Variable hoch und wenn du bei 21 und 22 angekommen bist, speicherst du
die empfangenn Bytes in registern/variablen.
den rest brauchst du doch nicht zu speichern.
mit der adressierung.
wenn in einem Register eine adresse steht, dann kannst du sihcer mit
irgend einem Asm-Befehl, an die adresse etwas schreiben, oder laden
(üblicherweise heißen die mov, load, store, oder so).
dh, wenn du ein byte empfängst, dann schreibst du es so an die adresse,
die in dem register steht.
anschließend erhöhst du den registerinhalt. nun zeigt das register auf
die nächste speicherzelle.
Du musst vorher natürlich sicherstellen, dass die anfangsadresse an eine
gültige stelle zeigt. also weder in den bereich, wo die register
reingemappt sind, noch an stellen, wo kein speicher ist. Hier ist ein
Blick ins Datenblatt notwendig. Da gibts normalerweise eine memorymap.
> Das Register INDF soll dann auf die Adresse von FSR zeigen.> Aber wie kann ich damit ein Art Array basteln, damit ich> das Byte 20 und 21 verarbeiten kann?
Für zwei Bytes lohnt sich ein Array-Gebastel nicht. Wie Vlad Tepesch
schon gesagt hat, zähl die empfangenen Bytes mit und speicher die beiden
vorletzten Bytes in irgendwelche Speicherzellen.
Desweiteren scheinst du noch nicht ganz verstanden zu haben, wie das mit
FSR und INDF funktioniert. Les dir doch mal das Datenblatt etwas genauer
durch.
Ich habe jetzt versuch eine Zählschleife zu bauen.
Ich zähle bis 20 und möchte dann den Wert aus RCREG in das Register
Daten speichern.
Zähler equ 0x20
Daten equ 0x22
movlw d’20’
movwl Zähler
loop btfss PIR1,RCIF
decfsz Zähler,1
goto loop
movfw RCREG
movwf Daten
clrf Zähler
Würde das so funktionieren?
benjamin schrieb:
> (7E 00 12 92 00 13 A2 00 40 2D A8 39 3D 35 01 01 08 00 00 08 00 E6)> Mich interessiert eigentlich nur die beiden vorletzten Bytes.
Dann interessiert als erstes, woher Du weißt, welches diese beiden Bytes
sind.
D.h. Du mußt das Protokoll implementieren, nachdem man einen Paketbeginn
feststellen kann.
Du schaltest ja Deinen MC irgendwann ein, bzw. steckst irgendwann die
Verbindung zum Sender. Und das kann dann inmitten eines Paketes
passieren.
Einfaches Zählen bis 22 reicht also nicht. Du brauchst quasi einen Reset
für diesen Zähler.
Peter
Hallo ich bins nochmal.
Ich bekomme meine 22 Bytes immer noch nicht gespeichert.
Kann mir jemand weiter helfen?
Ich wollte es über die indirekte Adrssierung realisieren.
Empfangene Bytes auslesen und alle in den RAM speichern.
Und dann das 20. Byte in der Variable Byte speichern um es
weiter zu verarbeiten.
...
Zähler equ 0x20
Byte equ 0x21
Daten equ 0x30
...
movlw D'22'
movwf Zähler
movlw Daten
movwf FSR
...
MAIN btfss PIR1,RCIF
goto MAIN
EMPFANG movf RCREG,w
movwf INDF
incf FSR,f
decfsz Zähler,f
goto EMPFANG
movf Daten+20,w
movwf Byte
Das funktioniert leider nicht!!!!!! ;-(
Peter: Das ich den MC während eines Datenempfanges einschalte, schließe
ich mal aus.
MfG
So wie das im Moment aussieht, liest die EMPFANG Routine 22 mal
hintereinander das (nach dem ersten Lesen leere) RCREG aus und speichert
die Werte ab 0x30 aufwärts ab.
Du solltest schon auf das nächste ankommende Zeichen warten, bevor RCREG
wieder gelesen wird.
Peter du hattest erwähnt das ich einen Reset für meinen Zähler brauche.
Wie realisiere ich das denn? Ich kriege das nicht zusammengebastelt.
Du hattest nämlich Recht, denn ich bekomme auch noch andere Daten
gesendet, die mich nicht interessieren. Diese Daten können auch kürzer
sein. Dann kommt mein Zähler naürlich durcheinander.
Kann mir auch jemand einen Tipp geben, warum das Auswerten meiner Daten
nur einmal im Simulator funktioniert.
MfG