ik ben nog maar pas bezig pet pic's en heb de taal toch al iets onder de knie maar nie wil ik 4 effecten aansturen door 1 drukknop dus bv
1 druk op schakelaar 1 = effect1
2x druk op schakelaar 1 = effect2
3x druk op schakelaar 1 = effect3
4x druk op schakelaar 1 = effect4
ik gebruikt proton ide lite voor het schijven
dus liefst in basic taal uitgelegt

grt skywalker

Ik weet niet of picbasic dezelfde commando's heeft als visual basic maar daar zou ik het zo doen:
Je zult een counter moeten hebben, die van o tot 3 telt.
Ik weet niet hoe je de knoppen uitleest maar ik noem ze maar even knop+ en knop-.

knop+:
counter = counter + 1
if counter => 3 then counter = 0
end sub

knop-:
counter = counter - 1
if counter =< 0 then counter = 3
end sub

Main-programma
if counter = 0 then effect1
if counter = 1 then effect2
if counter = 2 then effect3
if counter = 3 then effect4

hij wil het met een knop dus het vlg. moet al voldoende zijn:

knop:
counter = counter + 1
if counter =>3 then counter = 0
end sub

Main-programma
if counter = 0 then effect1
if counter = 1 then effect2
if counter = 2 then effect3
if counter = 3 then effect4

Ik zou het zo doen:


TrisA %11111111        'porta zijn ingangen
TrisB %00000000        'portb zijn uitgangen
symbol knop=portb.1    'uitgang portb.1 heet 
voortaan "knop"
symbol actie1= porta.0 'alle acties hun eigen poort
symbol actie2= porta.1
symbol actie3= porta.2
symbol actie4= porta.3
dim teller as byte          'variabele "teller" is gemaakt
teller = 0                  'variabele "teller" op nul gezet
Loop:
If knop = 1 then inc teller 'als knop is ingedrukt...
                            'teller met 1 verhogen
   While knop = 1           'om verder te gaan moet knop eerst losgelaten worden
   wend
 if teller = 1 then actie1 = 1 else actie1 = 0
 if teller = 2 then actie2 = 1 else actie2 = 0
 if teller = 3 then actie3 = 1 else actie3 = 0
 if teller = 4 then actie4 = 1 else actie4 = 0
 if teller = 5 then teller = 0 
goto Loop
end

Het kan ongetwijfeld nog simpeler, maar dit is het eerste wat in me opkomt, Sky
De eerste regeltjes als Device, Clock, etc. ken je wel toch?

Even een paar aanpassingen gemaakt.
Leering getrokken: "Probeer nooit wijs te doen als je moe bent" :-P

[Bericht gewijzigd door Fantomaz op ]

Doe het meer zo:


'Op portb.1 is een knop aangesloten, ontendert, met een pulldown weerstand (actief = 1)
Symbol   knop     = PORTB.1   'uitgang portb.1 heet voortaan "knop"
Symbol   timeout  = 1000      'in ms, de timeout tijd geven
Symbol   options  = 4         'Aantal opties, optienummer staat bij aankomst bij actie in "teller"

Input knop

Dim      teller   As Byte     'variabele "teller" is gemaakt
Dim      x        As Word     'Timeout variabele, wanneer tot actie overgaan

teller = 0                    'variabele "teller" op nul gezet

While knop = 0                'Wacht tot de knop ingedrukt wordt   
Wend
For teller = 1 To options
   x = 0  
   While knop = 0             'Wacht tot de knop wordt ingedrukt of dat de timeouttijd verstrijkt 
      If x > timeout Then GoTo actie
      DelayMS 1
   Wend
   DelayMS 10                 'Wacht op de ontdendering
   While knop = 1
   Wend
   DelayMS 10                 'Wacht op ontdendering
Next
GoTo actie  

actie:
   'Actienummer staat in variabele "teller"

Voordelen:
- Je mag langer dan de tijd die een pic nodig heeft voor het doorlopen van een cycle de knop ingedrukt houden
- Kleinere code
- Makkelijk uitbreidbaar

Nadelen:
- Misschien lastiger te begrijpen.

Als je nu de knop ingedrukt hebt, wacht hij een seconde en gaat dan over naar actie. Als je binnen die seconde nog een keer de knop indrukt gaat ie de teller opvoeren en nog een keer een seconde proberen te wachten.


'Op portb.1 is een knop aangesloten, ontendert, met een pulldown weerstand (actief = 1)
Symbol   knop     = PORTB.1   'uitgang portb.1 heet voortaan "knop"
Symbol   timeout  = 1000      'in ms, de timeout tijd geven
Symbol   options  = 4         'Aantal opties, optienummer staat bij aankomst bij actie in "teller"

Input knop

Dim      teller   As Byte     'variabele "teller" is gemaakt
Dim      x        As Byte     'Timeout variabele, wanneer tot actie overgaan

teller = 0                    'variabele "teller" op nul gezet

While knop = 0                'Wacht tot de knop ingedrukt wordt   
Wend
For teller = 1 To options
   x = 0  
   While knop = 0             'Wacht tot de knop wordt ingedrukt of dat de timeouttijd verstrijkt 
      If x > timeout Then GoTo actie
      DelayMS 1
      Wend

Volgens mij moet je hier nog een INC (increase) commando toevoegen anders kom je nooit op de 1000

Maar als ik het goed begrijp blijft de While/wend lus actief zolang hij ingedrukt blijft en tot dit 1 seconde duurt, waarna hij naar "actie" gaat.


   DelayMS 10                 'Wacht op de ontdendering
   While knop = 1
   Wend
   DelayMS 10                 'Wacht op ontdendering

Dit begrijp ik niet. Als je de knop binnen de seconde (1000mS)loslaat, heeft deze While/wend geen zin omdat de lus hier wacht tot je hem loslaat...


Next
GoTo actie 

Als ik dit goed heb, zal deze opzet je 4x de kans geven om een knop binnen een seconde in te drukken om bij "actie" te komen. (Na die seconde kom je daar alsnog) Na die 4 kansen (let wel dat dit retesnel gebeurd) kom je ook bij die "actie"
Dus ik begrijp de opzet niet helemaal meer...



actie:
   'Actienummer staat in variabele "teller"

Voordelen:
- Je mag langer dan de tijd die een pic nodig heeft voor het doorlopen van een cycle de knop ingedrukt houden
- Kleinere code
- Makkelijk uitbreidbaar

Nadelen:
- Misschien lastiger te begrijpen.

Als je nu de knop ingedrukt hebt, wacht hij een seconde en gaat dan over naar actie. Als je binnen die seconde nog een keer de knop indrukt gaat ie de teller opvoeren en nog een keer een seconde proberen te wachten.[/quote]


While knop = 0                'Wacht tot de knop ingedrukt wordt   
Wend
For teller = 1 To options
   x = 0  
   While knop = 0             'Wacht tot de knop wordt ingedrukt of dat de timeouttijd verstrijkt 

Die knop is al ingedrukt dus zal hij hieraan voorbij gaan


      If x > timeout Then GoTo actie
      DelayMS 1
   Wend
   DelayMS 10                 'Wacht op de ontdendering
   While knop = 1
   Wend
   DelayMS 10                 'Wacht op ontdendering
Next
GoTo actie  

Volgens mij ga je rechtstreeks naar het punt waar je de knop weer los moet laten. Doe je dat, kom je bij Actie uit...

nu zit ik met het volgende probleem
ik krijg foutmeldingen als ik het HEX bestand in de pIC wil loaden het heeft altijd gewerkt went ben er gisteren de hele
dag met bezig geweest. ik dacht dat de pic stuks was dus ik stak er een nieuwe in maar niks , hij blijft die foutmelding maar geven ook bij heel simpele dingetjes
http://skywalker0001.myphotoalbum.com/view_photo.php?full=1&set_al…

Op 29 augustus 2005 21:04:30 schreef Fantomaz:


'Op portb.1 is een knop aangesloten, ontendert, met een pulldown weerstand (actief = 1)
Symbol   knop     = PORTB.1   'uitgang portb.1 heet voortaan "knop"
Symbol   timeout  = 1000      'in ms, de timeout tijd geven
Symbol   options  = 4         'Aantal opties, optienummer staat bij aankomst bij actie in "teller"

Input knop

Dim      teller   As Byte     'variabele "teller" is gemaakt
Dim      x        As Byte     'Timeout variabele, wanneer tot actie overgaan

teller = 0                    'variabele "teller" op nul gezet

While knop = 0                'Wacht tot de knop ingedrukt wordt   
Wend
For teller = 1 To options
   x = 0  
   While knop = 0             'Wacht tot de knop wordt ingedrukt of dat de timeouttijd verstrijkt 
      If x > timeout Then GoTo actie
      DelayMS 1
      Wend

Volgens mij moet je hier nog een INC (increase) commando toevoegen anders kom je nooit op de 1000

Gelijk heb je ;)

Maar als ik het goed begrijp blijft de While/wend lus actief zolang hij ingedrukt blijft en tot dit 1 seconde duurt, waarna hij naar "actie" gaat.

Nee, andersom. De while/wend lus blijft actief zolang de knop losgelaten is. Dus dan loopt de timeout timer.


   DelayMS 10                 'Wacht op de ontdendering
   While knop = 1
   Wend
   DelayMS 10                 'Wacht op ontdendering

Dit begrijp ik niet. Als je de knop binnen de seconde (1000mS)loslaat, heeft deze While/wend geen zin omdat de lus hier wacht tot je hem loslaat...

Voor de wat tragere gebruikers onder ons:
Hij begint pas te tellen als de knop weer losgelaten is. Vooral wat oudere mensen help je daarmee. Knop mag dus max 1 sec niet ingedrukt worden.


Next
GoTo actie 

Als ik dit goed heb, zal deze opzet je 4x de kans geven om een knop binnen een seconde in te drukken om bij "actie" te komen. (Na die seconde kom je daar alsnog) Na die 4 kansen (let wel dat dit retesnel gebeurd) kom je ook bij die "actie"
Dus ik begrijp de opzet niet helemaal meer...

Dat is een vangrailtje. Als de timeout overgelopen is, gaat ie zoiezo ook naar actie. Maar als je vaker drukt dan er opties zijn, binnen de timeout periodes, verlaat dit apparaat de for/next lus. En gaat hij dus vrolijk verder in het programma, mocht het subje "actie:" er niet direct achter staan.



actie:
   'Actienummer staat in variabele "teller"

Voordelen:
- Je mag langer dan de tijd die een pic nodig heeft voor het doorlopen van een cycle de knop ingedrukt houden
- Kleinere code
- Makkelijk uitbreidbaar

Nadelen:
- Misschien lastiger te begrijpen.

Als je nu de knop ingedrukt hebt, wacht hij een seconde en gaat dan over naar actie. Als je binnen die seconde nog een keer de knop indrukt gaat ie de teller opvoeren en nog een keer een seconde proberen te wachten.[/quote]
[/quote]

Snappie?

--

Nog een foutje:
x kan maar 255 worden! dus:

dim x as word

Op 29 augustus 2005 23:04:02 schreef skywalker1:
nu zit ik met het volgende probleem
ik krijg foutmeldingen als ik het HEX bestand in de pIC wil loaden het heeft altijd gewerkt went ben er gisteren de hele
dag met bezig geweest. ik dacht dat de pic stuks was dus ik stak er een nieuwe in maar niks , hij blijft die foutmelding maar geven ook bij heel simpele dingetjes
http://skywalker0001.myphotoalbum.com/view_photo.php?full=1&set_al…

Een heel veel voorkomende algemene fout.
Ik weet niet hoe het komt of hoe je er vanaf komt...

ondertussen werk alles terug normaal
geen fouten meer. is raar soms fouten geeft
en als ik de volgende dag de zelfde HEX file her in wil loaden dan geeft de geen enkele error