Forum: Mikrocontroller und Digitale Elektronik 4fach Drehschalter einlesen


von Alex K. (derheld2k1)


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

von Peter D. (peda)


Lesenswert?

Alex K. schrieb:
> Sieht jemand den Fehler?

Nö.
Ohne Schaltplan Deiner unbekannten Logik nicht.

Stellung 4 gibt es nicht, 2 Bits können nur 0..3 kodieren.

Drehschalter gibt es kurzschließend oder unterbrechend. Je nachdem gibt 
es Zwischenzustände. Daher erst akzeptieren, wenn der Wert einige Zeit 
(5s) stabil ist.


Peter

von Alex K. (derheld2k1)


Angehängte Dateien:

Lesenswert?

Anbei meine Logik


> Stellung 4 gibt es nicht, 2 Bits können nur 0..3 kodieren.
Der Schalter hat Stellung 1..4 was in der SW natürlich 0..3 entspricht.

> Drehschalter gibt es kurzschließend oder unterbrechend.
Dieser ist kurzschließend

von Alex K. (derheld2k1)


Lesenswert?

Es ist mir bewusst, dass auch ein Drehschalter prellt.
Aber die while(1) Schleife wird auch nach Minuten nicht verlassen, 
nachdem der Schalter von Stellung 4 auf 3 gedreht wurde. (Stellung 2 
löst sofort das Verlassen der Schleife aus)

von HolgerT (Gast)


Lesenswert?

Was sind das für NOR gatter? (Baureihe?)

In der Regel nimmt man Pull-UP und schaltet mit einem Schalter/Taster 
nach MASSE.

von HolgerT (Gast)


Lesenswert?

Nachtrag: "In der Regel nimmt man Pull-UP und schaltet mit einem 
Schalter/Taster
nach MASSE." --> Dann natürlich nicht NOR sondern (N)AND-Gatter 
verwenden.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Alex K. schrieb:
> if(temp != 3)
>       break;

Da steht aber, das alles was nicht 3 ergibt, die Schleife verlässt. Die 
Gatter kannste übrigens mit ein paar Dioden ersetzen.

von HolgerT (Gast)


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.

von chick (Gast)


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.

von Alex K. (derheld2k1)


Lesenswert?

Die NOR Gatter sind aus der 74HCT Baureihe. Die Rs haben 100Ohm, damit 
genug Strom für den Schalter fließt (Silberübergänge). Die Pegel werden 
zuverlässig erreicht so wie ich es aufgabaut habe. Der Fehler sollte 
nicht in der Hardware zu finden sein.

von Alex K. (derheld2k1)


Lesenswert?

Matthias Sch. schrieb:
> Alex K. schrieb:
>> if(temp != 3)
>>       break;
>
> Da steht aber, das alles was nicht 3 ergibt, die Schleife verlässt.

Wo siehst du hier nen Fehler?

von Alex K. (derheld2k1)


Lesenswert?

Hat noch jemand eine Idee?

von Jens (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Alex K. schrieb:
> Hat noch jemand eine Idee?

Du hast ein LCD. Lass dir den Wert ausgeben.

(Und kürz den ganzen Schmafuh ein wenig. Ist doch unsinnig da eine 
Endlosschleife aufzubauen, um dann mit einem break auszubrechen.
1
  uint8_t temp = (PINA & 0x60) >> 5;
2
3
  if(temp == 3) {
4
    lcd_prints("ERROR");
5
    while( ( (PINA & 0x60) >> 5 ) == 3 )
6
      ;
7
  }

von Jens (Gast)


Lesenswert?

geht sogar so:

                               (Stellung 0)

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

JJ

von -_- (Gast)


Lesenswert?

Die letzten zwei Dioden können auch noch raus und das gane mit in die SW 
rein.

von Jens (Gast)


Lesenswert?

@-_-

da denk mal noch mal drüber nach.

Du kannst dir ja ein Wurstbrot programmieren, mal sehen wie satt du 
davon wirst.

JJ

von -_- (Gast)


Lesenswert?

Jens schrieb:
> da denk mal noch mal drüber nach.

Ja, nochmals darüber nachgedacht.
Die beiden Dioden müssen da wirklich rein.

Sorry...

Mein Wurstbrot schmeckt mir in der realen Welt doch besser.

von Jens (Gast)


Lesenswert?

:-)

JJ

von Alex K. (derheld2k1)


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!

von Peter Z. (Gast)


Lesenswert?

He, ich schaue mir deinen Schaltplan an,
so wie ich es sehe, wird deine Endlosschleife verlassen,
wenn du nicht in Schalterstellung 1 (11) bist.

von Jens (Gast)


Lesenswert?

!=3 heißt alles das nicht gleich 3 ist, also auch 0,1,2,4,5,6 nur eben 
nicht gleich 3 ist wahr...

von Alex K. (derheld2k1)


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

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.