Forum: Mikrocontroller und Digitale Elektronik CANBUS MCP2515 PIC Problem


von Bluebird (Gast)


Lesenswert?

Hallo

Ich versuche seit längerer Zeit den CAN bus baustein mcp2515 zum laufen 
zu bringen.
Leider habe ich bis heute ein erfolg bei der sache gehabt.
Ich habe mir schon den Artiekel von Kreatives Chaos angeschaut aber 
irgendwie komme ich damit nicht zurecht.

Jetzt meine Frage:

Wie muss ich den MCP2515 Installieren damit er Daten vom Can bus 
empfangen kannn..
gibt es dazu eine Step BY Step Anleitung ?
bz:
Addr 0x00 = ff
 usw

Danke für eure Hilfe

von (prx) A. K. (prx)


Lesenswert?

Der Artikel im Kreativen Chaos ist doch schon eine recht detaillierte 
Schritt für Schritt Anleitung?!

von Bluebird (Gast)


Lesenswert?

hallo
So das ist mein Programm das ich geschrieben habe
aber leider kann ich am can bius nix ampfangen
was habe ich falsch gemacht ?

ps. Das Programm ist in Basic geschrieben


'********************************
'Can bus test file 1
'********************************
Config PORTD.0 = Output  'led 1
Config PORTD.1 = Output  'LED 2
Symbol led1 = PORTD.0
Symbol led2 = PORTD.1

AllDigital

Define SPI_CS_REG = PORTB
Define SPI_CS_BIT = 4
Define SPI_SCK_REG = PORTB
Define SPI_SCK_BIT = 1
Define SPI_SDI_REG = PORTB
Define SPI_SDI_BIT = 0
Define SPI_SDO_REG = PORTC
Define SPI_SDO_BIT = 7
SPIPrepare

  SPICSOff
PORTB.4 = 1
WaitMs 5
loop:
'**********************************
'SPICSOn
'WaitMs 10
'**********************************
'/ MCP2515 per Software Reset zuruecksetzten,
'// danach ist der MCP2515 im Configuration Mode
SPICSOn
led1 = 1
SPISend 0xc0
'WaitMs 1
SPICSOff
led1 = 0
'/ etwas warten bis sich der mcp2515 zurueckgesetzt hat
WaitMs 10
'* einstellen des Bit timings
'/ prop seg und phase seg1 einstellen
'mcp2515_write_register(cnf2,(1 < < btlmode) |(1 < < phseg11)) ;
SPICSOn
SPISend 0x2a
SPISend %11
WaitMs 1
SPICSOff
'/ / wake - up filter deaktivieren, phase seg2 einstellen
'mcp2515_write_register(cnf3,(1 < < phseg21)) ;
SPICSOn
SPISend 0x28
SPISend %1
WaitMs 1
SPICSOff
'/ / aktivieren der rx buffer interrupts
'mcp2515_write_register(caninte,(1 < < rx1ie) |(1 < < rx0ie)) ;
SPICSOn
SPISend 0x2b
SPISend %11
WaitMs 1
SPICSOff
'* einstellen der filter
'/ / buffer 0: empfangen aller nachrichten
'mcp2515_write_register(rxb0ctrl,(1 < < rxm1) |(1 < < rxm0)) ;
SPICSOn
SPISend 0x60
SPISend %11
WaitMs 1
SPICSOff
'/ / buffer 1: empfangen aller nachrichten
'mcp2515_write_register(rxb1ctrl,(1 < < rxm1) |(1 < < rxm0)) ;
SPICSOn
SPISend 0x70
SPISend %11
WaitMs 1
SPICSOff
'/ / alle bits der empfangsmaske loeschen,
'/ / damit werden alle nachrichten empfangen
'mcp2515_write_register(rxm0sidh, 0) ;
SPICSOn
SPISend 0x20
SPISend 00
WaitMs 1
SPICSOff

'mcp2515_write_register(rxm0sidl, 0) ;
SPICSOn
SPISend 0x21
SPISend 00
WaitMs 1
SPICSOff

'mcp2515_write_register(rxm0eid8, 0) ;
SPICSOn
SPISend 0x22
SPISend 00
WaitMs 1
SPICSOff

'mcp2515_write_register(rxm0eid0, 0) ;
SPICSOn
SPISend 0x23
SPISend 00
WaitMs 1
SPICSOff

'mcp2515_write_register(rxm1sidh, 0) ;
SPICSOn
SPISend 0x24
SPISend 00
WaitMs 1
SPICSOff

'mcp2515_write_register(rxm1sidl, 0) ;
SPICSOn
SPISend 0x25
SPISend 00
WaitMs 1
SPICSOff

'mcp2515_write_register(rxm1eid8, 0) ;
SPICSOn
SPISend 0x26
SPISend 00
WaitMs 1
SPICSOff

'mcp2515_write_register(rxm1eid0, 0) ;
SPICSOn
SPISend 0x27
SPISend 00
WaitMs 1
SPICSOff


'/ / deaktivieren der pins rxnbf pins(High impedance state)
'mcp2515_write_register(bfpctrl, 0) ;
SPICSOn
SPISend 0x0c
SPISend 00
WaitMs 1
SPICSOff

'/ / txnrts bits als inputs schalten
'mcp2515_write_register(txrtsctrl, 0) ;
SPICSOn
SPISend 0x0d
SPISend 00
WaitMs 1
SPICSOff

'/ / device zurueck in den normalen modus versetzten
'mcp2515_bit_modify(canctrl, 0xe0, 0) ;
SPICSOn
SPISend 0x0f
SPISend 00
WaitMs 1
SPICSOff

'*********************************************************************** 
*4

'/ * verschickt eine nachricht ueber puffer 0
'* 2 datenbytes (0x04, 0xf3)
'* standard id: 0x0123
'*/
'uint16_t id = 0x0123;

'/* Nachrichten Puffer auf Hoechste Prioritaet einstellen
'(braucht man nicht wenn man nur mit einem puffer sendet, siehe text) */
'mcp2515_bit_modify( txb0ctrl, (1<<txp1)|(1<<txp0), (1<<txp1)|(1<<txp0) 
);
SPICSOn
SPISend 0x30
SPISend %1111
WaitMs 1
SPICSOff

'// ID einstellen
'mcp2515_write_register(txb0sidh, (uint8_t) (id>>3));
SPICSOn
SPISend 0x31
SPISend %111
WaitMs 1
SPICSOff


'mcp2515_write_register(txb0sidl, (uint8_t) (id<<5));
SPICSOn
SPISend 0x32
SPISend %111
WaitMs 1
SPICSOff

'// Nachrichten Laenge + RTR einstellen
'mcp2515_write_register(txb0dlc, 2);
SPICSOn
SPISend 0x35
SPISend 2
WaitMs 1
SPICSOff

'// Daten
'mcp2515_write_register(txb0d0, 0x04);
SPICSOn
SPISend 0x36
SPISend 0x04
WaitMs 1
SPICSOff

'mcp2515_write_register(txb0d1, 0xf3);
SPICSOn
SPISend 0x37
SPISend 0xf3
WaitMs 1
SPICSOff

'// CAN Nachricht verschicken
'port_cs &= ~(1<<p_cs);
'spi_putc(spi_rts | 0x01);
'port_cs | = (1 < < p_cs) ;
SPICSOn
SPISend 0x80
SPISend 0x01

WaitMs 1
SPICSOff

von (prx) A. K. (prx)


Lesenswert?

Bluebird schrieb:

> ps. Das Programm ist in Basic geschrieben

Erklärt immerhin, weshalb du mit dem KC-Artikel nicht so arg viel 
anfangen kannst.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.