Forum: Mikrocontroller und Digitale Elektronik 16f88 daten frame mit 22Byte bearbeiten


von benjamin (Gast)


Lesenswert?

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?

von Vlad T. (vlad_tepesch)


Lesenswert?

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.

von Sascha (Gast)


Lesenswert?

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

von benjamin (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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

von Benjamin (Gast)


Lesenswert?

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

von Dieter W. (dds5)


Lesenswert?

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.

von Benjamin (Gast)


Lesenswert?

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

von Benjamin (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.