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 | }
|