Forum: Mikrocontroller und Digitale Elektronik taster kurzzeitig Abschalten


von Thomas (Gast)


Lesenswert?

Hallo liebes Forum,

ich bin relativ neu in der uC Welt und habe für meine Kinder einen 
Rundenzähler für eine Carrera Rennbahn gebaut. Grundsätzlich 
funktioniert alles, nur habe ich das Problem, dass ich manchmal 2 
Impulse bekomme, wenn ein Auto durchfährt.
Nun hätte ich die Idee gehabt, den Eingang für z.b. 1 Sekunde zu sperren 
nachdem es einen Impuls ausgelöst hat, ohne dabei das Programm 
anzuhalten, weil ich die 7-Segmentanzeige multiplexe.

Könnt ihr mir bitte bei meiner Variante helfen, oder mich auf eine 
andere Lösung bringen.

Danke im voraus

von Patrick (Gast)


Lesenswert?

Das Stichwörter nach denen du suchen solltest sind: "Tasten Entprellen"

mfg
Patrick

von Thomas (Gast)


Lesenswert?

Nein die Taster sind entprellt. Ich arbeite mit Bascom und verwende den 
befehl debounce.
Nei ich bekomme tatsächlich ab und zu mehrere Signale. Als 
lichtschranken verwende ich eine CNY70, der eigentlich recht gut 
funktioniert, jedoch leider mit dem oben genannten Problem.
Danke trotzdem für die rasche Antwort, hätte ich auch gleich am Anfang 
schreiben können - tschuldigung

von Sauger (Gast)


Lesenswert?

Nabend,

schieb den Renner mal langsam durch die Lichtschranke und justiere sie 
dabei

MfG

von Sauger (Gast)


Lesenswert?

Ups, zu früh an der Kordel gezogen...

Stichwort heißt Konturenkontrolle.

MfG

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

wenn ich die Autos langsam durchschiebe, bekomme ich überhaupt noch mehr 
Signal. Ich hänge einmal den Schaltplan der Platine für den 
Lichtschranken an.

von Peter D. (peda)


Lesenswert?

Thomas schrieb:
> ohne dabei das Programm
> anzuhalten, weil ich die 7-Segmentanzeige multiplexe.

Das Multiplexen macht doch der Timerinterrupt, damit Du immer eine 
konstante Leuchtdauer erreichst.


Peter

von Sauger (Gast)


Lesenswert?

Nabend,

Bau das ganze 2x auf. Die 1. Lichtschranke erkennt den Eintritt (zählt 
an), die 2. den Austritt (zählt hoch) des Renners. Beide Lichtschranken 
müssen so positioniert sein das sie nicht gemeinsam betätigt werden 
können (Wagenlänge). Ergibt eine saubere Zählflanke.

MfG

von Thomas (Gast)


Lesenswert?

Bei mir nicht. Ich habe ja geschrieben, das ich noch sehr neu bin. Ich 
stelle auch einmal mein Programm zum durchsehen in diesen Threat:

$regfile = "m8def.dat"
$crystal = 8000000


Dim N As Byte                           'Zähler für for next schleife
Dim E(10) As Byte                       'Einer
Dim Z(10) As Byte                       'Zehner
Dim Z1z As Byte                         'Zähler Zehner Bahn1
Dim E1z As Byte                         'Zähler Einer Bahn 1
Dim Z2z As Byte                         'Zähler Zehner Bahn2
Dim E2z As Byte                         'Zähler Einer Bahn 2
Dim Runden1 As Byte                     'Rundenanzeige Bahn1
Dim Runden2 As Byte                     'Rundenanzeige Bahn2

Config Debounce = 10
Config Portd = Output                          'Datenport
Config Portc = Output                          'Multiplexport
Config Portb = Input                           'Input mit Taster 0

Portc.0 = 1
Portc.1 = 1
Portc.2 = 1
Portc.3 = 1


Runden1 = 0
Runden2 = 0


Restore Werte
For N = 1 To 10
Read E(n)
Next

Restore Werte
For N = 1 To 10
Read Z(n)
Next

Z1z = 1
E1z = 1
Z2z = 1
E2z = 1

Tastenabfrage:
Debounce Pinb.0 , 0 , Plus1 , Sub
Debounce Pinb.1 , 0 , Plus2 , Sub
Debounce Pinb.2 , 0 , Ab


Z1z = Runden1 / 10
Z1z = Z1z + 1
E1z = Runden1 Mod 10
E1z = E1z + 1

Z2z = Runden2 / 10
Z2z = Z2z + 1
E2z = Runden2 Mod 10
E2z = E2z + 1


Gosub Anzeige

If Runden1 = 100 Then Gosub Ruckstell1
If Runden2 = 100 Then Gosub Ruckstell2


Goto Tastenabfrage

Anzeige:
Portc.0 = 0
Portd = Z(z1z)
Gosub Warteschleife
Portc.0 = 1
nop
nop
Portc.1 = 0
Portd = E(e1z)
Gosub Warteschleife
Portc.1 = 1
nop
nop
Portc.2 = 0
Portd = Z(z2z)
Gosub Warteschleife
Portc.2 = 1
nop
nop
Portc.3 = 0
Portd = E(e2z)
Gosub Warteschleife
Portc.3 = 1
Return

Plus1:
Runden1 = Runden1 + 1
Return

Plus2:
Runden2 = Runden2 + 1
Return

Ruckstell1:
Z1z = 1
E1z = 1
Runden1 = 0
Return

Ruckstell2:
Z2z = 1
E2z = 1
Runden2 = 0
Return

Warteschleife:
Waitms 1
Return

Ab:

Runden1 = 50
Runden2 = 50

Taste2:
Debounce Pinb.0 , 0 , Minus1 , Sub
Debounce Pinb.1 , 0 , Minus2 , Sub

Z1z = Runden1 / 10
Z1z = Z1z + 1
E1z = Runden1 Mod 10
E1z = E1z + 1

Z2z = Runden2 / 10
Z2z = Z2z + 1
E2z = Runden2 Mod 10
E2z = E2z + 1

Gosub Anzeige

If Runden1 = 0 Then Gosub Finish1
If Runden2 = 0 Then Gosub Finish2

Goto Taste2


Finish1:
Portc.0 = 0
Portc.1 = 0
Portd = Z(z1z)
Portd = E(e1z)
Waitms 100
Portc.0 = 1
Portc.1 = 1
Waitms 100
Goto Finish1


Finish2:
Portc.2 = 0
Portc.3 = 0
Portd = Z(z2z)
Portd = E(e2z)
Waitms 100
Portc.2 = 1
Portc.3 = 1
Waitms 100
Goto Finish2

Minus1:
Runden1 = Runden1 - 1
Return

Minus2:
Runden2 = Runden2 - 1
Return

End

Werte:

'       0      1     2      3      4      5      6      7
Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78
'       8      9
Data &H00 , &H10

von Thomas (Gast)


Lesenswert?

Habt ihr bitte nicht doch noch einige Tips, oder Ideen.....

von ... (Gast)


Lesenswert?

Du könntest Dir z.B. die Zeit des ersten Impulses merkern und wenn der 
nächste zu schnell kommt, diesen einfach ignorieren. Kann man auch über 
ein Flag und einen Timer lösen.
Also im Endeffekt nochmal ein Debounce mit größerem Delay außendrum.

von Sepp (Gast)


Lesenswert?

Einen Timer mit dem ersten impuls starten, den Timerwert in ein Register 
schreiben und dann mit einer if .. then .. Abfrage vergleichen. Wenn der 
zweite impuls der selben Bahn in einer gewissen Zeit kommt, dann 
ignorieren. Das müsste funktionieren...

von Harald Wilhelms (Gast)


Lesenswert?

Thomas schrieb:
> Nein die Taster sind entprellt.

Nun, wenn Du Deine Tastenentprellung so langsam machst, das die Zeit
länger als die Zeit zwischen zwei Pulsen ist, müsste es funktionieren.
Gruss
Harald

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.