www.mikrocontroller.net

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


Autor: hofi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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????

Autor: Thomsi Thomsi (thomsi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
poste mal ganzen code plz

Autor: Thomsi Thomsi (thomsi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...

Autor: Thomsi Thomsi (thomsi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
keiner eine ahnung würd mich nämlich auch interessieren ..

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: HOFI (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomsi Thomsi (thomsi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
interessant

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomsi Thomsi (thomsi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mich dieter nur anschließen ...

Autor: Geri (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.