Forum: Mikrocontroller und Digitale Elektronik AT90CAN128, Receive Interrupt


von Christian (Gast)


Lesenswert?

Hallo,

Ich versuche gerade erfolglos den Receiver Interrupt des AT90CAN128
auszulösen. Ich nutze den ImageCraft Compiler und die Library die ich
gerade in der Codesammlung gepostet habe. Sonst klappt bis jetzt schon
einiges ;)
Ich schicke kontinuierlich mit einem Dongle Daten an den Controller.
Jedoch wird die ISR nicht aufgerufen.
Das einzigste was passiert das meine Tx Funktion gestört wird seit dem.
Die CAN IDs werden verfälscht.

Initialisierung:

CANGIE = 0x00100000;


ISR:

#pragma interrupt_handler can_transfer_complete_isr:19
void can_transfer_complete_isr(void)
{
  PORTA++;
}



Gruß und Danke,

Christian

von tex (Gast)


Lesenswert?

das scheint mir etwas mager als Can-Initialisierung..

von chbr (Gast)


Lesenswert?

Hallo.

Das soll auch gar nicht die ganze Initialisierung sein. Das ist ein nur
ein Ausschnitt was ich nun speziell für den Interrupt enable
ausprobiere.

Der Rest klappt alles soweit. Die Funktionen für den Empfang per
Abfrage oder zum versenden klappen schon gut.

Ich weiß bloß gerade hierbei nicht weiter. Welche anderen Einstellungen
muss ich denn da noch beachten? Was kommt mir da sonst in die quere?

Gruß Christian

von chbr (Gast)


Lesenswert?

Übrigens, falls das weiter hilft

Ich habe nebenbei noch den Timer0, ADC und die UART am laufen. Gibt es
da komplikationen?


Christian

von tex (Gast)


Lesenswert?

wenn ich das recht in Erinnerung habe musst du mindestens 2 oder 3
Register beschreiben um einen Interrupt zuzulassen, und es braucht ein
paar schleifen um die für alle Mailboxen zu aktivieren.

von Christian (Gast)


Lesenswert?

Hallo,

etwas spät... aber Ich habe nun wieder Zeit dafür gefunden :-)

Ich probiere es zur Zeit so aus, und es klappt immer noch kein
bisschen. Leider weiß Ich da auch nun nicht mehr weiter. Die ganzen CAN
Register im Datenblatt machen mich noch zu schaffen ;)

Init:

  CANGIE = (1<<ENIT) | (1<<ENRX);      //enable receive interrupt

  CANIE1 = 0;
  CANIE2 = (1<<0);              //enable MOb0 interrupt

  CANSIT1 = 0;
  CANSIT2 = 0;



ISR:

#pragma interrupt_handler can_transfer_complete_isr:19
void can_transfer_complete_isr(void)
{
  PORTA++;


 CANSTMOB &= ~(1<<RXOK);          //clear interrupt flag
}


Wäre echt super wenn mir da jemand noch helfen könnte.

Schönen Tag euch, Christian

von Ingo (Gast)


Lesenswert?

Bei Atmel gibts Codebeispiele für die CAN-Controller, allerdings nur für
die 8051er Serie (t89c51cc01). Da ist auch eins fürs Interrupt-Handling
dabei.

http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3440

Die CAN-Controller der beiden uC sind annähernd identisch!

von Christian (Gast)


Lesenswert?

Vielen Dank Ingo,


irgendwie hat mich das nun dazu geleitet das richtige auszuprobieren
und es geht nun :-)
Es waren ein paar dumme fehler noch drin...


Danke, Christian

von Jon O. (Firma: Student) (jon)


Lesenswert?

Hallo Christian,

kannst Du mir bitte sagen wie Du dein Problem gelöst hast.

Ich kämpfe schon seit 3 Wochen mit CAN und suche vergeblich nach dem
Fehler. Das Sende- und Empfangsprogramm geht bis der Warteschleife und
bleibt da hängen, da RXOK und TXOK nie auf eins gesetzt werden. Seit
zwei Wochen suche ich vergeblich, wo das Problem liegt und kann immer
noch nicht den Fehler einzugrenzen.

Ich habe 2 Boards mit je einem AT90CAN128, wobei einer Sender und
der andere Empfänger ist. Baudrate ist 250 kbit/s. Bit Timing habe ich
nicht selbst gerechnet sondern aus dem Datenblatt genommen. Weiss nicht,
ob es stimmt. Auch mit anderen Baudraten habe ich ausgetestet.
Im Internet habe ich einige Beispiele gefunden und habe da nichts
anderes gefunden. Die habe ich auch getestet. Geht auch nicht.

Hardwarefehler? Aber es ist alles richtig angeschlossen. Ich benutze
zwei Drähte je 2m mit 120 Ohm Abschlusswiderständen. Hast Du GND auch
benutzt? Braucht man den unbedingt? Welche Kabel hast Du angewendet?

Mich interessiert vor allem, ob Du mit AT90CAN128 die CAN-Nachrichten 
senden und empfangen kannst? Wießt Du vielleicht, wo kann bei mir der 
Fehler liegen?

Mit freundlichen Grüssen

Jon

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.