AT90CAN 128 CAN-Schnittstelle

Gast #285071
Lesenswert?
• ▲
▼
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
Gast #285076
Lesenswert?
• ▲
▼
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?
Gast #285078
Lesenswert?
• ▲
▼
"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:)
Gast #285079
Lesenswert?
• ▲
▼
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.
Gast #285080
Lesenswert?
• ▲
▼
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".

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.