Forum: Mikrocontroller und Digitale Elektronik Wie löse ich das mit logischen Verknüpfungen ?


von Andreas K (Gast)


Lesenswert?

Hallo,

ich hänge wieder mal an einem kleinen Problem:

Ich habe 8 Taster sowie 8 LEDs über 2 Schieberegister am SPI eines
ATMega8 hängen. Mein erstes Ziel war, wenn ein Taster gedrückt wird,
dass die entsprechende LED angeht, wenn sie vorher aus war und
umgekehrt. Mit XOR soweit kein Problem:

LEDS ^= TASTER;

wobei Taster, wie der Name schon sagt, eine 8-Bit-Zahl für die
eingelesenen Taster ist, LEDS das, was danach über SPI ausgegeben
wird.

Jetzt werden die Taster aber nicht über einen externen Interupt,
sondern gesteuert über den Timer regelmäßig abgerufen. Das hat
natürlich zum Ergebniss, dass die LED mit jedem Funktionsaufruf ihren
Zustand ändert, solange ein Taster gedrückt ist.

Jetzt will ich erreichen, dass bei 1x drücken und gedrückt halten sich
der LED-Zustand auch nur 1x ändert. Also habe ich mir gedacht man
müsste eingelesenen Wert so manipulieren, dass eben nur auf den Stellen
1er stehen, wo tatsächlich gerade ein Low/High-Übergang stattgefunden
hat. Zu dem Zweck habe ich mir das Sperrgatter ausgesucht - so sieht
der Code dann aus:

CHANGES = !TASTERALT & TASTER;
LEDS ^= CHANGES;

TASTER = letzter eingelesener Stand
TASTERALT = vorletzter eingelesener Stand

Was ich jetzt nicht verstehe: irgendwie funktioniert das ganze nur bei
LED1, bei den anderen 7 tut sich gar nichts. Habe es auch schon auf
verschiedene Art und Weise versucht, klammern zu setzen, leider ohne
Erfolg.

Weiß jemand Rat ?

Danke !

von Michael (Gast)


Lesenswert?

...
nicht '!' sonden '~' verwenden
...
CHANGES = ~TASTERALT & TASTER;

von Andreas K (Gast)


Lesenswert?

Danke funzt

ich glaube ich bin etwas PHP & Co - verseucht ;o)

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
Noch kein Account? Hier anmelden.