Forum: Mikrocontroller und Digitale Elektronik CAN BUS Identifier


von Tobi P (Gast)


Lesenswert?

Hallo.
Ich taste mich grad an den CAN BUS ran und finde keine Antwort auf 
folgende Frage:

Ich empfange die Nachrichten über die Interrupt Routine. Diese wird bei 
jeder eingehenden Nachricht ausgelöst. Alle Nachrichten kommen in MoB1 
an.

Wie kann ich die Nachrichten innerhalb der ISR anhand des Identifier 
unterscheiden, wenn der MoB die ID´s 0 - 100 zulässt ?
Beispiel:
Wert a hat ID 100 und soll in Variable a gespeichert werden;;
Wert b hat ID 101 und soll in Variable b gespeichert werden.

Kann ich innerhalb der ISR das CAN Identifier Mask Register dazu 
benutzen ?

Ein kleines Beispiel in C wäre traumhaft...

Ich benutze den AT90CAN128

von Fabian B. (fabs)


Lesenswert?

Du kannst direkt das MOb ID Tag Register (CANIDT1-4) auslesen. da steht 
der empfangene ID Tag drin. Anhand dessen kannste dann entscheiden, was 
zu tun ist.
Schau dir mal die AVR-Lib von Atmel für den CAN128 an. Die ist zwar 
erstmal nicht Int-basiert sondern pollt, aber die hat sehr schöne 
Strukturen vordefiniert mit denen man dann einfacher auswertbare 
Ergebnisse bekommt.

Gruß
Fabian

von Daniel (Gast)


Lesenswert?

Tobi P schrieb:
> Wie kann ich die Nachrichten innerhalb der ISR anhand des Identifier
> unterscheiden, wenn der MoB die ID´s 0 - 100 zulässt ?
> Beispiel:
> Wert a hat ID 100 und soll in Variable a gespeichert werden;;
> Wert b hat ID 101 und soll in Variable b gespeichert werden.

Warscheinlich nur ein Tipfehler aber
Wert b (ID 101) sollte gar nicht angenommen werden.

von Tobi P (Gast)


Lesenswert?

Fabian B. schrieb:
> Du kannst direkt das MOb ID Tag Register (CANIDT1-4) auslesen. da steht
> der empfangene ID Tag drin. Anhand dessen kannste dann entscheiden, was
> zu tun ist.

Also könnte ich die ID der Nachricht dort auslesen und innhalb der ISR 
mit switch/case arbeiten...??? Könnte es wirklich so einfach sein ?

von Tobi P (Gast)


Lesenswert?

Daniel schrieb:
> Tobi P schrieb:
>> Wie kann ich die Nachrichten innerhalb der ISR anhand des Identifier
>> unterscheiden, wenn der MoB die ID´s 0 - 100 zulässt ?
>> Beispiel:
>> Wert a hat ID 100 und soll in Variable a gespeichert werden;;
>> Wert b hat ID 101 und soll in Variable b gespeichert werden.
>
> Warscheinlich nur ein Tipfehler aber
> Wert b (ID 101) sollte gar nicht angenommen werden.

Ja natürlich Tippfehler. sagen wir mal ID#s sind 99 und 100

von Fabian B. (fabs)


Lesenswert?

Ja, Tobi, es ist so einfach ;-)

Wobei du dir erstmal aus den zwei bis vier Registern deinen Wert 
zusammenbauen mussst.

Siehe auch Seite 263 im Datenblatt des AT90CAN128, Abschnitt 19.11.3

Gruß
Fabian

von Tobi P (Gast)


Lesenswert?

Ich werd´s morgen ausprobieren.

Fabian, ich werd dafür sorgen das dein Name in Zukunft in 
Weihnachtsliedern aufgenommen wird.

Vielen Dank für die schnelle Antwort.

von Tobi P (Gast)


Angehängte Dateien:

Lesenswert?

Für die die erst später gekommen sind... im Anhang der Code ( nur die 
ISR )

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.