4fach Drehschalter einlesen

OP #2629398
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
#2629408
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
OP #2629413
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
Angehängte Dateien:
OP #2629436
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)
Gast #2629484
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.
Gast #2629497
> 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
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.
OP #2629523
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.
Gast #2629832
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
#2629835
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
  }
Gast #2629837
geht sogar so:

                               (Stellung 0)

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

JJ
OP #2629882
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.