auf Einzelbit von 16/32bit word zugreifen.

OP (Firma: Pensionär-Altes-Eisen) #4857870
Lesenswert?

Hallo,
irgindwie blicke ich nicht nicht durch wie ich bei Arduinos auf ein 
Einzelbit für I/O-Manipulatinon aus einem Word zugreifen kann, oder auch 
ggf. bytweise.

Besispiel:
in der Programmschleife ein 16/32-bit ( due/mega) word inkrementieren 
und ein höherstelliges bit oder Byte auf den Ausgangsport entsprechend 
des Zählerstandes anzeigen.

Trivial als Bespiel zur Bestimmung der Progranmlaufzeit.

Oder eben um andere Ergeignisse zu zählen und extern anzuzeigen.

Gruß
OP (Firma: Pensionär-Altes-Eisen) #4857879
Lesenswert?

hallo,
eben keine Idee, ich kann ein Word defnieren, im loop inkrementieren.
Ich kann unabhängig davon Eingänge und Ausgänge konfigurieren, lesen, 
die bit-Werte verändern und schreiben.

Aber wie definiere ich z.B. bit 12 des 16bit-word als boolsche Variabele 
für Einzelbitmanipulationen, was auch immer und wie sinnvoll?  Wie 
übernehme ich den Augenblickwert von bit 12 als true oder false für 
Einzelbits?

Gruß
OP (Firma: Pensionär-Altes-Eisen) #4857885
Lesenswert?

Hallo,
danke, dann habe ich wenn ich es richtig verstehe mit shift und mask die 
gewünschten n bits in einem word an gewünschter Stelle, soweit 
verstanden.

Ggf. das interessierte bit als low-bit in einem Word.

Und wie dann daraus eine boolsche Variabele für Pinout-funktion?


Gruß
Persönliche Seite #4857903
Lesenswert?

Wolfgang S. schrieb:
> Und wie dann daraus eine boolsche Variabele für Pinout-funktion?

Du könntest Dir in Deinem C-Buch das Thema Bitfelder ansehen. Du 
müsstest allerdings, weil Du anscheinend nicht nur Zugriffe auf das 
einzelne Bit durchführen willst, Dir zusätzlich das Theme unions 
ansehen.

Das ist eine zwar nicht portable (weil nicht auf allen Prozessoren sich 
gleich verhaltende) aber durchaus praktikable Vorgehensweise, bei der Du 
auf Deine Bitshiftereien verzichten kannst. Das übernimmt dann hinter 
den Kulissen der Compiler für Dich.
Gast #4857905
Lesenswert?

Wolfgang S. schrieb:
> danke, dann habe ich wenn ich es richtig verstehe mit shift und mask die
> gewünschten n bits in einem word an gewünschter Stelle, soweit
> verstanden.
>
> Ggf. das interessierte bit als low-bit in einem Word.

Genau.

Wolfgang S. schrieb:
> Und wie dann daraus eine boolsche Variabele für Pinout-funktion?
Du meinst digitalWrite?
https://www.arduino.cc/en/Reference/DigitalWrite
Ggf durch einen Cast auf den Datentyp von value.
Wobei bei digitalRead in ihren Beispielen auch nichts gecastet wird.
Gast #4857914
Lesenswert?

Über Bitfelder lösen ? Pfui ! Pfui ! Pfui !
Sieht zwar auf den ersten Blick schön kurz und elegant aus. Vertraut 
aber auf undokumentierte Eigenschaften des C-Compilers. Dem steht 
nämlich frei, in welcher Reihenfolge er die Bits in den Speicher legt 
und wieviel Platz er dazwischen frei lässt, weil es für ihn bequemer zu 
adressieren ist. Sprich solcher Code ist schlecht portierbar. Wenn das 
in einer dem Compiler beiliegenden Header Datei für die Special Function 
Register eines Mikrokontrollers so gemacht wird, na gut. Bei einem 
anderen Compiler wird schon wieder eine andere dazu passende Header 
Datei dabei sein. Aber Deinen Code wird Dir kein anderer warten.
OP (Firma: Pensionär-Altes-Eisen) #4857964
Lesenswert?

hallo,
irgendwie kapiere ich die Schreibweise nicht.

0x10 lese ich als bit 5 = 1 eines Byte in hex-darstellung.

0xEF lese ich als hex für bit 5 = 0, alle andere bits des Byte = 1.

0x10 & 0xEF = FF eines Byte!

Wieso als Definition für bit 12, wo ist mein Denkfehler?

bit 12 low wäre F7FF,  nur bit 12 high = 0800.

Vorangesellte "0x" für kennzeichung hex-Darstellung.

Bei Bitzählung von 1 bis 16 für ein word, manche zählen von 0 bis 15....
OP (Firma: Pensionär-Altes-Eisen) #4857973
Lesenswert?

hallo,
stimmt "und" mit "oder" verwechselt. Und ich sehe die Zählwiese für bits 
von 0 bis 7 oder 0 bis 15....

Aber es bleibt die Frage von weiter oben wie damit bit 12 gemeint sein 
kann

Shift ? Eher nicht.

Bit 12 Setzen   : myword OR=  0x10;
Bit 12 Loeschen : myword AND= 0xEF;


Gruß
Gast #4858405
Lesenswert?

Wolfgang S. schrieb:
> Aber es bleibt die Frage von weiter oben wie damit bit 12 gemeint sein
> kann

eigentlich ganz einfach:
1<<12
bedeutet eine 1 um 12 Bit nach links verschoben, also
binär 0001000000000000
(hoffentlich hab ich mich jetzt nicht vertippt)
und wenn du
if (A & (1<<12))
hinschreibst, dann bleibt nur noch das eine Bit von A übrig. Entweder es 
ist nun 0 oder nicht. Damit ist das Gesamtergebnis in der Klammer nun 0 
oder nicht.

Ach ja, das LSB wird hier Bit 0 genannt. Ein 16 Bit Wort also Bits 
15..0, ein 32 Bit Wort dann Bits 31..0

W.S.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren