Jochem
If you want to succeed, double your failure rate.
Ik kne PICBASIC niet, maar in alle andere talen die ik ken, doet een switch-case statement alles onder de van-toepassing zijnde case, INCLUSIEF alle cases voor andere waarden. Tenzij hij een break tegenkomt.
Heb nu even niet de tijd om een PICBASIC manual te gaan downloaden...
r3dnax
Nieuwe website: http://members.home.nl/xanderhuisman/Sites/Xander/home.html
Een stukje uit een voorbeeld code uit de cursus
SELECT Weerstand ;We gaan de variabele 'Weerstand' testen
CASE 4 ;Als 'Weerstand' is 4 dan...
PRINT "Vier" ;..."Vier" op het display zetten
CASE 5 ;Als 'Weerstand' is 5 dan...
PRINT "Vijf" ;..."Vijf" op het display zetten
CASE 6 ;Als 'Weerstand' is 6 dan...
PRINT "Zes" ;..."Zes" op het display zetten
CASE ELSE ;Anders...
PRINT "Andere waarde" ;..."Andere waarde" op het display zetten
ENDSELECT EDIT:
Achter elke CASE (= in het geval) worden nu steeds vergelijkingen uitgevoerd.
CASE 4 betekent dus, in het geval dat de opgegeven variabele 'Weerstand' gelijk is aan 4 dan de daarop volgende instructie(s) uitvoeren, in het voorbeeld dus PRINT "Vier".
Het is duidelijk dat de instructie(s) onder CASE 5 worden uitgevoerd als de variabele 'Weerstand' de waarde 5 heeft en voor CASE 6 als die waarde 6 is.
[Bericht gewijzigd door r3dnax op (36%)]
Het werkt nu met de code van r3dnax met een kleine correctie.
HSerIn 20,Uitvoeren, [Var1] ;Receive a byte serially into Var1
; Hier de subroutine uitvoeren: bijgezet
Select Var1
Case 33
GoSub Vooruit
Case 45
GoSub Achteruit
Case 55
GoSub Stoppen
EndSelect
Wend
@Jochem
Inderdaad, die 'BEAK' had er ook tussen gekund, om uit die 'uitvoeren'routine te komen.
Wat er nu gebeurde: met return keerde hij terug naar uitvoeren, en kwam toch weer de laatst ontvangen case tegen, om zo in een circel te lopen.
Jochem
If you want to succeed, double your failure rate.
@rednax: Je hebt gelijk, een SELECT-CASE in (pic)basic is kennelijk iets anders dan een switch-case in andere talen. Je hebt hier dus ook geen mogelijkheid voor fall-through.
Ben ik toch benieuwd naar de exacte code van Karel die niet werkte. Moet een foutje in zitten, aangezien geneste gosubs uitdrukkelijk WEL ondersteund worden.
edit (karel had intussen gepost):
Op 8 augustus 2011 13:17:26 schreef Kareltje:
@Jochem
Inderdaad, die 'BEAK' had er ook tussen gekund, om uit die 'uitvoeren'routine te komen.
Ik weet niet waar je die nu precies had willen gebruiken, maar een break is BEHALVE in switch-case statements gewoon verder een vreselijk ding (net als een goto trouwens). Nooit de goede manier om uit een loop of een for te springen.
Wat er nu gebeurde: met return keerde hij terug naar uitvoeren, en kwam toch weer de laatst ontvangen case tegen, om zo in een circel te lopen.
Ja dat begrijp ik dus niet, na de return moet hij exact verdergaan waar hij vandaan kwam.
Na wat terugzetwerk heb ik hier hopelijk dezelfde (niet werkende) code met wat bijgevoegde tekst
Toen ik die return onder de loop routine weg haalde, en de onderste gosub verving door een goto, werkte het ook.
SYMBOL hoog = 1
SYMBOL laag = 0
DELAYMS 500
CLS
GOTO Loop
vooruit: ;Dit zou straks de subroutine moeten vervangen
PORTD.2 = hoog
'clear var1
RETURN
achteruit: ;idem
PORTD.3 = hoog
RETURN
rechts: ;idem
stoppen: ;maakt alle poorten weer laag
PORTD = %00000000
RETURN
;*********************************************** Dit gedeelte moet straks het hoofdprogramma
; in de Johnny code vervangen
Loop:
HSERIN 20,uitvoeren, [Var1] ' Receive a byte serially into Var1
;PRINT DEC Var1,AT 1,1, " " ; dit komt te vervallen
;DELAYMS 100 ; dit ook
RETURN 'deze hoort hier niet te staan
uitvoeren:
SELECT Var1
CASE 33
GOSUB vooruit
CASE 45
GOSUB achteruit
CASE 55
GOSUB stoppen
ENDSELECT
GOSUB Loop 'als ik deze vervang door GOTO loop werkt het ook
ENDJochem
If you want to succeed, double your failure rate.
Op 8 augustus 2011 13:40:16 schreef Kareltje:
Toen ik die return onder de loop routine weg haalde, en de onderste gosub verving door een goto, werkte het ook.
Ja, kijk, DAT is natuurlijk logisch. Anders voert hij die Loop maar 1x uit en eindigt je programma daar.
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
Bij een SELECT CASE routine wordt er altijd maar 1 van de statements gepakt, en wel de eerste die het programma tegenkomt. Degenen die eronder komen (of ze nou true zijn of niet) worden genegeerd.
Dus:
select var1
case < 10
A
case < 20
B
case < 30
C
endselect
Als var1 bijv. 5 is, zal het programma bij '<10' naar binnen duiken, en daarna naar 'endselect' springen. B en C worden genegeerd, terwijl ze wel true zijn.
@Kareltje:
Ik zou even picbasic.nl even goed doorlezen, volgens mij is de functie van GOSUB bij jou nog niet helemaal duidelijk...
.
[Bericht gewijzigd door loopycoaster op (13%)]
Tja, achteraf is de logica best wel te zien, maar ik moet af en toe de juiste richting in gestuurd worden.
Ik ben immers op dit gebied nog steeds een 'gevorderde' Dummy 
Volgende stap nu: analogische signalen proberen te verturen.
edit: @loopycoaster
Deze kende ik al van picbasic.nl
Je zou anders elke keer een > en < op moeten geven.
bijvoorbeeld:
select var1
case < 10
A
case < 20 and > 10
B
case < 30
C
endselect
niet echt handig dus.
[Bericht gewijzigd door Kareltje op (35%)]
Ben weer in de werkplaats aktief geweest.
Die ir-sensor die afgelopen Vrijdag nog slecht werkte is inmiddels overleden.
Hij werdt warm en reageerde steeds slechter, totdat hij continu een laag signaal afgaf.
Gelukkig had ik nog een exemplaar over, die ik gisteren gemonteerd heb.
Door een ongelukje met moeder had ik gisteren geen tijd meer om deze verder uit te testen, maar vandaag heb ik veel kunnen doen.
Ik heb m'n laptop meegenomen en de ultrasoonsensor verder ingesteld.
Hier zaten nog wazigheden in, die nu verholpen zijn.
Ook heeft Johnny weer proefritjes gemaakt, en met de IR-sensoren werkt het nu prima.
Mechanisch moet er nog een kleine aanpassing op, w.b. de bandgeleiding.
Door het sterke draaien wringen de tracks nogal, en willen ze er af lopen.
Door het slippen van de tracks kon ik nog niet echt de ultrasoonsensor verder instellen (bijdraaitijd)
Helaas heb ik nog geen filmpje kunnen maken, maar een foto wil ik jullie niet onthouden.
Welliswaar geen 'fotoopakwaliteit'(nieuwe norm?
)maar toch.