Forum: Mikrocontroller und Digitale Elektronik CAN-Bus Zickiger bei df als RS232?


von flyingwolf (Gast)


Lesenswert?

Ein guten Abend allen Abstinezlern der ermüdenden Fernsehunterhaltung.
Ich habe jetzt ca. 2 Wochen nach dem Fehler in meiner Schaltung gesucht.
Basis des Ganzen ist ein 90CAN128 mit etwas Krimskrams drum herum und 
einem 8Mhz Quarz. Nun wollte ich mir noch ganz auf die Schnelle einen 
Adapter zaubern über den ich via RS232 alles sehe was so auf dem CAN-Bus 
vorgeht. Weil ich die Daten schnell vom Proz. weg haben wollte, um 
nichts zu verpassen habe ich aber im Lauscher einen 11.059 MHz Quarz 
verbaut, um schneller als 38.800 Baud auf der RS232-Seite sein zu 
können.
Um erst einmal die Funktion hinzubekommen habe ich mir gedacht, ich 
benutze den internen Oszillator, schreibe das OSCAL-Byte und wenn es der 
RS232 - Schnittstelle reicht, sollte es auch dem CAN-Bus reichen.
Nach Tagen erfolgloser Suche habe ich durch Zufall festgestellt, dass 
ein zyklisch alle Sekunde aus dem Lauscher gesendetes Signal ein paar uS 
zu früh kam. Das OSCCAL Byte von 0x5e auf 0x5d verändert löste das 
Problem schalgartig.
Nun meine Frage dazu.
Weil es noch keine funktionstüchtigen CAN-Libs von Atmel gab, als ich 
mit dem CAN90128 angefangen habe herumzubasteln habe ich mir selber was 
geschustert, was bisher ganz gut funktionierte.

Kann es sein dass ich bei der Programmiererei zu oberflächlich war, das 
mein CAN-Bus so zickig auf die Frequenzabweichung reagiert hat?
Kann man das verändern, anpassen, tolleranter gestalten?

Ich hänge mal meine Initialisierung an ...
1
#define init_mob_rx_0 init_mob_rx(0,8192,536862720);    // einkürzen des Befehls, damit Tag und Mask nicht immer mit eingegeben werden müssen. 
2
3
void Can_bit_timing (void)
4
{
5
CANBT1= 0x08;
6
CANBT2= 0x0C;
7
CANBT3= 0x37;
8
}
9
10
void can_init (void)
11
{
12
  Can_bit_timing();
13
  Can_clear_all_MOB();
14
  setbit(CANGCON,1);                   //Can_enable  
15
  
16
  if (Controller_ID > 0) candriver_enable;        //Hardware-Enable
17
18
  CANGIE = 0xa0;     //freigabe für Receive Interrupt + global interrupt
19
  CANIE2 = 0x0f;     // freigabe Interrupt MOB0 - 4
20
  init_mob_rx_0;
21
}

von flyingwolf (Gast)


Lesenswert?

Falls jemand mal die Antwort auf die Frage suchen sollte.
Es besteht die Möglichkeit, den CAN etwas tolleranter zu gestalten. Im 
CANBT2  -Register sind dazu die SJW - Bits entsprechend zu setzen. In 
den Beispielen sind die immer 0 und damit sehr zickig bei 
Frequenzabweichungen.
Das 12MHz Beispiel passt nicht für 11.0542MHz Quarz.
Zu Fuss rechnen ist hier unerläßlich.

von MNR (Gast)


Lesenswert?

Ich habe meinen CANSniffer mit 16MHz getaktet, damit kann ich über die 
RS232 500KBit (oder 250Kbit oder 1MBit) fahren. Damit schaffe ich auch 
die Daten schnell genug weg, wenn der CAN Bus mit z.B. 500KBit läuft.

Allerdings habe ich auch andere HW als du. Mit den krummen Baudwerten 
wollte ich mich aber nicht herumschlagen müssen...

von Peter D. (peda)


Lesenswert?

Für CAN nimmt man in der Regel Quarze mit glatten MHz.

Krumme Quarze oder den internen RC sollte man sich nicht antun, wenn man 
die Produkte verkaufen will.

11,05MHz sollte genau so gehen, wie 11,00MHz.
Mein Softwerker hat mich aber zu 16MHz überredet.


Peter

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.