4fach Drehschalter einlesen

OP #2629398
Lesenswert?

Hallo zusammen,

ich habe einen 4fach Drehschalter über ein bisschen Logik an 2 Pins (PA5 
und PA6) an einem ATMega32 angeschlossen.
Die Logik brauche ich um von den 4 Ausgängen des Schalters auf 2 
Eingänge am ATMega zu kommen. Diese besteht aus NOR Gattern und 
funktioniert auch wunderbar.

In main() frage ich den Schalter so ab:
1
uint8_t temp = (PINA & 0x60) >> 5;

Wie gesagt das klappt, alle 4 Zustände können einwandfrei erkannt 
werden.

Nun habe ich eine "verbotene" Schalterstellung, sagen wir Stellung 4.
In der Software soll nun eine Fehlermeldung auf LCD ausgegeben werden, 
wenn sich der Schalter dieser Stellung befindet.
Wird dann eine erlaubte Stellung gewählt, so soll die Software normal 
weiterlaufen.

Ich habe das so "gelöst":
1
uint8_t temp = (PINA & 0x60) >> 5;
2
if(temp == 3) {
3
  lcd_prints("ERROR");
4
  while(1) {
5
    temp = (PINA & 0x60) >> 5;
6
    if(temp != 3)
7
      break;
8
  }
9
}

Das Problem ist nun dass die while(1) Schleife erst verlassen wird wenn 
der Schalter auf Stellung 2 gedreht wird.
Das sollte aber schon auf Stellung 3 geschehen.

Sieht jemand den Fehler?
Danke schonmal und Grüße, Alex
Gast #2629497
Lesenswert?

> Da steht aber, das alles was nicht 3 ergibt, die Schleife verlässt.

Ja, und wenn die Widerstände nicht ausreichen, um am Gatter einen 
definierten LOW-Pegel zu erzeugen, hängt das Ganze dann noch ein wenig 
vom Zufall ab - Deshalb die Frage nach der Baureihe, interessant ist 
natürlich noch, welchen Wert die Widerstände haben.

Und nocheinmal - besser, man macht das mit Pull-UP.
Gast #2629510
Lesenswert?

Einspruch!

Bei so einer simplen Schaltung ist es herzlich egal, ob PullUp oder 
PullDown. Der Pegel muß stimmen. Und der ergibt sich aus Widerstandswert 
und verwendeter Baureihe.

Der Widerstand bei Schalterstellung 2 ist überflüssig, aber das ist im 
Grunde auch nicht wichtig.
Gast #2629832
Lesenswert?

Portpin mit engesch. Pullup nutzen [X]

                               (Stellung 0)

[X1]-----------o--|>|----------(Stellung 1)
               |
[X2]-------o---+--|>|----------(Stellung 2)
           |   |
           |   '--|>|------o---(Stellung 3)
           |               |
           '------|>|------'

>>Wo siehst du hier nen Fehler?

>> if(temp != 3)
>>       break;
>
> Da steht aber, das alles was nicht 3 ergibt.

Steht doch da! Lies mal richtig!

JJ
OP #2629882
Lesenswert?

Ich hab grad ein riiiieeesen Brett vorm Kopf...
Die Diodenschaltungen erscheinen mir schlüssig, daran hatte ich nicht 
gedacht, sondern bin gleich mit "richtiger" Logik drauflosgegangen.
Danke dafür !

Mein eigentliches Problem hab ich noch nicht erkannt, ich werde mir mal 
den Wert auf dem LCD ausgeben lassen. Ich bin sicher dass es so ein 
trivialer, dummer Denkfehler von mir ist, dass es dann sofort klar ist.

Da ich momentan keinen Zugriff auf die HW habe, werde ich erst Abends 
schreiben können, ob alles geklappt hat.

Vielen Dank an alle!
OP #2630325
Lesenswert?

Hallo nochmal,

so Problem ist gelöst, da es eigentlich kein Problem gab....
Ich habe ein recht umständliches LCD "Update Verfahren".
Dieses wurde nur nicht richtig getriggert wenn nach der "verbotenen" 
Schalterstellung wieder eine Erlaubte gewählt wird....

Aber ohne diesen "sinnlosen" Post wäre ich nie auf die Idee gekommen, 
dass die Logikschaltung mit so geringen Aufwand (2 Dioden) zu 
realisieren ist.

Vielen Dank und schöne Grüße,
Alex

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren