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:
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.Code:uint8_t keys_state=0;
//Tasten liegen an PINA4-7 und sind active low
keys_state = ~PINA >> 4;
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:
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.Code:uint8_t keys_state=0;
//Tasten liegen an PINA4-7 und sind active low
keys_state = PINA;
keys_state = ~keys_state >> 4;
Was allerdings funktioniert ist folgendes:
Zerlegt man die Aktion in zwei einzelne (was ja nach der Priorität sowieso passieren sollte), bringt er das gewünschte Ergebnis (0b00000000)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;
Wo ist mein Denkfehler?