Das ist:
eine Hilfsvariable, die mit ihrem Wert (0 oder 1, FALSE oder TRUE) eine
Aussage darüber macht, ob der Zähler laufen soll oder nicht. Ist die
Aussage der Variable dergestalt, dass der Zähler laufen soll, dann macht
das der Zähler dann auch: er wird hochgezählt und ausgegeben.
Davon losgelöst ist die Steuerung dieser Variable. In deinem Fall können
zb die beiden Schalter/Taster auf diese Variable einwirken. Das muss
nicht so sein, ist bei dir aber so. Es wäre auch denkbar, dass diese
Variable von anderen Dingen beeinflusst wird. Vieles ist möglich, aber
wichtig ist, dass du das Vorhandensein der Schalter/Taster vom Zähler
entkoppelt hast. Der Zähler 'hängt' nur an seiner Variablen - wie auch
immer die dann beeinflusst wird.
ist der konstrukt mit
SW0 != ein mit ein |= SW0 gewollt?
damit dürfte der Zahler erst mit dem losslaseen loslaufen.
der zahler geht alle 150 ms um eins nach oben.
der else zweig wird nur aktiev wenn du beide tasten drückst!
damit ist SW0 == dem überschriebenen Ein. und dann und nur dann kann
auch der else zweig aktiv werden.
wobei beim losslassen das ganze wieder los düst, da die selbsthaltung
nicht gelöscht wurde.
>> Wofür an dieser Stelle ein Delay?
Damit er seinen Binärzähler auch hochlaufen sieht. Ob er denn delay in
den Zählteil mit reinnimmt oder so wie hier in die Hauptschleife gibt,
bleibt ihm überlassen.
noch ein problem.
selbst wenn du im else zweig die selbshaltung löscht, ist SW0 ja
immernoch gedrückt, was dann wieder der startbedingung entspricht.
Der vorschlag von Karl Heinz sieht da besser aus. Da muss man sich nicht
das hirn so verrenken um zu kapieren was da einer machen will.
Unbekannter schrieb:> Hmm, muesste das nicht if (SW2 != ein) heissen oder ähnlich?
Das Programm funktioniert soweit ganz gut die Abruch bzw. Stopbedingung
ist mein Problem. Sobald ich SW0 drücke startet das Programm. Wenn ich
SW0 gedrückt halte stoppt das Programm und ich kann mit SW2 den Zähler
auf null setzen. Dann startet das Programm von selbst wieder. Ich würde
aber gerne das Programm stoppen und dann zurücksetzen und dann erneut
mit SW0 starten.
D.h. du hast 3 notwendige Funktionen
* Zähler starten
* Zähler stoppen
* Zähler auf 0 setzen
aber nur 2 Taster. Das geht dann so nicht, solange du dich nur auf einen
gedrückten Taster konzentrierst.
Du läufst gerade in das Problem hinein, dass du einen Tastendruck von
einer gedrückten Taste unterscheiden lernen musst.
Das wäre noch nicht so schlimm, wenn dir da nicht die notwendige
Tastenentprellung einen Strich durch die Rechnung machen würde.
Entprellung
Das ist das problem das ich erkannt habe.
Beim Stoppen wird die selbshaltung nicht gelöscht. "ein" wird nicht
wieder genullt. Selbst wenn du das machen würdest, hättest du das
problem, das SW0 noch gedrúckt ist, ein != SW0 und somit im nächsten
durchlauf die startbedingung wieder erfüllt ist.
Karl Heinz schrieb:> D.h. du hast 3 notwendige Funktionen>> * Zähler starten> * Zähler stoppen> * Zähler auf 0 setzen>> aber nur 2 Taster. Das geht dann so nicht, solange du dich nur auf einen> gedrückten Taster konzentrierst.
Alternativ würde ich vorschlagen, die Funktionen "Zähler auf 0 setzen"
und "Zähler starten" zusammenzulegen.
Karl Heinz schrieb:> wie wärs mit folgendem Schema
Danke die Lösung scheint perfekt zu sein ich hab mir die ganze Zeit das
Hirn verrenkt und bin eben nicht auf deinen Vorschlag gekommen.
DANKE
Karl Heinz schrieb:>> D.h. du hast 3 notwendige Funktionen>>>> * Zähler starten>> * Zähler stoppen>> * Zähler auf 0 setzen>>>> aber nur 2 Taster. Das geht dann so nicht, solange du dich nur auf einen>> gedrückten Taster konzentrierst.
Ich will ja auch mit SW1 den Zähler stoppen
@Karl Heinz
Eigentlich würden deine gesammelten Vorschläge ja schon ein gutes
Anfängerbuch abgeben, aber du solltest wirklich mal eins schreiben und
dann besser für Anfänger mit leichten Vorkenntnissen (also für mich
;-)).
Uwe Seelmann schrieb:> Karl Heinz schrieb:>>> D.h. du hast 3 notwendige Funktionen>>>>>> * Zähler starten>>> * Zähler stoppen>>> * Zähler auf 0 setzen>>>>>> aber nur 2 Taster. Das geht dann so nicht, solange du dich nur auf einen>>> gedrückten Taster konzentrierst.>> Ich will ja auch mit SW1 den Zähler stoppen
Und mit SW0 startest du ihn.
Und wie setzt du ihn auf 0 zurück? (Also jetzt: aus Benutzersicht
gesehen?)
Er hat doch 2 taster, damit lassen sich doch 4 zustände abbilden.
SW0 gedrückt Zähler starten
SW1 gedrückt Zähler stoppen
SW0 und SW1 gedrückt Zähler zurücksetzen (ggf nur dann wenn zähler nicht
läuft) wobei hier dann noch ein paar gemeinheiten mit reinspielen, da
man 2 taster nie gleichzeitig drücken kann. Das heist man müsste erst
sw1 drücken und gedrückt halten, dann kurz sw0 drücken um den Zähler zu
löschen.
beide nicht gedrückt entweder zählen oder nichts tun.
Karl Heinz schrieb:> Und wie setzt du ihn auf 0 zurück? (Also jetzt: aus Benutzersicht> gesehen?)
Ich habe ein STK500 da sind Taster verbaut, also dachte ich mir einen
zum Starten einen zum Stoppen und einen zum Rücksetzen. Am Anfang wollte
ich das mit nur zwei Tastern machen da hab ich aber eben keine richtige
Lösung gefunden.
Uwe Seelmann schrieb:> Karl Heinz schrieb:>> Und wie setzt du ihn auf 0 zurück? (Also jetzt: aus Benutzersicht>> gesehen?)>> Ich habe ein STK500 da sind Taster verbaut, also dachte ich mir einen> zum Starten einen zum Stoppen und einen zum Rücksetzen.
Also hast du 3 Taster. Ist ok.
Passt soweit. Du bist der Programmierer, du definierst wie das
funktionieren soll und wieviele Taster du einsetzt. Soweit hast du
absolut freie Hand.
Schweiriger wird es erst, wenn du eine Doppelfunktion auf einem einzige
Taster liegen hast. Wie zb. der erste Tastendruck startet den Zähler.
Der zweite Tastendruck auf demselben Taster stoppt ihn wieder. Und mit
dem anderen Taster setzt du ihn auf 0 zurück. Denn da läufst du in das
schon angesprochene Problem des sauberen erkennen eines Tstendrucks (im
Gegensatz zu 'ist ein Taster gedrückt') rein. Und da wirds dann
unangenehm.
Wieso soll das nicht mit zwei Tastern gehen.
Wenn Taster1
starte
Wenn Taster2
stoppe
Wenn alles gestoppt
Zähler zurücksetzen auf Null
Sehe ich das verkehrt?
F. Fo schrieb:> Wieso soll das nicht mit zwei Tastern gehen.> Wenn Taster1> starte> Wenn Taster2> stoppe> Wenn alles gestoppt> Zähler zurücksetzen auf Null> Sehe ich das verkehrt?
korrekt genau so war Plan eins
@Karl Heinz
Da Du recht kompetent bist hab ich da nochmal eine Frage wenn ich einen
Taster mit z.b kurzer Tastendruck = ein belegen will und langer
Tastendruck = aus belegen will wie realisiert man das?
Dafür hat man doch einen µC und in jedem noch so doofen Anfängerbuch
steht es doch drin, wie man Tastendrücke "festhält".
Ich hatte das jetzt sehr knapp beschrieben. Aber man kann es ja auch mit
einem Taster machen.
Jede Lampe mit Touch Steuerung funktioniert mit nur einem Taster und da
sogar mit mehreren Funktionen.
F. Fo schrieb:> Dafür hat man doch einen µC und in jedem noch so doofen Anfängerbuch> steht es doch drin, wie man Tastendrücke "festhält".
Kannst Du mir ein solches empfehlen.
Karl Heinz schrieb:> Schweiriger wird es erst, wenn du eine Doppelfunktion auf einem einzige> Taster liegen hast. Wie zb. der erste Tastendruck startet den Zähler.> Der zweite Tastendruck auf demselben Taster stoppt ihn wieder. Und mit> dem anderen Taster setzt du ihn auf 0 zurück. Denn da läufst du in das> schon angesprochene Problem des sauberen erkennen eines Tstendrucks (im> Gegensatz zu 'ist ein Taster gedrückt') rein. Und da wirds dann> unangenehm.
Ich kenne natürlich die "Entprellung" nach Peter Danegger, aber als ich
mit Arduino begonnen hatte, da machte man das im Buch mit einem ganz
kurzem Delay. Bei mir funktionierte das gut.
F. Fo schrieb:> Wieso soll das nicht mit zwei Tastern gehen.>> Wenn Taster1> starte>>>> Wenn Taster2> stoppe>>> Wenn alles gestoppt> Zähler zurücksetzen auf Null
Sobald du Taster 2 drückst IST alles gestoppt. Der Zähler geht auf 0.
Wie liest du das Zählergebnis ab?
Uwe Seelmann schrieb:> @Karl Heinz>> Da Du recht kompetent bist hab ich da nochmal eine Frage wenn ich einen> Taster mit z.b kurzer Tastendruck = ein belegen will und langer> Tastendruck = aus belegen will wie realisiert man das?
Ganz ehrlich.
Da dein Programm mit "zweiter Tag" überschrieben ist, geh ich davon aus,
dass du erst vor ein paar Tagen angefangen hast.
Und dafür ist diese Aufgabenstellung VIEL ZU SCHWER!
Das ist nichts gegen dich. Tasten sauber in allen möglichen Varianten
abzufragen IST SCHWER! (Erstaunlicher weise)
Daher: vertag das noch. Zumindest solange, bis du keine 2 Tage mehr
brauchst um rauszukriegen, dass du dir mit einer Hilfsvariablen (so wie
hier vorgeschlagen) das Leben enorm erleichtern kannst. Es hat wenig
Sinn, wenn ich dir jetzt fachgerecht auseinander setze, wie man das nach
den Regeln der Kunst macht. Du würdest 9/10 davon nicht verstehen, weil
dir im Vorfeld noch viel zu viel fehlt.
@Karl Heinz
Danke schön für die Hilfe ich werde mich da noch etwas einarbeiten und
wenn ich dann wieder auf das Problem stoße darf ich dann bei dir wieder
anfragen?
Gruß Uwe
Karl Heinz schrieb:> F. Fo schrieb:>> Wieso soll das nicht mit zwei Tastern gehen.>>>> Wenn Taster1>> starte>>>>>>>> Wenn Taster2>> stoppe>>>>>> Wenn alles gestoppt>> Zähler zurücksetzen auf Null>>> Sobald du Taster 2 drückst IST alles gestoppt. Der Zähler geht auf 0.> Wie liest du das Zählergebnis ab?
Wieso ist alles gestoppt?
Natürlich muss ich den "Taster1 gedrückt" in einer Variablen festhalten.
Das ist das Kapitel gleich nach dem "Blink".
Kann mir jemand erklären, wie sich die Tasten aktualisieren?
SWx sind Variablen und keine define#. Nach der Initialisierung werden
sie nicht mehr beschrieben. Was übersehe ich?
nur mal so schrieb:> Kann mir jemand erklären, wie sich die Tasten aktualisieren?>> SWx sind Variablen und keine define#. Nach der Initialisierung werden> sie nicht mehr beschrieben. Was übersehe ich?
Dass die Variablen innerhalb der Hauptschleife definiert sind.
D.h. jedesmal beim Ende der Schleife werden sie zerstört und mit dem
nächsten Durchgang durch die Schleife neu erzeugt. Und als solches
natürluch auch jedesmal wieder neu initialisiert. Mit den dann gültigen
Werten der Portpins
Karl Heinz schrieb:> D.h. jedesmal beim Ende der Schleife werden sie zerstört und mit dem> nächsten Durchgang durch die Schleife neu erzeugt.
Na klar! Ist ja nicht static deklariert. Danke!
War spät und lustig gestern. :-D