taster kurzzeitig Abschalten

Gast #2127131
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
Gast #2127142
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
Gast #2127211
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren