Forum: Haus & Smart Home Probleme CAN bekomme nur Error


von Lars K. (larsk)


Lesenswert?

Hallo ich habe ein kleines Problem mit meinem CAN-Bus. Ich habe 
folgendes aufgebaut: Einen Atmega32 mit MCP2515 und MCP2551 sowieo einen 
zweiten Knoten mit einem PCA82c250 (hatten keine zwei Gleichen).
Die RS-Leitung des MCP2551 liegt mit 0 Ohm an , GND der Bus ist an 
beiden Knoten mit 120 Ohm terminiert. Kabellängen zwischen den Knoten 
habe ich schon  verschiedene ausprobiert. Von 10cm bis 5m.
Im Loopbackmodus funktioniert alles richtig. Der Knoten sendet und 
springt dann in seine Interrupt-Routine um das Empfangene wieder 
auszulesen. Die ID ist dabei auch richtig. Sodass ich erstmal davon 
ausgehe das meine Sende- und Empfangsfunktion richtig funktioniert.
Nun aber zum Test mit zwei Knoten: Also ich hab dann einen Knoten auf 
Oneshotmodus gestellt, und schicke in einer schleife alle 5 Sekunden ein 
Paket raus. Sobald ich allerdings ein Paket losschicke, zeigt mit auf 
der Empfängerseite das CANINTF-Register ein MERRE an und der REC-Counter 
erhöht sich um 1. Wenn das Flag nun beim Empfänger lösche kommt nach den 
besagten 5 Sekunden wieder ein MERRE und der Zähler erhöht sich.
Ich hab schon einiges ausprobiert, solangsam weiß ich nicht mehr weiter 
wo ich den Fehler noch suchen soll. Vielleicht hat ja jemand einen Tip 
für mich.

Gruß

Lars

von (prx) A. K. (prx)


Lesenswert?

Unterschiede im Takt?
Interner Oszillator geht nicht.

von Lars K. (larsk)


Lesenswert?

Also,

der MCP läuft mit 16MHz Quarz. Bei den Atmegas könntest du recht haben, 
der auf der eigentlichen Platine läuft mit 8MHz extern und der auf dem 
Testboard läuft mit 8MHz intern. Das werde ich nochmal probieren, dass 
ich beiden einen externen verpasse.

Gruß

Lars

von Lars K. (larsk)


Lesenswert?

Hallo zusammen,

so ich habe es jetzt nochmal versucht. Jeder MCP2515 und jeder Atmega 
hat einen eigenen Quarz. der MCP2515 läuft mit 16MHz und der Atmega mit 
8MHz. Kein Erfolg nur Bus Error. Wie gesagt der loopbackmodus 
funktioniert, sodass auch davon auszugehen ist dass der spi bus richtig 
funktioniert. Den MCP2515 initiere ich folgendermaßen:

1
void mcp2515_init(void)
2
{
3
  PORTB &= ~(1<<PB4);
4
    spi_put_char( SPI_RESET );
5
    _delay_ms(1);
6
    PORTB |= (1<<PB4);
7
  _delay_ms(10);
8
  mcp2515_bit_modify(CANINTE,0b10100011,0xff);
9
10
  //Filter Buffer0 aus
11
    mcp2515_write_register( RXB0CTRL, (1<<RXM1)|(1<<RXM0) );
12
   
13
        //Filter Buffer0 aus
14
    mcp2515_write_register( RXB1CTRL, (1<<RXM1)|(1<<RXM0) );;
15
  
16
        //LED als Interruptsignal
17
    mcp2515_bit_modify(BFPCTRL,0b00001111,0xFF);
18
19
  // BRP = 7
20
    mcp2515_write_register( CNF1, (1<<BRP0)|(1<<BRP1)|(1<<BRP2) );
21
   
22
    // Prop Seg und Phase Seg1 einstellen
23
    mcp2515_write_register( CNF2, (1<<BTLMODE)|(1<<PHSEG11) );
24
   
25
    // Wake-up Filter deaktivieren, Phase Seg2 einstellen
26
    mcp2515_write_register( CNF3, (1<<PHSEG21) );
27
28
  // Normaler Modus + Oneshot
29
    mcp2515_bit_modify(CANCTRL,0b11101000,0b00001000);
30
   
31
}

Gruß

Lars

von Lars K. (larsk)


Lesenswert?

Hallo,

ich habs hin. Als kleinen Tip für andere: Ein Widerstand am Rs kann 
Wunder bewirken.

Gruß

Lars

von (prx) A. K. (prx)


Lesenswert?

Mit dem Takt hatte ich etwas aus der Hüfte geschossen, nämlich wenn der 
MCP seinen Takt aus einem Taktausgang des AVR bezieht und dieser intern 
getaktet wird. Allerdings ein ziemlich seltenes Szenario.

Wenn der MCP mit eigenem Quarz arbeitet reicht das, der AVR muss es 
nicht auch tun. Man kann allerdings den AVR mit einem Takt aus dem MCP 
versorgen. Nur muss man ein bischen aufpassen, dass man sich nicht 
aussperrt.

Rs an GND (nicht:offen) ist durchaus gängig, nämlich bei hoher Bitrate. 
Was sauberen Abschluss und passable Kabel voraussetzt. Unklar warum das 
bei dir Probleme macht, denn bei mindestens einem Abschluss und 10cm 
kann da eigentlich nichts schiefgehen.

von Lars K. (larsk)


Lesenswert?

Hallo,

es kann ja sein, dass es Probleme auf dem Steckbrett gibt, wenn RS an 
GND liegt und er damit Highspeed nutzt. Vielleicht liegt es auch an der 
Mischung zwischen MCP und PCA ich werde am Wochenende nochmal eine 
Platine ätzen, da hab ich dann den RS auch als 0 Ohm drauf bzw. kann ich 
da auch drauf tauschen und dann nutzte ich auch 2x dem mcp2551 
vielleicht klappt es dann auch mit 0 Ohm. Werde ich dann berichten.

Gruß

Lars

von (prx) A. K. (prx)


Lesenswert?

MCP2551 und PCA82C250 kooperieren erfahrungsgemäss problemlos.

von Lars K. (larsk)


Lesenswert?

Naja,
wichtig ist es, dass es nun läuft. :-)

von Ich (Gast)


Lesenswert?

Bittiming bei beiden richtig eingestellt?
Mach aus den 10cm Leitung mal 10m, wenns dann wieder nicht mehr 
funktioniert würde ich in der Richtung nochmals suchen.

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.