#define POS_IGNITION 0 #define POS_SHIFT_UP 1 #define POS_NEUTRAL 2 #define POS_SHIFT_DOWN 3 #define IGNITION bit_is_set(PINB, POS_IGNITION) // Zündung (active HIGH) #define SHIFT_UP ~bit_is_set(PINB, POS_SHIFT_UP) // reedkontakt zum hochschalten (active LOW) #define NEUTRAL ~bit_is_set(PINB, POS_NEUTRAL) // wenn gesetzt dann ist neutral gang aktiv (active LOW) #define SHIFT_DOWN ~bit_is_set(PINB, POS_SHIFT_DOWN) // runterschalten (active LOW) if(NEUTRAL && !SHIFT_UP && !SHIFT_DOWN) kopieren... { counter = 1; } End Hallo, habe Probleme die Taster abzufragen. Die einzelnen Pins außer bin 0 werden nicht registriert. An was könnte das liegen. ? Danke im Voraus. MFG :)
Sepp Ackermann schrieb:
Verwende hier die logische Negation, denn genau das willst du hier ja
machen.
1 | #define SHIFT_UP !bit_is_set(PINB, POS_SHIFT_UP) // reedkontakt zum hochschalten (active LOW)
|
2 | #define NEUTRAL !bit_is_set(PINB, POS_NEUTRAL) // wenn gesetzt dann ist neutral gang aktiv (active LOW)
|
3 | #define SHIFT_DOWN !bit_is_set(PINB, POS_SHIFT_DOWN) // runterschalten (active LOW)
|
je nach den Details von bit_is_set kann das einen Unterschied ausmachen. Eine dezidierte bit_is_clear wäre noch besser.
Sepp Ackermann schrieb: Verwende hier die logische Negation, denn genau das willst du hier ja machen. #define SHIFT_UP !bit_is_set(PINB, POS_SHIFT_UP) // reedkontakt zum hochschalten (active LOW) #define NEUTRAL !bit_is_set(PINB, POS_NEUTRAL) // wenn gesetzt dann ist neutral gang aktiv (active LOW) #define SHIFT_DOWN !bit_is_set(PINB, POS_SHIFT_DOWN) // runterschalten (active LOW) je nach den Details von bit_is_set kann das einen Unterschied ausmachen. Eine dezidierte bit_is_clear wäre noch besser. danke erst mal für deine antwort. ....hab sie leider vorher schon ausprobiert, hat aber auch nicht geklappt. habs auch schon mit bitweisem undieren versucht. das programm läuft im debugger problemlos durch. wie meinst du das mit dem "dezidierten bit_is_clear". ?
Sepp Ackermann schrieb: > ....hab sie leider vorher schon ausprobiert, hat aber auch nicht > geklappt. Das ! ist schon richtig. Dann gibts eben noch ein Problem. > wie meinst du das mit dem "dezidierten bit_is_clear". ? so wie du ein bit_is_set (Makro oder Funktion?) hast, solltest du auch ein bit_is_clear haben. ALso: wie genau ist bit_is_set implementiert? Was ist sein Ergebniswert?
Schnellschuss
1 | #define SHIFT_UP !(bit_is_set(PINB, POS_SHIFT_UP)) // reedkontakt zum hochschalten (active LOW)
|
2 | #define NEUTRAL !(bit_is_set(PINB, POS_NEUTRAL)) // wenn gesetzt dann ist neutral gang aktiv (active LOW)
|
3 | #define SHIFT_DOWN !(bit_is_set(PINB, POS_SHIFT_DOWN)) // runterschalten (active LOW)
|
hab das schon ausprobiert. Ergebniswert ist null bzw. größer null. !(PINB&0x1)....also, im debugger läufts durch. Greeez.
Karl heinz Buchegger schrieb: > ALso: wie genau ist bit_is_set implementiert? > Was ist sein Ergebniswert? das ist eine berechtigte Frage, und es ist nicht besonders höflich keine Antwort zu geben,# vor allem wenn man von dem anderen Hilfe erwartet
ok, sorry. bin grad ein wenig verplant. :( funktion ist im header definiert im avrstudio. Rückgabewert ist 0 bzw. größer 0.
Sepp Ackermann schrieb: > ok, sorry. bin grad ein wenig verplant. :( > > funktion ist im header definiert im avrstudio. Rückgabewert ist 0 bzw. > größer 0. Genau. Und darum ist ~ auf jeden Fall falsch. Denn ~ von 0x02 ergibt etwas, was ebenfalls nicht 0 ist. Im gleichen Header gibt es übrigens ein bit_is_clear. Bleibt noch die Abfragelogik selber. Umgangssprachlich werfen wir die Begriffe UND und ODER gerne völlig falsch durcheinander. * Prüf mal an ganz einfachen Beispielen ab, ob du nicht ein Hardwareproblem mit den bewussten Tastern bzw. Kontakten hast * Wenn sich da nichts findet, dann hast du irgendwo im Programm einen anderen Fehler.
bei der Fehlersuche zielt man oft daneben, d.h. du vermutest den Fehler an einer bestimmten Stelle, er liegt aber ganz woanders Wenn Du ihn selber suchen willst, dann versuche den Fehler isolieren, alles also drum rum weg wenn du willst das einer hier aus dem Forum den Fehler sucht, dann darfst du nicht nur einzelne Brocken hinwerfen, sondern bitte das ganze Programm, am besten natürlich von allem unnötigen Ballast befreit und verbunden mit einer genauen Fehlerbeschreibung.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.