Hallo Leute, ich denke ich hab ein Brett vorm Kopf, aber ich Suche jemanden, der mir das Brett wegnimmt - also hier das "Problem":
Der Code war zuerst folgender:
Code:
uint8_t keys_state=0;
//Tasten liegen an PINA4-7 und sind active low
keys_state = ~PINA >> 4;
Die Eingabe für PINA ist 0b11111111, weil alle 4 Tasten nicht gedrückt sind und die anderen Pins auch high sind. Das Ergebnis war (für mich zuerst überraschend) 0b11110000.
Dann hab ich mir gedacht, dass er das µC Register vielleicht als signed int interpretiert und deshalb mit dem vermeintlichen Vorzeichenbit und nicht mit Nullen auffüllt, was das Ergebnis erklären würde.
Daher der neue Code:
Code:
uint8_t keys_state=0;
//Tasten liegen an PINA4-7 und sind active low
keys_state = PINA;
keys_state = ~keys_state >> 4;
Nun sollte er keys_state als unsigned int mit Nullen auffüllen...tut er aber nicht. Mögliche Erklärung: Er verschiebt erst und invertiert dann, aber laut Docs hat der ~ Operator eine höhere Priorität als der >> Operator. Auch eine Klammer um das ~keys_state führt nicht zum gewünschten Ergebnis.
Was allerdings funktioniert ist folgendes:
Code:
uint8_t keys_state=0;
//Tasten liegen an PINA4-7 und sind active low
keys_state = PINA;
keys_state = ~keys_state;
keys_state = keys_state >> 4;
Zerlegt man die Aktion in zwei einzelne (was ja nach der Priorität sowieso passieren sollte), bringt er das gewünschte Ergebnis (0b00000000)
Wo ist mein Denkfehler?
Lesezeichen