Ich möchte gern die Timer-Programmierung verstehen udlnd lese mich gerade in die einzelnen Bits usw. ein.
Was ich nicht verstehe: Warum arbeiten die Beispiele meistens mit Schiebe- und And-Befehlen, wenn ein but gesetzt werden soll?
Ich könnte das Byte doch genausogut binär darstellen und über eine Addition zuweisen.
Irgendwie habe ich an der Stelle noch einen Denkfehler.
Hat einer eine schöne Quelle, wo das beschrieben wird? Wahescheinlich eher C-Grundlagen als was anderes...
Viele Grüße und vielen Dank!
P.S. Schieben usw. sagt mir eigentlich was, da ich vor etlichen Jahren auch mal Assembler programmiert habe, aber warum macht man das hier?
Ich könnte das Byte doch genausogut binär darstellen
Das ist doch kaum lesbar. Durch das Schieben werden die Bit-Masken erzeugt. Der Bit-Name ist einfach deren Nummer (von 0 bis 7). Dann schiebt man eine 1 entsprechend nach links um die Maske zu bekommen:
1 << 5 = 0010 0000
Durch ein Oder damit setzt man ein Bit. Gelöscht wird es durch UND mit der invertierten Maske (weil irgendwas UND 0 immer 0 ist)
Dafür kannst du auch das _BV() (bit value) Makro verwenden. z.B.:
TCCR1A = _BV(CS11) | _BV(CS10);
Du siehst den Namen des Registers und des Bits das gesetzt wird. Das ist alles was man wissen muss.
Es gibt auch in der Arduino IDE zusätzliche Makros wie bit() für die Maske und bitSet()/sbi() und bitClear()/cbi() für das Setzen und Löschen eines Bits. Könnte also auch so sein:
bitSet(TCCR1A, CS11);
Bei sowas weiß man ohne Kommentare nicht was gemacht wird:
TCCR1A = 0b1001001;
Und selbst mit Kommentaren ist es schlecht lesbar und wartbar
Im Endeffekt landet im Programm genau die Zahl, Die Du zuvor berechnet und 'als Byte' eingegeben hast.
Das zusammen schieben der Bits macht der Kompiler schon beim Kompilieren.
Der muß dafür zwar ein paar Dinge mehr machen, aber bei heutigen Rechner ist diese Zeit wohl kaum der Rede wert.
Wesentlich bessere Lesbarkeit bei identischem Endergebnis.
Mein Denkfehler waren hauptsächlich die vorgefertigten Konstanten.
Als serenifly geschrieben hat, dass die ja die Position des bits angeben, ist der Knoten geplatzt.
Und zur Geschwindigkeit: Selbst wenn es der Microcontroller selbst machen muss, sind ein Schiebe- und AND-Befehl seit "Urzeiten" die schnellsten Befehle, die so ein Ding hat.
In kurzform erklärt:
Anstatt Assembler Shift Statements, wird eine Addition in einer Schleife gemacht!
Jeder shift wird zu einer Addition mit sich selber, was einer Multiplikation mit 2 entspricht.
Der Shift im Beispiel kostet 6 Additionen, und eben so viele Sprünge und Schleifenzählerabhandlungen
Wahrscheinlich wird der Kompiler diesen Weg wählen, weil Er kürzer ist - aber bitweise schieben kann Der schon.
LSL/LSR/ROL/ROR/ASR
Zugegeben - die Dinger sind nur für Byte
Dennoch bleibt erhalten:
Bitshift um 1 benötigt eine Zeit
Bitshift um 6 benötigt sechs mal die eine Zeit
Und die Schleife muss auch noch sein, wenn der Schiebewert nicht konstant ist.