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