PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Taster mit Zeitschleife



bnitram
13.05.2010, 13:47
Hallo Forum,
Ich wollte mal fragen ob ihr wisst, wie Ich folgendes programmieren kann?
Ich möchte einen Taster nehmen und wenn man ihn 1sek gedrückt hat soll er die Aktion erst starten.Wenn er länger oder kürzer gedrückt worden ist, soll nichts passieren.
Wie programmiere ich das????
Wenn es geht hätte ich gerne einen Beispielcode gesehen.
Entweder in Basic oder C

Ich sag schon mal Danke!

peterfido
13.05.2010, 14:47
Ich nutze oft einen Timer, welcher mir die TickCount API nachmacht.
Einfach den Wert des TickCounts merken, wenn der Timer gedrückt wurde und wenn er losgelassen wurde, die Zeit ausrechnen.

Du kannst auch die Sekunden "mißbrauchen", falls Du eine Uhr mitlaufen hast. Oder in der Hauptschleife bei gedrücktem Taster eine ms warten und wenn der Taster nach ~ 1000 Durchläufen losgelassen wurde reagieren.

Beispielcode macht für mich erst Sinn, wenn ich weiß, welche der Vorraussetzungen bei Dir (dem Programm) gegeben sind.

NeyezP.
13.05.2010, 15:05
ja so ähnlich mach ichs auch immer

s.o.
13.05.2010, 17:51
Oder einfach jede 10ms pollen und die Durchgänge Zählen, wie lange er low ist. Bei high abrechen. Am besten mit ISR (interrupt) realisieren.

PICture
13.05.2010, 18:05
Hallo!

@ bnitram

Deine Idee hat nur dann Sinn, wenn die 1 Sek mit genauer Toleranz (z.B. +/- 20 %) festgelegt ist. Es ist praktisch nicht möglich einen Taster genau 1 Sek gedrückt halten ... ;)

MfG

bnitram
13.05.2010, 18:23
@ PICture
Das stimmt auch wieder.


Kennt den jemand einen Beispielcode in Basic oder C ??
( falls es euch hilft, ich habe den Pro-Bot128 )

bnitram
14.05.2010, 11:41
Also Ich wollte es irgendwie so machen:

....
If sw2 = 1 for AbsDelay(1000) Then
FLL_ON()
End If
.....

Aber das geht mal garnich!!!!
Hat einer ne bessere Idee?????

nflatjor555
16.05.2010, 00:20
Erst eine Frage: ist es OK dass wenn die Taste gedrueckt ist, der uC NUR auf Loslassen der Taste wartet (d.h. er kuemmert sich nicht ums Sensoren einlesen, Daten ausgeben etc....)?
Wenn ja, kannst du etwa wie folgt machen (Syntax in deinem Compiler ist wahrscheinlich anders):



bool Taste1sGedrueckt()
{
// Ich nehme an: "0" = Taste gedrueckt

uint ms=0; // 16-bits uint
while (Taste==0) // Taste gedrueckt?
{
delay_ms(1);
ms++;
}

// Hierher kommen wir wenn die Taste losgelassen wird (oder nicht gedrueckt ist)
// Nun checken wir die verlaufene Zeit
if ((ms>=800) && (ms<=1200)) // 1s +/- 20%
return true;
else
return false;
}

bnitram
16.05.2010, 11:08
Danke nflatjor555,
leider programmiere ich in Basic mit einer Libyer!!
(ich habe sie unten mal gepostet)
Vielleicht kannst du ja mal nen Basic Code daraus machen???!!

peterfido
16.05.2010, 11:28
Die SYSTEM_CNT() bietet sich an. Wenn sw2 gedrückt ist, darin eine Variable hochzählen.
Wenn sw2 nicht gedrückt ist, abfragen, ob die Variable zwischen 80 und 120 ist, wenn ja entsprechend reagieren und die Variable auf 0 setzen. Wenn nein nur die Variable auf 0 setzen.

bnitram
16.05.2010, 16:03
Gut,
Hast du auch zufälligerweise einen Beispielcode???
Würde mich freuen wenn!!!

bnitram
27.05.2010, 18:39
Hallo
Weiß denn keiner wie ich das programmieren kann ????
Wie frage ich denn den Befehl ab ( SYSTEM_CNT() )???

If butten() =1 Then
SYSTEM_CNT()
End If
If SYSTEM_CNT() = 1000 Then
FLL_ON()
End If

Das Funktioniert nicht!!
Wie muss ich das richtig machen???

PS:
Die Libyer habe ich ja oben schon gepostet falls euch das hilft!!

dolivo
28.05.2010, 09:17
ginge es nicht mit einer while...wend Schleife. Das Ergebnis wird dann ausgewertet?

bnitram
28.05.2010, 14:44
Ne das geht auch nicht!!
Hauptsächlich geht es um dieses hier:

"If SYSTEM_CNT() = 1000 Then"
Dann kommt immer folgender Fehler:

Semantik Fehler - Operator "="für Typ undefiniert nicht erlaubt

Jetzt weiß ich nicht wie ich es machen soll!!?? :-k :-k

PS:
Es muss nicht mit SYSTEM_CNT() Befehl sein!!
Es kann auch anders gemacht werden!!

peterfido
28.05.2010, 16:49
System_cnt ist kein Befehl sondern eine SUB (Unterroutine), welche laut Beschreibung alle 10ms aufgerufen wird.
Diese könnte um die Funktion erweitert werden.
Wenn der Button gesetzt ist, wird eine Variable hochgezählt, wenn der Button nicht gesetzt ist, wird die Variable auf Wertigkeit zwischen 90 und 110 verglichen und wenn wahr dann die gewünschte Aktion ausführen und in beiden Fällen die Variable auf 0 zurücksetzen.

Genau vorgeben kann ich es nicht, da mir die nötige Umgebung zum Testen fehlt weil ich die Tasterabfrage etwas ungewöhnlich finde...

bnitram
28.05.2010, 18:01
Danke peterfido,
wenn jemand einen Beispiel code hat, dann bitte posten!!!
:D