Register PHY_RSSI: RX_CRC_VALID | RND_VALUE1 | RND_VALUE0 | RSSI4 | RSSI3 | RSSI2 | RSSI1 | RSSI0 Programmzeilen: SigStr[Empf] = (PHY_RSSI &= 0b00011111); spätere Wiederabe: usart_puts(", RSSI="); utoa(SigStr[Empf],s,10); usart_puts(s); Problem: Die Ausgabe hat Werte die Größer sind als 31... Stimmt meine Maskierung so nicht? Ich möchte nur die RSSIx auslesen und in die volatile SigStr[] schreiben... Prozessor: Atmega128RFA1 was mache ich falsch?
Großes Fragezeichen schrieb: > SigStr[Empf] = (PHY_RSSI &= 0b00011111); Meintest du vielleicht:
1 | SigStr[Empf] = (PHY_RSSI & 0b00011111); |
Ich weiß jetzt nicht, was "PHY_RSSI" macht, aber evtl. werden die oberen Bits von irgendeiner Hardware wieder gesetzt oder sind gar nicht beschreibbar.
aaahh. Guter Hinweis. Das Register ist ReadOnly. Nun fehlt mir aber tatsächlich jede Idee, wie ich da vernünftig nur die Bits lesen kann, die mich interessieren. Außer ich nehme dafür eine Zwischenvariable, also volatile uint8_Zwischensp; Zwischensp = PHY_RSSI SigStr[Empf] = (Zwischensp & 0b00011111); Gibt es eine schönere Lösung?
Auch wenn PHY_RSSI read only ist kannst du dennoch sowas machen: SigStr[Empf] = (PHY_RSSI & 0x1F);
Großes Fragezeichen schrieb: > Gibt es eine schönere Lösung? Oft ist die Zwischenvariable übrigens die "schönere Lösung", weil sie besser lesbar werden kann. Der Compiler hält die Werte am Ende ohnehin nur in Registern (so die Optimierung aktiviert ist). Allerdings würde ich für Variablen, deren "Lebenszeit" nur 3 Zeilen beträgt, nicht so einen langen Namen wählen.
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.