Forum: Mikrocontroller und Digitale Elektronik BASCOM Problem In Unterprogramme springe und dort bleiben?


von Janiiix3 (Gast)


Lesenswert?

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

von ... (Gast)


Lesenswert?

Guck mal nach Zustandsautomat bzw. state machine

von smufte (Gast)


Lesenswert?

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

von Krapao (Gast)


Lesenswert?

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

von Janiiix3 (Gast)


Lesenswert?

was meinst du mit Schalter ? soll das eine Variable sein?

von Mirko B. (mirkob)


Lesenswert?

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

von smufte (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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
Noch kein Account? Hier anmelden.