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_ttemp=(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_ttemp=(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
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
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
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)
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.
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.
> 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.
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.
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.
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?
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
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.
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.
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!
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