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...

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.

@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

END

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.

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 :p

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.
http://www.uploadarchief.net/files/download/2011-08-10j6.jpg