PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schiebeschalter abfragen



rogerberglen
06.10.2006, 12:49
Hallo,
nachdem ich jetzt so einigermassen den Durchblick habe nun eine Frage: Ich möchte an einem Pin einen Schiebeschalter abfragen (ständig 0 oder 1) und
dann entsprechend nur einmal einen Text auf einem Display ausgeben. Habe dazu folgenden Code geschrieben:
Anfang:

Portd.4 = 0 'Led einschalten.
If Pind.1 = 0 Then 'Je nach Schalterstellung wird auf dem
Text1 = " 1 Pe" 'Display die jeweilige Betriebsart an-
Text2 = "rson" 'gezeigt. Diese wird auch zur weiteren
P = 0 'Verarbeitung verwendet.
If Sta = 0 Then T = 15 '15Min. vorgeben (nur bei 1. Durchlauf)
Elseif Pind.1 = 1 Then
Text1 = " 2 Per"
Text2 = "sonen" 'Dazwischen wird der Status des Tas-
P = 1 'ters mehrfach zur weiteren Verarbei-
If Sta = 0 Then T = 10 'tung abgefragt.10Min. vorgeben (nur
End If 'bei 1. Durchlauf)

If P = X Then 'Der Display wird dabei nur neu aufge-
Cls 'baut wenn sich die Schalterstellung
Waitms 300 'ändert.
Locate 1 , 3
Lcd Text1
Locate 2 , 1
Lcd Text2
X = Not X
End If

Goto Anfang

leier hat die Sache einen Haken, denn wenn der Schalter am Anfang schon auf 1 steht, dann wird der Display nicht aufgebaut.
Gibst da eine elegantere Lösung um einen Pin auf eine abfallende oder ansteigende Flanke hin zu prüfen, so dass vom Programm her erst wieder eine Aktion eintritt wenn sich der Zustand ändert??

Eine 2. Frage:
Gibt es eine Lösung wie man trotz dem Wait-Befehl noch nebenher irgendwelche Ports einlesen kann? z.B. einen Taster für einen Abbruch?

SIGINT
06.10.2006, 14:23
Soweit mir bekannt ist bestizt jeder AVR einen Pin-change-interrupt.... der ist genau dafür da bei einer Flanke an einem oder mehreren Pins einen Interrupt auszulösen. AAAABER: Der Schalter wird wahrscheinlich Prellen... das must du beim schreiben der ISR beachten!!! Sonst meldest du dich nach kaum ein paar Stunden wieder, warum das Programm nicht läuft ;)
Allerdings löst der Iterrupt noch nicht dein Problem, daß das Display beim ersten mal nicht aktualisiert wird...

Zur Frage 2:
Ja, einfach das Wait durch einen Timer ersetzen und eine loop schleife solange ausführen, bis der Timer abgelaufen ist. In der Loop-Schleife kannst du dann machen,was du willst.

Gruß,
SIGINT