Hallo,
langsam bin ich am Verzweifeln.
Seit meinem letzten Post bin ich an der RS485 am basteln.
Ein 16F687 mit 8MHz als "Sender" und ein 16F1823 mit 8MHz als Empfänger wollen einfach nicht Zusammenarbeiten.
Die relevanten Einstellungen für den "Sender":
list p=16f687
include "p16f687.inc"
__CONFIG _FCMEN_OFF & _IESO_OFF & _BOR_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
;##########################################################################################
org 0x00
BSF STATUS,RP0
BSF OSCCON,IRCF2 ;\
BSF OSCCON,IRCF1 ; > Oszillatorfrequenz 8MHz
BSF OSCCON,IRCF0 ;/
BSF OSCCON,SCS ;
MOVLW 0x00
MOVWF OSCTUNE
BCF STATUS,RP0
;.......weitere Einstellungen
Befehl01 ;Unterprogramm für Taste "1"
BSF RCSTA,SPEN
BSF PORTB,0x6 ;Schaltet RS 485 (MAX487) auf "Senden"
BSF STATUS,RP0
BSF TXSTA, BRGH ;Low-speed
BSF BAUDCTL,BRG16 ;8-Bit-BRG
BCF TXSTA,TX9 ;9-Bit-Übertragung aus
BCF TXSTA,TX9D ;AdressÜbertragung aus
BCF TXSTA,SYNC ;UART im Asyncronmodus
MOVLW D'51' ;Baudrate
MOVWF SPBRG
BSF TXSTA,TXEN
BCF STATUS,RP0
MOVLW D'1' ;Eintragung des zu Sendenden Bytes
MOVWF TXREG ;Übergib Adress-Byte an den Sender
BSF STATUS,RP0
BTFSS TXSTA,TRMT
goto $-1 ;Warte, bis Byte gesendet wurde
BCF STATUS,RP0 ;RS 485 auf "Empfang" schalten
Und die Einstellungen des Empfängers:
; Empfänger: PIC 16 F 1823
list p=16f1823
include "p16f1823.inc"
__CONFIG _CONFIG1, _FCMEN_OFF & _IESO_OFF & _CLKOUTEN_OFF & _BOREN_OFF & _CPD_OFF & _CP_OFF & _WDTE_OFF & _FOSC_INTOSC
__CONFIG _CONFIG2, _LVP_OFF & _PLLEN_OFF
org 0x00
Init
;Oszillatorfrequenz einstellen
BANKSEL OSCCON
MOVLW B'01110000' ;8MHz
MOVWF OSCCON
MOVLW 0x00
MOVWF OSCTUNE
;......weitere Einstellungen
main
BANKSEL SPBRGL
BCF BAUDCON,BRG16 ;8-Bit-BRG
BSF RCSTA,SPEN ;SeriellPort ein
BSF RCSTA,CREN
BSF RCSTA,SREN ;Empfänger ein
BCF TXSTA,SYNC ;Sender: Asyncron
BCF TXSTA, BRGH ;Sender: LowSpeed
MOVLW D'51' ;Baudrate 9600 bei 8MHz
MOVWF SPBRGL
MOVLW 0x00
MOVWF SPBRGH
BANKSEL 0x00
main_1
BANKSEL 0x00
BTFSS PIR1,RCIF ;Frage das Empfangsbit ab - Etwas Empfangen: nächste Zeile Überspringen
goto main_1 ;kein Empfangsbit - der Empfänger ist leer, also zurück
BANKSEL RCSTA ;Bank 3 wählen
BTFSC RCSTA,OERR ;Überlauf-Bit abfragen - kein Überlauf: nächste Zeile Überspringen
goto Überlauf ;Überlauf! Empfänger zurücksetzen und "main_1" neu starten
BANKSEL RCSTA
BTFSC RCSTA,FERR ;Frame-error erkannt? wenn nein, dann Überspringe nächste Zeile
goto Fehler ;Frame-error! - Empfänger zurücksetzen und "main_1" neu starten
BANKSEL RCREG
MOVF RCREG,W ;kopiere Empfangsregister nach "W"
BANKSEL 0x00
;....wenn ich jetzt W auslese erhalte ich immer FF(Hex)
Warum entspricht das Empfangbyte nicht dem Sendebyte?
Wenn ich mit der Baudrate rumspiele, ist Auffällig, dass entweder ein Frame-Error kommt, oder halt "FF".
Sende ich zu schnell nacheinander, erhalte ich auch einen Überlauf, das Funktioniert soweit.
Kann mir bitte jemand helfen?
Danke, und Gruß
Jens