Hallo Forum
Möchte mit einem ATmega32 einen Stromstoßschalter realisieren, d. h.,
wenn ich den Taster drücke sollen alle LEDs von PORTC leuchten. Bei
nochmaltigen drücken des Tasters sollen alle LEDs wieder ausgehen.
Verwende einen externen PullDown für die Taster.
Habe schon einige Programme probert, jedoch ohne Erfolg.
Vermutlich handelt es sich um einen Denkfehler.
Hier mein derzeitiger Stand:
Das ist wie diese elektronischen Würfel, wenn du nicht wartest, bis die
Taste wieder losgelassen wurde (ggf. mit Entprellung, je nach Taster),
bleibst du durch Zufall entweder im An oder Auszustand, da die beim
Taste gedrückt-Zustand mehrere hundert Mal wechseln.
Das kann man mit einer state machine lösen.
state0 //Start
Wenn Taster gedrückt, dann state1
state1 LEDs einschalten
Wenn Taster losgelassen wird, dann state2
state2 Wenn Taster gedrückt wird, dann state3
state3 LEDs ausschalten
Wenn Taster losgelassen wird, dann state4
state4 Wenn Taster gedrückt wird, dann state1
Versuchs mal!
Danke für deinen Hinweis, aber ich weiß nicht wie ich deine Anweisung in
C umsetzten soll. Vielleicht könntest du ein bisschen konkreter werden.
Überlege schon den ganzen Tag, jedoch ohne Erfolg.
Fang erst mal einfach an. Schreib ein Programm das die
LEDs einschaltet, wenn der Taster gedrückt ist und die
LEDs ausschaltet, wenn der Taster losgelassen ist.
Als zweiter Schritt kommt die state machine.
Eine Variable enthält den aktuellen state.
Z.B. mystate.
Jetzt wird fortlaufend abgefragt, welchen Wert mystate
hat. Dies ist in einer switch-Anweisung am übersichtlichsten.
while (1)
{
switch (mystate)
{
case 0: if (/* Taste gedrückt */)
mystate=1;
break;
case 1: /* LEDs einschalten */
if (/* Taste losgelassen */)
mystate=2;
break;
case 2:
case 3:
case 4:
}
}
Ich habe nur die Kommentare eingefügt. Du musst dort
deine Tasterabfrage programmieren und die LEDs schalten.
Wie es nach case 1 weitergeht habe ich ja schon beschrieben.
Danke für deine Unterstützung. Habe das Programm nach deinen Anweisungen
programmiert, doch es will nicht funktionieren.
Bitte um Korrektur meines Codes
noname schrieb:
> Das kann man mit einer state machine lösen.
Das ist aber nicht der optimale Ansatz, da dabei nicht das Prellen
gelöst wird.
Besser ist eine Entprellroutine als erster Schritt und da fällt dann das
Ereignis des Drückens nebenbei mit ab.
Und dann braucht man nur noch ne Toggle-Funktion (EXOR).
Aber das steht ja oben schon alles fix und fertig für 2 Tasten + 2 LEDs.
Peter
Du kannst zum Debuggen über die LEDs mystate anzeigen lassen.
Dann siehst du wo das Programm steht.
Es liegt vermutlich an ~PINB. Du must hier maskieren.
D.h. den Portpin (das Bit von PINB) auswerten.
Also 'ne State machine für diese popelige Aufgabenstellung ist doch
reichlichst übertrieben. Richtig ist, man braucht eine Entprellung. Rest
siehe Peter D.
Muss man eigentlich eine Entprellroutine verwenden,
wenn der Taster gar nicht prellt?
(Einfach ein RC-Glied vor den AVR-Eingang schalten)
Ich denke das Prellen ist hier nicht das Problem
sondern das Abfragen eines Eingangs und die
Anfangsschwierigkeiten mit C.
Ich habe den Beitrag von P.D. noch nicht durchgelesen,
werde dies aber tun, wenn ich mal eine sehr gute
Entprellung benötigen sollte.
@ Jens
Danke für dein Programm, jedoch behandelt es nur die Prellzeit und nicht
die eigentliche Funktion. Mein Anliegen ist einen Stromstoßschalter zu
ralisieren.--> Wenn eine Taste gedrückt wird sollen alle LEDs leuchten,
bei einem weiteren betätigen des Tasters sollen die LEDs wieder
ausgehen. Vielleicht haben andere User einen Tipp.
Danke an alle für die Hilfe.
@ noname
Danke für dein Programm, wäre nicht so schnell auf diese Variante
gekommen.
Den letzten Eintrag von dir habe ich auch schon vorher probiert nur mit
der ~. Wieder mal ein Denkfehler! Gibt es auch andere
Programmiervarianten für den Stromstoßschalter?
Danke nochmal für deine Hilfe
> Gibt es auch andere> Programmiervarianten für den Stromstoßschalter?
Peter Dannegger schrieb:
> Besser ist eine Entprellroutine als erster Schritt und da fällt dann das> Ereignis des Drückens nebenbei mit ab.> Und dann braucht man nur noch ne Toggle-Funktion (EXOR).>> Aber das steht ja oben schon alles fix und fertig für 2 Tasten + 2 LEDs.>>> Peter
lies doch einfach mal, was man dir schreibt.
und wart nicht nur auf fertigen code, den du weder verstehst, noch zu
100% per copy/paste übernehmen kannst.
@Jens
Ich denke, über eines sind wir uns einig.
Tasten entprellen ist eine wichtige und oft benötigte Funktionalität.
Von daher ist es kontraproduktiv, das Einlesen und Entprellen von
Tastern in die Aufgabenstellung so dermassen einzuweben, wie du das
machst.
Legen wir die PeDa-Entprellung zu Grunde, so lautet die Hauptschleife
ja natürlich,
ich wollte es doch nur ganz verständlich machen.
Wenn ich mehrere Taster auslese, dann auch mit XOR und alten Pinzustand
mit neuem vergleichen, wo Änderung und ob Taste gedrückt oder
losgelassen wurde usw. und als extra Routine oder auch Datei
(Tasten.c)usw..
Auch die Aktionen, die dann ausgeführt werden sollen, werden in
Extradateien bzw. Routinen ausgeführt ---- z.B. TaAktionOn(i),
TaAktionOff(i)