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
Das Stichwörter nach denen du suchen solltest sind: "Tasten Entprellen" mfg Patrick
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
Nabend, schieb den Renner mal langsam durch die Lichtschranke und justiere sie dabei MfG
Ups, zu früh an der Kordel gezogen... Stichwort heißt Konturenkontrolle. MfG
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.
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
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
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
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.
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.