Hallo Community, ich stehe gerade ein bisschen auf dem Schlauch was Bitmasking und Datenbastelei in AVR_GCC angeht: Ich habe folgende Variablen: uint32_t ExtendedID; // 29 bit Extended CAN-ID uint16_t DeviceAdress = 0x1FFF; //maximum Device Adress -> 13 bit ! uint16_t MessageID = 0xFFFF; //maximum Message-ID -> 16 bit ! ich möchte nun die beiden uint16_t zusammen in die uint32_t CAN-ID verpacken. Dazu muss ich ja die DeviceAdress, welche so aussieht -> 0001 1111 1111 1111 erstmal in eine 32er wandeln und 16 bit links schieben, oder ?: ( 16 << (uint32_t)DeviceAdress) dann hab ich das hier, richtig ?: 0001 1111 1111 1111 0000 0000 0000 0000 jetzt muss ich da ja irgendwie die MessageID reintüdeln, was mit bitweise AND (&) geht, oder ? Nur da setzt es bei mir aus, und irgendwie verstehe ich das Tutorial auch gerade nicht mehr. Entweder zu müde oder zu viel Code vor Augen ! Es wäre wirklich nett wen mir jemand kurz auf die Sprünge helfen kann.
@ Marcel Peterkau (souko) >ich stehe gerade ein bisschen auf dem Schlauch was Bitmasking und >Datenbastelei in AVR_GCC angeht: Schon den Artikel Bitmanipulation gelesen? >erstmal in eine 32er wandeln und 16 bit links schieben, oder ?: > ( 16 << (uint32_t)DeviceAdress) Ja. >dann hab ich das hier, richtig ?: > 0001 1111 1111 1111 0000 0000 0000 0000 Ja. >jetzt muss ich da ja irgendwie die MessageID reintüdeln, was mit >bitweise AND (&) geht, oder ? ODER! >Nur da setzt es bei mir aus, und irgendwie verstehe ich das Tutorial >auch gerade nicht mehr. Entweder zu müde oder zu viel Code vor Augen ! Wahrscheinlich.
1 | ExtendedID = ((uint32_t)DeviceAdress << 16) | MessageID; |
AHHH, da lag der Fehler ! mit ODER... ich hab die ganze Zeit versucht das mit & und irgendwelchen Bitmaskierungen hin zu bekommen (0x0000FFFF) ! Vielen Vielen Dank ! Klar, da der hintere Teil der DeviceAdress nach dem konvertieren in 32 immer 0 ist, wird mit ODER der hintere 16er teil von der MessageID einfach übernommen. Danke !
:
Bearbeitet durch User
Falk Brunner schrieb: >> ( 16 << (uint32_t)DeviceAdress) > Ja. sicher? sieht mir merkwüdig aus. ist es noch so sinnvoller? ((uint32_t)DeviceAdress) << 16
Falk Brunner schrieb: > Wahrscheinlich. > ExtendedID = ((uint32_t)DeviceAdress << 16) | MessageID; Also dieses Beispiel hat wunderbar funkltioniert ! sieht dann bei mir in seiner gänze so aus:
1 | void push_CAN_stats(){ |
2 | |
3 | uint32_t iTemp32 = millis(); |
4 | |
5 | if (iTemp32 % 1000 > 500 && !ui8_CANsendFlag) { |
6 | |
7 | CANMessage message; // neue CAN-Msg erzeugen |
8 | // Daten eintragen
|
9 | message.id = ((uint32_t)ui16_DeviceAdress << 16) | 0x4321; //(uint32_t) ui16_DeviceAdress;// & CAN_STAT_MSG_ID; |
10 | message.extended = 1; |
11 | message.rtr = 0; |
12 | message.length = 4; |
13 | message.data[0] = (iTemp32 & 0x000000ff); |
14 | message.data[1] = (iTemp32 & 0x0000ff00) >> 8; |
15 | message.data[2] = (iTemp32 & 0x00ff0000) >> 16; |
16 | message.data[3] = (iTemp32 & 0xff000000) >> 24; |
17 | |
18 | can_send_message(&message); // Msg abschicken |
19 | |
20 | ui8_CANsendFlag = 1; |
21 | }
|
22 | if (iTemp32 % 1000 < 500 && ui8_CANsendFlag) ui8_CANsendFlag = 0; |
23 | |
24 | }
|
@Marcel Peterkau (souko) >> ExtendedID = ((uint32_t)DeviceAdress << 16) | MessageID; >Also dieses Beispiel hat wunderbar funkltioniert ! ja, aber deins war falsch. Verdrehte Reihenfolge der Operatoren! Hab ich in dem Moment aber nicht gesehen 8-0 ( 16 << (uint32_t)DeviceAdress)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.