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.
Vielleicht: ... 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 movf RCREG,w movwf INDF incf FSR,f decfsz Zähler,f goto MAIN movf Daten+20,w movwf Byte goto MAIN
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.