Forum: Mikrocontroller und Digitale Elektronik CAN ID/MASK (AT89c51cc03)


von David (Gast)


Lesenswert?

Guten Tag

Ich arbeite an einem Projekt mit CAN, was das Projekt genau für einen 
Zweck hat spielt hier jedoch keine grosse Rolle.
Nun meine Fragen:

1. Wozu sind die Intentifier? Ich weis das sie über die Priorität 
entscheiden, doch das ist ja vermutlich nicht alles.
Muss ich einer Mail-Box die auf receive konfiguriert wurde eine ID 
zuteilen oder ist dazu die Maske gedacht?

2.Was für eine Funtkion haben die Masken. So wie ich dies verstanden 
habe entscheiden sie welche Nachrichten von einem Knoten bearbeitet 
werden und welche nicht (Akzeptanzfilter).
Falls ich alle Nachrichten zulassen will, muss ich die Maske auf 0xFF 
oder 0x00 setzen?
Braucht eine Mail-Box die auf transmit konfiguriert wurde eine Maske? 
oder ist dies nur für Empfänger gedacht.

3. Macht es Sinn mehr als eine Mail-Box (MOb) als Empfänger bzw. als 
Sender zu konfigurieren? Wenn ja, wozu? Es ist ja nicht möglich zwei 
Nachrichten gleichzeitig zu versenden bzw. zu empfangen.

Nun...Antworten auf eine oder mehrer Antworten wären herzlich 
Willkommen.
Gruss David

von Bernd G. (bege)


Lesenswert?

Hallo,

zu Deinen Fragen:

In einem CAN-Netzwerk wird den Identifiern ein bestimmer 
Nachrichteninhalt zugeordnet.
Beispiel:
ID 0x00001 überträgt immer Temperatursignal vom Sensor1
ID 0x00002 überträgt immer Temperatursignal von Sensor2
ID 0x00010 übertragt immer eine Textnachricht (max 8 Zeichen)
usw.

Wie die IDs in einem CAN Netzwerk vergeben werden hängt von den 
Teilnehmern des CAN Netzwerks ab, wichtig ist, daß der Nachrichteninhalt 
einer ID immer gleich ist.
Außerdem wird mit der ID die Priorität der Nachricht festgelegt. 
Niedrigere IDs haben eine höhere Priorität. D.h. wenn zwei CAN-Knoten 
zur selben Zeit senden möchten, setzt sich die Nachricht mit der 
niedrigeren ID durch.

Einer Receive Mailbox muß man sowohl die Maske als auch die ID 
konfigurieren.
Die Maske legt fest, welche Bits des Identifiers beachtet (Maske=1) und 
welche ignoriert (Maske=0) werden sollen. Somit kann man die Mailbox auf 
eine bestimmte Art von Nachrichteninhalten vorkonfigurieren.
Mit der ID legt man fest, ob die Nachrichten wirklich in dieser Mailbox 
landen. Man kann das auch als eine Art Nachrichtengruppe ansehen.

Beispiel von oben:
Um die Temperatur eines beliebigen Sensors in einer gemeinsamen Mailbox 
zu empfangen muß diese wie folgt konfiguriert werden:
Maske 0xFFFF0
ID    0x00000
Nur die oberen Bits vergleichen, diese müssen alle '0' sein.

Um nur den Text zu empfangen, ist die Kombination diese:
Maske 0xFFFFF
ID    0x00010
Alle Bits vergleichen, der Nachrichten-Identifier muß genau 0x00010 sein 
um in dieser Mailbox empfangen zu werden.

Transmit-Mailboxen brauchen keine Maske, hier muß die (eindeutige) ID 
angegeben werden, mit der die Nachricht versendet werden soll. Eine 
Maske macht keinen Sinn.

Es kann Sinn machen, die Nachrichten auf mehrere Mailboxen zu verteilen:
- um die Nachrichten vorzusortieren
- um die CPU nicht nach jeder Nachricht zu unterbrechen indem man die 
Nachrichten erst einmal in den Mailboxen sammelt und dann 'am Stück' 
verarbeitet


Gruß Bernd

von David (Gast)


Lesenswert?

Tach Bernd Geyer

Vielen Dank für eine solch ausführliche Antwort, hat sehr zum 
Verständnis des CAN-Bus beigetragen

Gruss David

von David (Gast)


Lesenswert?

Salüüü Leute...


Ich habe noch eine weitere Frage bezüglich Identifier:
Ich habe nun einen Master und einen Slave auf meinem Can-Bus.
Der Master kann 20 verschiedene RemoteRequest-Frames an den Slave 
senden.
Im Identifier der RemoteRequest-Frames kann ich nun jeder Anforderung, 
für einen bestimmten Wert, einen individuellen Identifier geben. So 
zeigt der Identifier also an, welcher Wert gefragt ist.

Ich frage mich nun: Wie muss ich den Slave konfigurieren, dass er 
jederzeit "alle" diese RemoteRequest-Frames empfangen und zuordnen kann, 
damit er mit dem gwünschten Wert antwortet?

Das Problem ist ja, dass ich nur 15 verschiedene MessageObjekte 
(Mailbox) habe, so kann ich also nur 15 verschiedene Identifier 
gleichzeitig unterscheiden.
Und würde ich die Maske so einstellen, dass alle RemoteRequest-Frames 
empfangen werden, wie könnte der Slave da erkennen welches 
RemoteRequest-Frame welchen Wert anfordert?

von Gast (Gast)


Lesenswert?

Danke an Bernd Geyer für die ausführliche Eklärung.

von Oliver (Gast)


Lesenswert?

Hallo zusammen,
kann man überhaupt ein ID definiert und mit dem Mask diese ID wieder 
ignoriert.
BeispielA:Ich möchte nur diese ID über Kanal 0 empfangen
ID=0x080
Mask=7FF
BeispielB:Ich möchte nur diese ID  wieder über Kanal 0 nicht empfangen
ID=0x080
Mask=77F
Beim ersten Beispiel empfange ich nur die ID=0x80.Beim zweiten Beispiel 
empfange ich noch die 0x80 und auch weitere, obwohl ich diese 
ID(0x80)nicht empfangen will.

Danke

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.