Marcus B. schrieb:
> Hallo Karl Heinz
>
> Dankeschön das hat den Fehler behoben. Aber warum hat es dann beim
> ersten Mal funktioniert und es hat die richtigen Werte angezeigt?
Weil du beim ersten mal die Kanäle in der Reihenfolge
0, 1, 2, 3
durchgegangen bist. Wenn du dir diese Zahlen binär ansiehst, dann kommt
mit Ausnahme der 2 immer nur 1 Bit dazu.
0000
0001
0010
0011
d.h. anstelle der Kanals 2 hast du im ersten Durchgang den Kanal 3
gemessen. Ich gehe mal davon aus, dass dir das nicht weiter aufgefallen
ist.
Mit einem |= kannst du immer nur Bits setzen, aber du kriegst sie nicht
wieder auf 0 zurück. Und da das so ist, kannst du im nächsten Durchgang
eine Kanalnummer im Bereich 0 bis 3 angeben, das Ergebnis der Veroderung
wird immer 3 sein.
Die Korrekte Anweisung lautet
ADMUX |= (ADMUX & ~(0x1F)) | (channel & 0x1F);
siehst du dir den Teil rechts vom = an, dann steht da
ADMUX & ~(0x1F)
der Teil setzt die Kanalbits gezielt auf 0. Und der Teil
| (channel & 0x1F)
bringt dann die neuen Kanalbits ein.
In Summe ergibt dieser Ausdruck also
* alle Nicht-Kanal Bits bleiben unverändert
* zuerst werden die Kanal-Bits gezielt auf 0 gesetzt
* diese 0 wird dann mit dem Bitmuster des gewünschten Kanals
überschrieben
* und dieses Endergebnis ist damit das vollständige Byte, welches
an ADMUX wieder zugewiesen wird, bei dem die Kanalbits gegen das
Bitmuster des neu gewünschten Kanals ausgetauscht wurde.
>1 | > TCCR1B |= (1<<CS10) | (1<<CS12)| (1<<WGM12);
|
2 | >
|
>
> Hier stell ich den Prescaler für einen Timer ein ist dann |= auch falsch
Du sollst nicht raten sondern dir überlegen, warum da ein |= gemacht
wird, was der bewirkt und was da mit den Bits passiert.
Bitmanipulation