auf Einzelbit von 16/32bit word zugreifen.

OP (Firma: Pensionär-Altes-Eisen) #4857870
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
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
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
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
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
Ü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
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
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 #4858346
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
Gast #4858405
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.