Hallo Freunde, ich bin am Verzweifeln, ich komme einfach nicht weiter. Ich habe vor mit einem Taster in div. Programme zu springen und dann dort auch zu bleiben so lange ich den Taster nicht erneut drücke... habt ihr eine Ahnung wie ich das am besten mache?! 0.o ich war so vorgegangen... $regfile = "2313def.dat" Config Portb = Output Config Portd = Output Config Portb.3 = Input Config Portb.2 = Input Portb.2 = 1 Portb.3 = 1 Config Timer1 = Timer , Prescale = 8 Enable Timer1 On Timer1 Ein Enable Interrupts Do if Pinb.3=0 then goto Puls Puls: Portd.4=1 waitms 100 Pord.4=0 waitms 100 loop end Ein: Toggle Portd.6 Return 'PB4= Magnetventil 'PB3= Taster_Dauer 'PB2=Taster_Puls 'LED1= PD6 'LED2= PD5 'LED3= PD4 'LED4= PD3 'LED5= PD2 'LED6= PD1 'LED7= PD0
Guck mal nach Zustandsautomat bzw. state machine
sicherlich nicht perfekt aber probier mal das $regfile = "2313def.dat" $crystal = 8000000 'Config Portb = Output ??????????? Config Portd = Output Config Pinb.3 = Input 'geändert Config Pinb.2 = Input 'geändert Portb.2 = 1 Portb.3 = 1 Config Debounce = 30 Config Timer1 = Timer , Prescale = 8 Enable Timer1 'On Timer1 Ein '?????????? Enable Interrupts Do Debounce Pinb.2 , 0 , Puls , Sub Debounce Pinb.3 , 0 , Woauchimmerhin , Sub Loop Puls: Do Portd.4 = 1 waitms 100 Portd.4=0 waitms 100 Loop Until Pinb.2 = 0 Return Woauchimmerhin: Do 'was es hier auch zu tun gibt Loop Until Pinb.3 = 0 return 'PB4= Magnetventil 'PB3= Taster_Dauer 'PB2=Taster_Puls 'LED1= PD6 'LED2= PD5 'LED3= PD4 'LED4= PD3 'LED5= PD2 'LED6= PD1 'LED7= PD0
1 | $regfile = "2313def.dat" |
2 | |
3 | Config Portb = Output |
4 | Config Portd = Output |
5 | Config Portb.3 = Input |
6 | Config Portb.2 = Input |
7 | |
8 | Portb.2 = 1 |
9 | Portb.3 = 1 |
10 | |
11 | schalter = 0 ' aus |
12 | |
13 | Config Timer1 = Timer , Prescale = 8 |
14 | Enable Timer1 |
15 | On Timer1 Ein |
16 | Enable Interrupts |
17 | |
18 | Do |
19 | ' Eingabe regelmäßig prüfen |
20 | ' OHNE Entprellung! |
21 | ' kann mit DEBOUNCE (s. BASCOM Manual AVR) drastisch verbessert werden |
22 | if Pinb.3=0 then |
23 | if schalter=0 then |
24 | schalter=1 ' ein |
25 | endif |
26 | else |
27 | if schalter=1 then |
28 | schalter=0 ' aus |
29 | endif |
30 | end if |
31 | |
32 | ' Schalterstellung auswerten und agieren |
33 | if schalter=1 then |
34 | gosub Puls |
35 | end if |
36 | loop |
37 | end |
38 | |
39 | ' Aktionscode |
40 | Puls: |
41 | Portd.4=1 |
42 | waitms 100 |
43 | Portd.4=0 |
44 | waitms 100 |
45 | return |
46 | |
47 | ' Interrupt Service Routine für Timer1 |
48 | Ein: |
49 | Toggle Portd.6 |
50 | Return |
was meinst du mit Schalter ? soll das eine Variable sein?
Ich probiers mal in Pseudo-Bascom: Main: do if taste1=0 then gosub taste1 <- evtl. Platz für entprellen end if Taster gegen Masse, Pin als Eingang und Pull-Up ein if taste2=0 then gosub taste2 end if loop ----- taste1: do {mache irgendwas} loop until taste1=0 return taste2: do {mache irgendwas} loop until taste2=0 return Problem ist, dass wenn die "Taste" zu lange gedrückt wird, gleich wieder aus dem Unterprogramm gesprungen wird. Also evtl vor dem gosub ein waitms xxx einfügen Mirko
dann eben so $regfile = "2313def.dat" $crystal = 8000000 'Config Portb = Output ??????????? Config Portd = Output Config Pinb.3 = Input 'geändert Config Pinb.2 = Input 'geändert Portb.2 = 1 Portb.3 = 1 Config Debounce = 30 Config Timer1 = Timer , Prescale = 8 Enable Timer1 'On Timer1 Ein '?????????? Enable Interrupts main: Do Debounce Pinb.2 , 0 , Puls , Sub Debounce Pinb.3 , 0 , Woauchimmerhin , Sub Loop Puls: Do Portd.4 = 1 waitms 100 Portd.4=0 waitms 100 Debounce Pinb.2 , 0 , main , Sub Loop Return Woauchimmerhin: Do 'was es hier auch zu tun gibt Loop Until Pinb.3 = 0 return 'PB4= Magnetventil 'PB3= Taster_Dauer 'PB2=Taster_Puls 'LED1= PD6 'LED2= PD5 'LED3= PD4 'LED4= PD3 'LED5= PD2 'LED6= PD1 'LED7= PD0
Neben der Entprellung des Tasters brauchst Du noch die Flankenerkennung. Also das Erkennen, dass der Taster losgelassen und erneut betätigt wurde. Dies erreicht man durch zyklische Abfrage des Tastenports und Speichern des Zustandes, um durch Vergleich des alten und neuen Zustandes Änderungen zu erkennen. Bei jeder damit erkannten Betätigungsflanke zählst Du eine Zustandsvariable hoch, anhand deren Wert Du zur entsprechenden Aktion verzweigst. Die Aktionen musst Du so organisieren, dass die Tastenabfrage nicht vernachlässigt wird, da bietet sich Statemachine und Multitasking an. Also statt mit Schleifen mit Zuständen arbeiten. ...
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.