Gast
#32681
Also ich habe hier einen ATMega163 mit Phillipps SJA1000 CAN Controller und Display. Als "Gegenstelle" habe ich einen AT90S4433 nur mit SJA1000. Einzeln funktioniert alles wunderprächtig. Testweise schicke ich vom ATmega eine CAN Message los, die der 4433 empfangen soll und genauso wieder zurückschicken soll. Zur Kontrolle wird die CAN Message dann auf dem Display angezeigt. Ich erhalte auf dem Display die richtige Anzeige, also funktioniert die Kette "msg hinschicken, empfangen, zurückschicken, empfangen, auf dem Dispaly ausgeben" korrekt. Mache ich daraus eine Endlosschleife wirds kurios. Also der Atmega schickt die soeben empfangene Nachricht wieder zum 4433 und der wieder zurück und der Mega zeigt se wieder am Display an und schickt se wieder zum 4433. Also ping pong mit CAN. Die CAN Controller melden keine Busfehler, aber die Messagebytes verschieben sich immer mehr nach links! Meine Testmessage sieht so aus 0xAB 0xCD 0xEF 0x12. Daraus wird dann irgendwann 0xBC 0xDE 0xF1 0x10 (man beachte die Null am Ende). Und lasse ichs noch länger laufen dann verschiebt es sich immer mehr! (aber eher zufällig, also die Anzahl der korrekten Messages, die zwischen den Fehlerauftritten liegt ist zufällig). Ich habe bisher immer einen Programmierfehler im Timing der Ansteuerung der CAN Controller gedacht. Aber heute wirds ganz kurios! Anstatt die Messages zeigt mein Display nur noch kryptische Zeichen an (ohne das ich was am Programm geändert hätte; Kurzschluss?!), wenn die Endlosschleife beginnt (vorher nicht, da werden erst Informationen zur Initialisierung des CAN Controllers angezeigt; deswegen wohl kein Kurzschluss!)! Ich bin der Sache auf den Grund gegangen und musste feststellen, daß PD7 (daran hängt der Datenpin 7 vom Display) am ATMega dauernd high ist in der Ping Pong Schleife. WIESO verdammt? Die CAN Routinen haben gar nix mit dem PORTD des ATMegas zu tun (CAN Controller hängt auf PortC und B). Der Pin PD7 ist sogar dann dauernd high, wenn ich testweise alle Displayanzeigefunktionen aus der Ping Pong Schleife auskommentiere. Dann zeigt das Display zwar auch nix mehr an, aber das Ping Pong läuft ja trotzdem und der Pin ist auch trotzdem high. Selbst wenn ich immer bei jedem Schleifendurchlauf expliziet den PortD resette (outb(PORTD,0x00);) dann bleibt der Pin high (der Rest des Ports ist low). Ist also in der Ping Pong Schleife auf keine Weise low zu kriegen. Nur wenn ich die CAN Routinen Streiche dann gehts wieder mit dem Display. Aber wie gesagt die CAN Routinen schauen den PORTD noch nicht mal an! Hat mein ATMega ne Macke oder wodran kann das liegen? Kann das kuriose mit dem Display auch auf das Bit shifting der CAN Messages was zu tun haben (wenn das auf dem Bus passieren würde, dann würde ich Bus Errors vom CAN Controller erwarten)? Wäre ja möglich, daß das komische Verhalten des Pins nicht die einzige Macke ist.