Forum: Mikrocontroller und Digitale Elektronik RS232 mehrere Bytes mit PIC empfangen


von hofi (Gast)


Lesenswert?

Habe folgendes Programm zum Empfangen von mehreren aneinander hängenden
ASCII-Zeichen für den PIC geschrieben. Es ist zur Zeit nur ziemlich
einfach und ohne diverse extras, jedoch kann zum beispiel der name
mittels hyperterminal übertragen werden. Sollte der Name oder eben die
Zeichenfolge länger als ungefähr zehn Bytes sein werden falsche Bytes
empfangen. Der Fehler ist jedoch nicht immer an der gleichen Stelle
darum weis ich jetzt nicht mehr weiter.

Hier mal das Hauptprogramm, da ich nicht denke dass es an der init
liegt:

main
  btfss    PIR1,5
        goto    main
loop1  movf    RCREG,w
  movwf    INDF
  incf    FSR,f
  movf    FSR,w
        sublw    .50
  btfsc    STATUS,Z
  goto    loop1
  goto     main

Waron könnte der Fehler liegen????

von Thomsi T. (thomsi)


Lesenswert?

poste mal ganzen code plz

von Thomsi T. (thomsi)


Lesenswert?

...

von Thomsi T. (thomsi)


Lesenswert?

keiner eine ahnung würd mich nämlich auch interessieren ..

von Dieter W. (dds5)


Lesenswert?

Also woran liegt denn nun der Fehler ?

Die Endlosschleife bis PIR1,5 (RCIF) gesetzt wird ist im Prinzip schon
mal richtig.
Das empfangene Byte (RCREG) wird über w nach INDF gespeichert. Auf
welche Adresse wurde FSR denn initialisiert ?
Durch das Lesen von RCREG wird PIR1,5 wieder auf 0 gesetzt.
Mit incf FSR,f zeigt dieses auf die nächsthöhere Adresse. Auch gut.

Aber was soll denn bitteschön dieser Code bewirken ?

  sublw   .50
  btfsc   STATUS,Z
  goto    loop1
  goto    main

Vielleicht doch mal den vollständigen Code posten, das könnte positve
Auswirkungen auf eine brauchbare Lösung haben.

von HOFI (Gast)


Lesenswert?

@ Dieter Werner
 "Aber was soll denn bitteschön dieser Code bewirken ?

  sublw   .50
  btfsc   STATUS,Z
  goto    loop1
  goto    main"
Mit diesem Teil wir die Anzahl der auf einmal zu empfangenden Bytes
festgelegt.

Hier ist der komplette Code (nur mal eine erste Version ohne
GLiederung,etc.)

#include <p16f88.inc>



  MOVLW 0x51       ;initialize pointer
  MOVWF FSR       ;to RAM

init
  movlw     b'00000000'      ; all ports low
  movwf     PORTA
  movlw     b'00000000'      ; all ports low
  movwf    PORTB


  bsf     STATUS,RP0      ; switch to bank 1
  movlw    b'00000000'
  movwf    TRISA
  movlw    b'00000100'
  movwf    TRISB

  bcf     STATUS,RP0      ; switch to bank 0

  banksel    SPBRG    ; switch to the bank of SPBRG
  movlw    .25
  movwf    SPBRG      ; set baudrate to 9600

  banksel    TXSTA
  bsf      TXSTA,2    ; set BRGH for High Speed Baud rate
  bcf      TXSTA,4    ; enable asynchronous serial port
  banksel    RCSTA
  bsf      RCSTA,7    ; enable asynchronous serial port
  bsf      RCSTA,4    ; enable reception
  banksel    PORTA
main
  bcf     STATUS,RP0      ; switch to bank 0
  NOP
  btfss    PIR1,5        ; bit test file skip if something is send
  goto    main
loop1
  NOP
  NOP
  movf    RCREG,w      ; mov data to working
  movwf    INDF      ; mov working to EMPFANG
  incf    FSR,f
  movf    FSR,w      ; move EMPFANG to working
  sublw    .50        ; subtartc EMPFANG -E
  btfsc    STATUS,Z
  goto    loop1

  goto     main        ; go to  main

  end

von Thomsi T. (thomsi)


Lesenswert?

interessant

von Dieter W. (dds5)


Lesenswert?

>  movf    FSR,w
>  sublw   .50
>  btfsc   STATUS,Z
>  goto    loop1
>  goto    main

>Mit diesem Teil wird die Anzahl der auf einmal zu empfangenden Bytes
festgelegt.

Ähem, das wage ich zu bezweifeln.
Die Funktion dieses Programmstücks ist nichts anderes, als bei FSR = 50
die loop1 so oft zu wiederholen bis FSR <> 50 ist, und das ist genau
einmal. Als Effekt würde nur das Datenbyte von Adresse 50 nochmal auf
51 geschrieben.

SPBRG = 25 passt für 4MHz Takt, es sollte aber auf jeden Fall ein
Quarz(oszillator) verwendet werden sonst kann das Timing zu stark
abweichen.
Wenn der PIC später mal noch andere Sachen erledigen soll, benutzt man
besser einen Interrupt um das Byte im Speicher abzulegen (zählt aber
dann schon zu den fortgeschrittenen Programmiertechniken).

Ein echter Tip in Bezug auf die Fehlfunktion war aus dem Code nicht zu
gewinnen, sieht soweit fürs erste brauchbar aus.

Viel Erfolg beim weiteren Programmieren.

von Thomsi T. (thomsi)


Lesenswert?

kann mich dieter nur anschließen ...

von Geri (Gast)


Lesenswert?

Hallo

Nur ein Hinweis: Für den PIC gibt es auch günstige C-Compiler.
Abgesehen davon, dass man die Internals des PIC ein wenig besser kennen
lernt erscheint mir nur die Codegrösse und Geschwindigkeit ein Vorteil.
Leztere beide sind aber in vielen Fällen nicht relevant und manche
Compiler sind in der Umsetzung auch recht effizient.
Letztlich kann man seinen Code (je nach Programmierstil) auch besser
portieren und man gelangt schneller ans Ziel. Für die RS232 gibt es
bereits eine Menge fertige Libraries.

Wenn du nicht Asm musst, dann würde ich heutzutage eher C empfehlen.

Freundliche Grüsse
Geri

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.