Forum: Mikrocontroller und Digitale Elektronik auf Einzelbit von 16/32bit word zugreifen.


von Wolfgang S. (Firma: Pensionär-Altes-Eisen) (stackpointer)


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ß

: Bearbeitet durch User
von Frank (Gast)


Lesenswert?

Was wäre denn dein Ansatz?
Was hast du denn schon probiert?

von Wolfgang S. (Firma: Pensionär-Altes-Eisen) (stackpointer)


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ß

: Bearbeitet durch User
von Peter Lustig (Gast)


Lesenswert?

Moin,

guckst du hier... Beitrag "Bit-Maskierung 32bit"

Thema Bitmaskierung

von Wolfgang S. (Firma: Pensionär-Altes-Eisen) (stackpointer)


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ß

von Trumper (Gast)


Lesenswert?

Sowas?
1
if( var & 1L << 11)  {
2
 ...tu was...
3
}

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Frank (Gast)


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.

von fop (Gast)


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.

von Pandur S. (jetztnicht)


Lesenswert?

Shift ? Eher nicht.

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

Bit 12 Lesen    : if (myword and 0x10) { } // implizit != 0

: Bearbeitet durch User
von Wolfgang S. (Firma: Pensionär-Altes-Eisen) (stackpointer)


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....

von (prx) A. K. (prx)


Lesenswert?

Wolfgang S. schrieb:
> 0x10 lese ich als bit 5 = 1 eines Byte in hex-darstellung.

Bit 4.
  76543210
  00010000

> 0x10 & 0xEF = FF eines Byte!

0x10 & 0xEF = 0
0x10 | 0xEF = 0xFF

von Wolfgang S. (Firma: Pensionär-Altes-Eisen) (stackpointer)


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ß

von Dirk B. (dirkb2)


Lesenswert?

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

  MSB       LSB
  111111
  54321098 76543210 Bitnr.

  00010000 00000000

von Thomas E. (picalic)


Lesenswert?

Wolfgang S. schrieb:
> Shift ? Eher nicht.
>
> Bit 12 Setzen   : myword OR=  0x10;
> Bit 12 Loeschen : myword AND= 0xEF;

Durch die Wiederholung des Falschen wird es auch nicht richtiger und es 
zeigt, warum man lieber "1<<12" schreibt, als "0x1000", weil der Mensch 
eben Fehler macht und der Compiler richtig rechnet!

von Pandur S. (jetztnicht)


Lesenswert?

Sorry, byte vergessen.

> Bit 12 Setzen   : myword OR=  0x1000;
> Bit 12 Loeschen : myword AND= 0xEFFF;

Dass das niemand so gemerkt hat..

von Norbert (Gast)


Lesenswert?

Ist es heutzutage eigentlich verboten das Ganze lesbar zu gestalten?
1
#define BIT12 (1<<12)
2
3
x |= BIT12;
4
x &= ~BIT12;
5
x ^= BIT12;
6
if (x & BIT12)

von das 12. Bit (Gast)


Lesenswert?

Ist das 12. Bit nicht eher 0x800 (1<<11)?

von Pandur S. (jetztnicht)


Lesenswert?

Eine Frage der Definition :

15 14 13 12 - 11 10 9 8 - 7 6 5 4 - 3 2 1 0

von Georg (Gast)


Lesenswert?

Oh D. schrieb:
> Eine Frage der Definition :

Ab 0 zu zählen ist sinnvoll, weil 2^0 = 1, Bit 0 entspricht also der 
Wertigkeit des Bits. Das ist ebenso bei Adressen und Daten generell 
üblich, ein 16-bit Adressbus hat die Adressen A0 bis A15.

Georg

von (prx) A. K. (prx)


Lesenswert?

das 12. Bit schrieb:
> Ist das 12. Bit nicht eher 0x800 (1<<11)?

Doch, nur bist du Bit #11. Und Bit #12 ist das 13. Bit.

: Bearbeitet durch User
von (prx) A. K. (prx)


Lesenswert?

Oh D. schrieb:
> Eine Frage der Definition :
>
> 15 14 13 12 - 11 10 9 8 - 7 6 5 4 - 3 2 1 0

Oder 0 1 2 3 ... 29 30 31. Beispielswiese bei PowerPC.

von W.S. (Gast)


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.

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.