www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit RS232 und PIC


Autor: Rico (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte mit dem PIC16F627 8 LEDs über die RS232 Schnittstelle des
PCs steuern. Die Verbindung mit der seriellen Schnittstelle erfolgt
über einen MAX232. Der PIC ist mit 4Mhz getaktet. Den asm Code habe ich
mal angehangen.
Das Problem ist nun, dass das, was der PIC empfängt nichts mit dem zu
tun hat, was ich ihm gesendet habe, d.h. die LEDs zeigen was völlig
anderes an. Deshalb habe ich das Programm so geändert, dass der PIC das
empfangene Byte gleich wieder an den PC zurückschickt. Dabei musste ich
feststellen, dass das zurückgesendete Byte auch falsch ist. Aber das
schlimmste ist, dass das zurückgesendete Byte auch nicht mit dem
übereinstimmt, was die LEDs anzeigen.
Ich habe auch schon verschiedene Geschwindigkeiten ausprobiert, das
brachte aber keine Veränderung.

Ich hoffe Ihr könnt mir dabei weiterhelfen.

Danke, Rico.

Autor: Chief Brady (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Rico,

1.  Der Programmspeicher beginnt bei 0x0005. Also zuerst:

  org   0x0001       ; nach reset
  goto  Init         ;   bei Init starten
; org   0x0004       ; wenn verwendet
; goto  interrupt    ; /

Init
  :

2.  'movfw' gibt es beim 16F62x nicht. Gerade als Anfänger sollte man
sich an das Datenblatt halten. In diesem fall heisst es eigentlich

  movf   RCREG, W   ; RCREG nach W


Aber dein Problem hört sich nach unterschiedlicher Bautrate (PIC <->
PC) an. Dazu würde ich empfehlen, beim Empfang auf Framing- und
Overflow-Error zu prüfen. Ausserdem ist bei 4MHz und 9600Bd die
Fehlerrate klainer (0,16%) gegenüber 2400Bd (1,67%). das sollte man
auch immer beachten.

Andreas

Autor: Rico (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas,

danke erstmal für deine schnelle Antwort. Dass es beim PIC16F62x keinen
'movfw'-Befehl gibt habe ich nicht gewusst. Jedenfalls habe ich die
asm Datei entsprechend korrigiert, aber leider ohne Erfolg, es hat sich
nichts geändert.
Ich weiß jetzt nicht, was du mit Framing- bzw Overflow Error meinst.
Ich verwende zum Testen ein Programm aus dem Internet ('HTerm'), dort
werden mir keine Fehler angezeigt.
Wegen der Übertragungsgeschwindigkeit, da habe ich auch schon andere
versucht (19200, 9600, 2400), es kam immer das gleiche raus.

ich habe hier mal ein paar Werte vielleicht sagt euch das ja was:

gesendet     empfangen    LED-Anzeige
00000000     00000000     11100000
00000010     00000011     11100001
00000100     00000100     11100010
00001000     00000000     11100000
00010000     00011000     11100100
11111111     11111111     11111111

Wie man sieht stimmen manche Werte überein und andere nicht. Das sind
aber wahrscheinlich keine zufälligen Ergebnisse, denn ich habe die
Werte jeweils mehrmals hintereinander geschickt und es kam immer das
gleiche zurück. Ich habs auch schon an einem anderen Rechner versucht,
auch hier warens die gleichen Werte.

Danke, Rico.

Autor: Chief Brady (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Setz mal TX als Ausgang (in deiner INIT-Section):

  movlw  B'11000010'
  movwf  TRISB

Ich meine Error-Handling beim PIC( due weisst sonst nicht, ob das Byte
korrekt empfangen wurde. Z.B. so:

Main
  btfss   PIR1,RCIF  ; sind Daten da ?
  goto    Main    ; nein, noch keine Daten da

  btfsc   RCSTA,OERR  ; Overrun Error ?
  bsf     PORTB,4       ; ja, O-ERR LED AN

  btfsc   RCSTA,FERR  ; Framing Error
  bsf     PORTB,5       ; ja, F-ERR LED AN

  movf    RCREG, W  ; RS232-Register auslesen
  bcf     PIR1,RCIF
  call    ShowByte  ; empfangenes Byte auf den LEDs ausgeben
  goto    Main

Autor: Der Elektrische Reiter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

die Einstellung für die Bautrate ist aus meiner Sicht i.O. bei 4Mhz
scheit dies die max. mögliche Bautrate im asynchren Betrieb zu sein.
Die Baudarte 9600 ist in meinem Datenblatt nicht definiert. Der
entsprechende Auszug aus dem Datasheet ist angehängt.

Die Konstante zur Einstellung der Baudrate ist jedoch vom Zahlensystem
her nicht Qualifiziert. Der Assembler abreitet deshalb mit dem
Standard-System. Das kann man irgendwo bei den Proejkt-Properties
einstellen. Bitte prüfe deshalb ob dein Assembler auch tatsächlich
dezimal meint. Am einfachsten, Du legst das Zahlensystem bei Konstanten
immer explizit fest. In Deinem Fall wäre das dann:

     movlw  d'25'

cu

Autor: Rico (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Jetzt klappt es :-).
Es lag tatsächlich an dem

movlw  d'25'

Vielen Dank euch für die schnelle Hilfe, echt super!

Rico.

Autor: Chief Brady (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Baudarte 9600 ist in meinem Datenblatt nicht definiert. Der
> entsprechende Auszug aus dem Datasheet ist angehängt.

Na, dann blättere doch einfach eine Seite weiter:
Table 12-5: BAUD RATES FOR ASYNCHRONOUS MODE (BRGH=1)

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.