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
Was wäre denn dein Ansatz? Was hast du denn schon probiert?
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
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ß
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.
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.
Ü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.
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
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....
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
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ß
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
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!
Sorry, byte vergessen. > Bit 12 Setzen : myword OR= 0x1000; > Bit 12 Loeschen : myword AND= 0xEFFF; Dass das niemand so gemerkt hat..
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) |
Eine Frage der Definition : 15 14 13 12 - 11 10 9 8 - 7 6 5 4 - 3 2 1 0
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.