Forum: Compiler & IDEs Logik-Problem


von Rahul (Gast)


Lesenswert?

Moin!
Ich habe folgendes Problem:
Beim  MCP 2515 (CAN-Controller) gibt es zwei Register, in denen die
Adresse des Absenders steht.
Da die Adresse etwas komisch aufgeteilt ist, würde ich sie gerne für
Normalsterbliche lesbarer machen.
RXB0SIDL hat in den Bits <7:5> die Bits <2:0> der Adresse stehen.
Im RXB0SIDH stehen die Bits <10:3>.
Mein Code sieht wie folgt aus:
SIDL = read_MCP(RXB0SIDL);// unteres Adress-Byte einlesen SID<2:0>
SIDL = SIDL>>5;    // die obersten 3 Bit nach unten verschieben
SIDH = read_MCP(RXB0SIDH);// oberes Adress-Byte einlesen  SID<10:3>
i = SIDH<<3;
j = (i | SIDL);  // die unteren 5 Bit von SIDH mit modifiziertem SIDL
verodern
i = SIDH>>5;
SIDH = i;// SID modifizieren

Dass man das einfach machen kann, weiß ich.
Mit den unteren Bits von SIDL funktioniert das auch wunderbar, leider
werden die oberen Bits aber nicht übertragen.

Ich steh momentan etwas auf dem Schlauch. Es wäre schön, wenn mir
jemand einen Hinweis geben könnte, was ich falsch mache. An den Typen
liegt es nicht. Die sind alle gleich.

Vielen Dank!
Gruß
Rahul

von Rufus T. Firefly (Gast)


Lesenswert?

SIDL = read_MCP(RXB0SIDL);
SIDH = read_MCP(RXB0SIDH);

Adresse = ((SIDL >> 5) & 7) | (SIDH << 3);

von Rahul (Gast)


Lesenswert?

Lösung gefunden:

SIDL = (( SIDL >> 5 ) | (SIDH <<3));
SIDH = (SIDH >>5);

Es war ein Problem der Schieberichtung...
Jetzt fehlt nur noch der Rückweg...

von mthomas (Gast)


Lesenswert?

Die Information in den Dateien mcp2510.zip und mcp2515.zip von
kvaser.com und die Beispiele von microchip.com ersparen das "Erfinden
neuer Raeder".

von Rahul (Gast)


Lesenswert?

Leider muß ich gewisse Räder neu erfinden, da die Leute (bis jetzt
einer), der die PC-Seite programmieren soll, nicht wirklich Ahnung hat,
was er überhaupt machen will/soll.
Das Semester ist fast vorbei, und er hat nur ein paar schöne Bilder in
VB gemalt...

von mthomas (Gast)


Lesenswert?

Aber genau die Routinen die notwendig sind, um die CAN-IDs fuer standard
oder extended Frames zwischen unsigned long und den MCP-Registern hin
und herzuschieben, gehoeren wahrscheinlich kaum zu den Dingen, die man
neu erfinden "muß". Was das mit der PC-Seite zu tun hat, versteh'
ich grad' nicht, aber auch egal. Whatever, sollte ja nur ein Tipp
sein, um Zeit zu sparen.

von Rahul (Gast)


Lesenswert?

Naja, warum soll ich in irgendwelchen Bibliotheken suchen, wenn mir die
Lösung selber einfallen kann (s.o.).
Das Protokoll für die PC-Seite muß so einfach wie möglich gehalten
werden. Deswegen passiert die Bit-Verschiebungkomplett im
Mikrocontroller...
Ich hatte vorhin einfach nur ein Brett vor dem Kopf...

von OldBug (Gast)


Lesenswert?

>Deswegen passiert die Bit-Verschiebungkomplett im
>Mikrocontroller...

Hm?

Das muss sie doch so oder so...
So weit ich das in Erinnerung habe, sind in einem der Register noch die
Flags für Extd/Std-Frames enthalten usw.
Aber das hat doch überhaupt nichts mit der PC-Seite zu tun!?!?

von Rahul (Gast)


Lesenswert?

Naja, man könnte die Register so wie sie sind an den PC weiterleiten
(CANSniffer), und die "Zerlegung" dort machen. Damit wäre die
PC-Programmierseite aber etwas überfordert...

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.