Forum: Mikrocontroller und Digitale Elektronik Problem beim einlesen der Taster. Bitte um Rat :)


von Sepp A. (seppi)


Lesenswert?

#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 :)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Sepp A. (seppi)


Lesenswert?

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". ?

von Karl H. (kbuchegg)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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)

von Sepp A. (seppi)


Lesenswert?

hab das schon ausprobiert. Ergebniswert ist null bzw. größer null.
!(PINB&0x1)....also, im debugger läufts durch.

Greeez.

von Walter (Gast)


Lesenswert?

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

von Sepp A. (seppi)


Lesenswert?

ok, sorry. bin grad ein wenig verplant. :(

funktion ist im header definiert im avrstudio. Rückgabewert ist 0 bzw. 
größer 0.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Walter (Gast)


Lesenswert?

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