Forum: Compiler & IDEs AT90CAN 128 CAN-Schnittstelle


von Kosta (Gast)


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

von flyingwolf (Gast)


Lesenswert?

wenn Du die fertigen Routinen von Atmel benutzt liegt es daran, dass der
Interruptvector an die falsche Stelle zeigt.

von Kosta (Gast)


Lesenswert?

Hi,
hatte auch shcon die Vermutung. Lässt sich das denn irgendwie beheben?

von Werner A. (Gast)


Lesenswert?

datenblatt lesen...

von Alex (Gast)


Lesenswert?

-> Codesammlung

Die Probleme hatte schon jemand anders :)

von Kosta (Gast)


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?

von Alex (Gast)


Lesenswert?

"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!

von Kosta (Gast)


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:)

von hebel23 (Gast)


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.

von flyingwolf (Gast)


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".

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.