Hallo, versuche seit Wochen die CAN Schnittstelle eines AT90CAN128 zu programmieren. Der Daten Empfang via Interrupt klappt aber nicht. Es scheint so , dass der Interrupt zwar ausgelöst wird, der Programmcounter aber in einen undefinierten Speicherbereich zeigt und nicht zur ISR springt. Nach einer Zeit laüft das Programm von vorne. Vielleicht hat jemand eine Idee. Ich benutze WinAvr für Windows mit GCC 3.4.3 Danke im voraus
wenn Du die fertigen Routinen von Atmel benutzt liegt es daran, dass der Interruptvector an die falsche Stelle zeigt.
Hi, hatte auch shcon die Vermutung. Lässt sich das denn irgendwie beheben?
Hallo Leute, nach dem Datenblatt sollte eigentlich alles richtig sein, habe auch hier im Forum mehrere Beispiele angesehen nützte mir aber trotzdem nichts. Der Interrupt wird ausgelöst aber die Serviceroutine nicht aüsgeführt. Hat jemand vielleicht eine konkrete Lösung oder geht das nur über Polling?
"Interrupt wird ausgelöst aber die Serviceroutine nicht aüsgeführt" Erklär mir mal bitte, wie du das diagnostiziert hast? Und zeige einfach deinen Code!
"Interrupt wird ausgelöst aber die Serviceroutine nicht aüsgeführt" Erklär mir mal bitte, wie du das diagnostiziert hast? Ich habe zwei CAN Knoten, die miteinander kommunizieren sollen. Ein Knoten läuft im Moment als Sender und sendet ununterbrochen. Der andere soll als Empfänger funktionieren. Wenn ich Polling benutze, funktioniert das ganze, der Interrupt aber nicht. Mein Hauptprogramm ist im Moment nur eine Endlosschleife.Ich benutze AVR Studio mit MK2 JTAGE zur Emulation. Dabei kann ich sehen, dass wenn der Sendeknoten nicht sendet, bleibt das Programm in der Endlosschleife. Sobald er anfängt zu senden, springt das Programm aus der Endlosschleife raus, springt aber nicht zu der ISR. Das kann man sehen, indem man die Emulation stoppt. Man sieht dann, an welcher Stelle im Programm man sich befindet. Den Quellcode habe ich hier aus dem Forum runtergeladen. Es gab hier einen Beitrag zu AT90CAN128 mit einer zip Datei. Ich glaube das hieß AT90CAN128_senden.zip. Da gab es mehrere Routinen aber die scheinen nicht zu funktionieren. Ich benutze den GCC 3.4.3 und WinAvr. Ich habe hier einige Beiträge gesehen aber nirgendwo gab es eine Lösung, ausser Polling. Liegt es vielleicht am Compiler? Wenn jemand helfen kann, würde ich mich sehr freuen. Gruß und Danke:)
Für solche Sachen gibts eigentlich den "SIGNAL(__vector_default)", wo der Programmcounter dann hinspringt, falls der Interruptvektor falsch ist oder vergessen wurde. So kommt es zumindest nicht zu undefinierten Programmsprüngen.
Ich habe es über polling gelöst. Die informationen die ich verschicke ändern sich nicht so oft da ist es nicht ganz so wichtig ob mal eine Info verloren geht. Außerdem habe ich ja 14 Mailboxen (oder waren es 15?) da habe ich viel Platz. Die Sache mit dem Interrupt war mir zu hakelig, weil es scheinbar nur einen interrupt für alle 14 Boxen gibt und ich hätte eine irre lange Routine produziert um rauszubekommen wer jetzt den Interrupt ausgelöst hat. So schaue ich jetzt mal alle Nase lang nach ob was war, immer wenn sich das Programm "langweilt".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.