T.J.
09.12.2007, 14:58
Hallo liebe Forenuser,
ich bin mal wieder dabei Daten per CAN Bus von einem Controller zum anderen zu senden. Nun bin ich wieder bei einem ungelösten Problem angelangt und benötige bitte euren RAT.
Also folgendes:
Ein PIC (2685) sendet CAN Botschaften einfacher Art, 1Byte groß, an einen PIC4685. Es gibt zwei verschiedene Nachrichten, eine mit ID 32 und eine mit ID 64 (sind jeweils temperaturwerte).
Zum Problem, das ganze funktioniert wie gewünscht unter einer Bedingung:
im Empfangsregister (des Empfangsmoduls) ist configuriert, dass er ALLE Nachrichten empfangen soll. Dann löst eine ankommende Nachricht einen Interrupt aus und alles weiter funktioniert. IDs korrekt, Inhalt korrekt.
Um fehler abzufangen möchte ich aber konfigurieren, dass er nur alle "valid" Nachrichten empfangen soll. Also alle nach Maske und Filter eingestellten korrekten Nachrichten. Wenn ich das einstelle wird keine einzige Nachricht mehr empfangen :(
Obwohl die Maske auf FF und die Filter auf die IDs, die er auch empfängt, kalibriert sind.
anbei meine config des CAN-Moduls wie es sein sollte, aber nichts empfangen wird. Könnt ihr mir bitte helfen wie ich das Problem lösen kann? Ich weiß echt nicht mehr weiter. Hardwarefehler möchte ich auch nicht ausschließen, wenn jemand eine Idee hat bitte einfach schreiben. Vielen Dank schonmal fürs Lesen!
set_can:
; Konfiguration der CAN-Schnittstelle
movlw 0x80 ; 1000 0000
movwf CANCON ; Config-Mode, RxB0-Buffer auf AccessBank
waitforcfg:
btfss CANSTAT,7 ; Konfiguratonsmodus erreicht?
goto waitforcfg ; nein, warten...
movlw 0x04
movwf BRGCON1
clrf BRGCON2
clrf BRGCON3
;
clrf RXB0CON ; 0000 0000
; bsf RXB0CON,2 ; Double-Buffer EN
; bsf RXB0CON,6
; bsf RXB0CON,5 ; receive only valid msg with STD ID
clrf RXB1CON
; bsf RXB1CON,5 ; receive only valid msg with STD ID
;
movlw 0x20 ; Filter 0 fuer temp_board (32)
movwf RXF0SIDL
clrf RXF0SIDH
movlw 0x40 ; Filter 1 fuer temp_ofen (64)
movwf RXF1SIDL
clrf RXF1SIDH
movlw 0xFF ; Maske setzen
movwf RXM0SIDH
movlw 0xFF
movwf RXM0SIDL
;
movlw 0x00 ; 0000 0000
movwf CANCON ; Normalen Can-Mode aktivieren
;
bsf RCON, 7 ; Priorisierung aktivieren
bsf INTCON, 7 ; Global Int aktivieren
bsf INTCON, 6 ; Peripherie Int aktivieren
bsf PIE3, 0 ; Interrupt für RXB0 aktivieren
bsf IPR3, 0 ; Hohe Priorität für RXBO-int
bcf LATB,4 ; MCP2551 einschalten
return
ich bin mal wieder dabei Daten per CAN Bus von einem Controller zum anderen zu senden. Nun bin ich wieder bei einem ungelösten Problem angelangt und benötige bitte euren RAT.
Also folgendes:
Ein PIC (2685) sendet CAN Botschaften einfacher Art, 1Byte groß, an einen PIC4685. Es gibt zwei verschiedene Nachrichten, eine mit ID 32 und eine mit ID 64 (sind jeweils temperaturwerte).
Zum Problem, das ganze funktioniert wie gewünscht unter einer Bedingung:
im Empfangsregister (des Empfangsmoduls) ist configuriert, dass er ALLE Nachrichten empfangen soll. Dann löst eine ankommende Nachricht einen Interrupt aus und alles weiter funktioniert. IDs korrekt, Inhalt korrekt.
Um fehler abzufangen möchte ich aber konfigurieren, dass er nur alle "valid" Nachrichten empfangen soll. Also alle nach Maske und Filter eingestellten korrekten Nachrichten. Wenn ich das einstelle wird keine einzige Nachricht mehr empfangen :(
Obwohl die Maske auf FF und die Filter auf die IDs, die er auch empfängt, kalibriert sind.
anbei meine config des CAN-Moduls wie es sein sollte, aber nichts empfangen wird. Könnt ihr mir bitte helfen wie ich das Problem lösen kann? Ich weiß echt nicht mehr weiter. Hardwarefehler möchte ich auch nicht ausschließen, wenn jemand eine Idee hat bitte einfach schreiben. Vielen Dank schonmal fürs Lesen!
set_can:
; Konfiguration der CAN-Schnittstelle
movlw 0x80 ; 1000 0000
movwf CANCON ; Config-Mode, RxB0-Buffer auf AccessBank
waitforcfg:
btfss CANSTAT,7 ; Konfiguratonsmodus erreicht?
goto waitforcfg ; nein, warten...
movlw 0x04
movwf BRGCON1
clrf BRGCON2
clrf BRGCON3
;
clrf RXB0CON ; 0000 0000
; bsf RXB0CON,2 ; Double-Buffer EN
; bsf RXB0CON,6
; bsf RXB0CON,5 ; receive only valid msg with STD ID
clrf RXB1CON
; bsf RXB1CON,5 ; receive only valid msg with STD ID
;
movlw 0x20 ; Filter 0 fuer temp_board (32)
movwf RXF0SIDL
clrf RXF0SIDH
movlw 0x40 ; Filter 1 fuer temp_ofen (64)
movwf RXF1SIDL
clrf RXF1SIDH
movlw 0xFF ; Maske setzen
movwf RXM0SIDH
movlw 0xFF
movwf RXM0SIDL
;
movlw 0x00 ; 0000 0000
movwf CANCON ; Normalen Can-Mode aktivieren
;
bsf RCON, 7 ; Priorisierung aktivieren
bsf INTCON, 7 ; Global Int aktivieren
bsf INTCON, 6 ; Peripherie Int aktivieren
bsf PIE3, 0 ; Interrupt für RXB0 aktivieren
bsf IPR3, 0 ; Hohe Priorität für RXBO-int
bcf LATB,4 ; MCP2551 einschalten
return