@Lambiek:
Inderdaad, analoog zou beter zijn geweest, of zeker makkelijker afstellen.

@Lucky Luke: Met deze gedachgte heb ik ook rondgelopen.
Daar ze niet in spiegelbeeld staan, zit aan 1 zijde de zender dichter bij de ontvanger van de andere, en omgekeerd.
Toen ik ze op tafel had liggen (van elkaar af wijzend) werkte het perfect.
Ik ha toch eens proberen om ze iets van elkaar af te wijzen, nu staan ze precies parallel.

@Loopycoaster:
Om 2 redenen is dit onmogelijk, ten eerste hebben ze een vaste montage die niet naar voor of achter te verstellen is, en de tweedde reden is, dat het verschil veel te groot is, het gaat helaas niet om een paar cm.
Hieronder een foto van de ingebouwde sensor.
http://www.uploadarchief.net/files/download/afb0158det.jpg

Ik ga in ieder geval eens proberen die sensors een paar graden naar buiten te draaien.

in afwachting tot verder testwerk ben ik thuis begonnen met pic to pic communicatie, wat ik straks wil gaan gebruiken i.p.v. die IR afstandbediening.

Het verzenden van data (nog via een draadje) lukt prima, maar toch een probleem waar ik niet uit kom.

Waarom gaat er in onderstaande code die ledjes op portD.2 en portD.3 niet branden?
Wat heb ik hier fout gedaan, of over het hoofd gezien?

DEVICE 16F877A
CONFIG hs_osc, wdt_off, pwrte_on, BODEN_Off, LVP_OFF
DECLARE XTAL = 20

ALL_DIGITAL true


DECLARE HSERIAL_BAUD = 9600 ' Set baud rate to 9600
DECLARE HSERIAL_RCSTA = %10010000 ' Enable continuous receive
DECLARE HSERIAL_TXSTA = %00100000 ' Enable transmit and asynchronous mode
DECLARE HSERIAL_CLEAR = ON ' Clear the buffer before receiving

DIM Var1 AS BYTE
DIM opdracht AS BYTE
DELAYMS 500

PORTA = %00111111 
PORTB = %00000000
PORTC = %00000000 
PORTD = %00000000
PORTE = %00000001
TRISA = %11111111
TRISB = %00000000
TRISC = %11000000 
TRISD = %00000000
TRISE = %00000001 
SYMBOL hoog = 1
SYMBOL laag = 0
 DELAYMS 500
 CLS
 CLEAR Var1
Loop:


HSERIN [Var1] ' Receive a byte serially into Var1

PRINT DEC Var1,AT 1,1, " " ' Display the byte received
DELAYMS 100
CLEAR Var1
GOTO Loop ' Loop forever

SELECT Var1
CASE 33
PORTD.2 = hoog

CASE 45 
PORTD.3 = hoog
ENDSELECT

END

Hoewel er zeker data binnen komt op het display blijven die 2 poorten laag.

"Need input"

Die arme PIC komt daar helemaal niet aan toe, die loopt maar rondjes in die loop te loopen... En wel forever...

(Je goto loop staat te hoog, haal het daar weg en zet het vlak voor de "end")

Ik ben al de hele middag aan he goochelen en schuiven van die loops, maar niks helpt.

HSERIN [Var1] ' Receive a byte serially into Var1

PRINT DEC Var1,AT 1,1, " " ' Display the byte received

Dit is afgeleid uit de handleiding van Proton.
hoe laat ik nu 'iets' doen met die "var1" ?

Loop het eens regel voor regel door, vanaf het label "loop:" tot het punt waar 'ie weer naar dat label moet springen ("goto loop"), en ga dan weer terug naar dat label.

Zo kom je toch nooit aan je "select...endselect" toe?

Hij doet gewoon wat je 'm zegt te doen hoor, je hebt 'm alleen iets anders vertelt dan dat je zou willen >:) Dat ding springt wel als je dat zegt...

Je code is zover ik kan zien ook goed (De print dec var1, at 1,1, " " zou ik eerder print at 1,1, dec var1," " van gemaakt hebben, maar aangezien je zegt dat er data op het scherm komt neem ik aan dat het compiled en runt).

Hoe je iets met die var doet? Nou iderdaad:
Select var1
case <waarde>
doe iets
case <andere waarde>
doe wat anders
case else
doe iets wat bij elke andere waarde moet
endselect.

Is gewoon goed. Het wordt alleen niet uitgevoerd omdat er een goto loop boven staat...

If-then zou ook kunnen, maar wordt net zomin uitgevoerd, omdat er al eerder teruggesprongen wordt.

Dat ding begint bovenaan en voert het regeltje voor regeltje uit, en als 'ie terug moet springen doet 'ie dat ook. Dat 'ie aan die paar regels onderaan niet toekomt kan 'm niets schelen. Dat jij vervolgens achter je PC zit te zoeken en te mopperen ook niet :P Het is een microcontroller. Die doen altijd precies wat je zegt. Maar soms niet altijd wat je wilt.

ik heb ook al geprobeerd om het hele zaakje in 1 lus te zetten, zowel met while/wend als met gosubs in 2 lussen
alles in 1 lus zou toch ook moeten werken, al is het verre van een mooie oplossing, toch?

If-then zou ook kunnen, maar wordt net zomin uitgevoerd, omdat er al eerder teruggesprongen wordt

Ook al geprobeerd.
Jammer dat een pic niet kan reageren op mijn gemopper :(

O.K, derde poging het kwartje over de rand te duwen :) :

Zoek de verschillen: (En ook in de werking)


DEVICE 16F877A
CONFIG hs_osc, wdt_off, pwrte_on, BODEN_Off, LVP_OFF
DECLARE XTAL = 20
 
ALL_DIGITAL true
 
 
DECLARE HSERIAL_BAUD = 9600 ' Set baud rate to 9600
DECLARE HSERIAL_RCSTA = %10010000 ' Enable continuous receive
DECLARE HSERIAL_TXSTA = %00100000 ' Enable transmit and asynchronous mode
DECLARE HSERIAL_CLEAR = ON ' Clear the buffer before receiving
 
DIM Var1 AS BYTE
DIM opdracht AS BYTE
DELAYMS 500
 
PORTA = %00111111 
PORTB = %00000000
PORTC = %00000000 
PORTD = %00000000
PORTE = %00000001
TRISA = %11111111
TRISB = %00000000
TRISC = %11000000 
TRISD = %00000000
TRISE = %00000001 
SYMBOL hoog = 1
SYMBOL laag = 0
 DELAYMS 500
 CLS
 CLEAR Var1
Loop:
 

HSERIN [Var1] ' Receive a byte serially into Var1
 
PRINT DEC Var1,AT 1,1, " " ' Display the byte received
DELAYMS 100
CLEAR Var1

 
SELECT Var1
CASE 33
PORTD.2 = hoog
 
CASE 45 
PORTD.3 = hoog
ENDSELECT
 
GOTO Loop ' Loop forever
END

2 loops kunnen niet simultaan draaien, het een een processor die de boel sequentieel afloopt, geen hardwarebeschrijving. Het is software. 1 ding tegelijk.

Het werkt!! :):)
Het is als bij een vliegtuigcrash, een probleem is meestal een combinatie van meerdere factoren.
Hoewel ik jouw aanpassing ook al geprobeerd had, zonde sucses, heb ik iets heel doms gevonden (er vielen meerdere euro's tegelijk)
De buffer werdt namelijk gewist, vóórdat de case instruktie erbij kon.
Jou aanpassing met wijziging:

SYMBOL hoog = 1
SYMBOL laag = 0
DELAYMS 500
CLS
CLEAR Var1
Loop:

HSERIN [Var1] ' Receive a byte serially into Var1

PRINT DEC Var1,AT 1,1, " " ' Display the byte received
DELAYMS 100
;CLEAR Var1 ; HIER ZAT HET PROBLEEM!! buffer werdt gewist

SELECT Var1
CASE 33
PORTD.2 = hoog

CASE 45
PORTD.3 = hoog
ENDSELECT

GOTO Loop ' Loop forever
END

Wederom bedankt voor de les ("Input")

Ah leuk, en daar keek ik dus weer straal overheen...

Wie keek er het meest overheen? :p

Ben een beetje aan die code aan het sleutelen geweest, om deze straks in de Johnny code te integreren.

En hoewel het afgeraden word, om (te)veel goto's te gebruiken, kom ik er toch niet onderuit.
Tenzij er een andere (lees: betere) manier is.

SYMBOL hoog = 1
SYMBOL laag = 0
 DELAYMS 500
 CLS
 
vooruit:                                         ;Dit zou straks de subroutine moeten vervangen
            PORTD.2 = hoog
        GOTO Loop
        
achteruit:                                       ;idem
            PORTD.3 = hoog
        GOTO Loop
        
rechts:                                          ;idem

stoppen:                                         ;maakt alle poorten weer laag
            PORTD = %00000000 
        GOTO Loop            
 
;***********************************************  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
                                                
uitvoeren:

    SELECT Var1
        CASE 33
        GOTO vooruit
            
        CASE 45 
        GOTO achteruit
            
        CASE 55
        GOTO stoppen 
    
    ENDSELECT
 GOTO Loop
 
END

Je kunt misschien gosub en return kunnen proberen(cursus 6)


Symbol Hoog = 1
Symbol Laag = 0
DelayMS 500
Cls
 
;Subroutine's
Vooruit:                                         ;Dit zou straks de subroutine moeten vervangen
    PORTD.2 = Hoog
Return
 
Achteruit:                                       ;idem
    PORTD.3 = Hoog
Return
 
Rechts:                                          ;idem

Return
 
Stoppen:                                         ;maakt alle poorten weer laag
    PORTD = %00000000 
Return

Uitvoeren:

    Select Var1
        Case 33
        GoSub Vooruit
 
        Case 45 
        GoSub Achteruit
 
        Case 55
        GoSub stoppen 
 
    EndSelect
Return       

;................................................................................... 
;Hoofdprogramma                                     ;in de Johnny code vervangen     
While 1 = 1                                           
    HSerIn 20,Uitvoeren, [Var1]                     ' Receive a byte serially into Var1
    ;PRINT DEC Var1,AT 1,1, " "                     ; dit komt te vervallen
    ;DELAYMS 100                                    ; dit ook 
    GoSub Uitvoeren
Wend   
 
End

[Bericht gewijzigd door r3dnax op (21%)]

Dezelfde code heb ik al geprobeerd maar werkt niet.
Hij gaat namelijk naar dezelfde case,en weer terug, waardoor de led blijft knipperen
Hij moet namelijk niet 'return' gaan, maar naar de loop, en vandaaruit weer wachten op de volgende ontvangen instruktie.

Welke 'led' bedoel je Karel? Heb je op alle bits van PORTD een led hangen? Dat zou betekenen dat er dus ongewenst een sprong naar 'stoppen' tussendoor komt.

Mogen er in PICBASIC geneste gosubs gebruikt worden? Zo ja, dan zou dat weldegelijk moeten werken en de voorkeur hebben boven heen en weer springen met goto's.

Als er na een return niet juist in een case-statement wordt teruggesprongen, dan zou ik de makers van PICBASIC eens even aanschrijven, dan is het een bug in de compiler. Kun je de exacte code met GoSubs posten Karel, die het beschreven gedrag vertoont?

In het voorbeeld van r3dnax zit overigens nog een foutje: de Return tussen Rechts: en Stoppen: hoort daar niet (fallthrough).

[Bericht gewijzigd door Jochem op (64%)]

Op de site van picbasic stond een stukje voor een am zender/ontvanger. Hiervan heb ik de structuur ongeveer van over genomen. De subroutine's horen eigenlijk in het gedeelte met select. En na de instructie wordt Var1 weer leeg gemaakt(geen waarde => geen opdracht).

;Variabelen declareren
Dim Var1        As Byte   ;Bevat steeds de laatste via de AM-ontvanger ontvangen opdracht

Symbol Hoog = 1
Symbol Laag = 0
DelayMS 500
Cls

;Hoofdprogramma
While 1 = 1
  HSerIn 20,Uitvoeren, [Var1]                       ;Receive a byte serially into Var1
  
  Select Var1
    Case 33                  
        GoSub Vooruit                              
    Case 45                   
        GoSub Achteruit                             
    Case 55
        GoSub Stoppen                               
  EndSelect
Wend

;Subroutine's
Vooruit:                                            ;Hier staan instructies voor vooruit                            
    PORTD.2 = Hoog
    Clear Var1
Return
 
Achteruit:                                          ;Hier staan instructies voor vooruit                                      
    PORTD.3 = Hoog
    Clear Var1
Return
 
Rechts:                                             ;Hier staan instructies voor vooruit                                          
    Clear Var1
Return
 
Stoppen:                                            ;Hier staan instructies voor vooruit                                        
    PORTD = %00000000                               ;Maakt alle poorten weer laag
    Clear Var1                                          
Return

End

EDIT:

Op 8 augustus 2011 12:48:23 schreef Jochem:
Mogen er in PICBASIC geneste gosubs gebruikt worden? Zo ja, dan zou dat weldegelijk moeten werken en de voorkeur hebben boven heen en weer springen met goto's.

Nesten
Ook een GOSUB mag je nesten.
Met nesten van GOSUB's wordt bedoeld dat in een subroutine ook weer een GOSUB staat die naar een andere subroutine springt.
En ook in die subroutine kan weer een verwijzing naar wéér een andere subroutine staan, enzovoort.
Nesten van GOSUB's kan dus, alleen niet onbeperkt diep (wat bij een lus wel mag).
Hóe diep je mag nesten is afhankelijk van het PIC type.
De PIC moet namelijk al die terugkeeradressen onthouden om zo later weer terug te kunnen keren naar de plaats waar hij vandaan kwam.
Zodra de PIC weer is teruggekeerd, "vergeet" hij dit adres en is die plek weer vrij voor een nieuwe GOSUB.
Spring daarom ook nooit met een GOTO uit een subroutine, maar doe dat altijd met een RETURN.
Als je met een GOTO uit de subroutine springt, dan blijft de PIC het terugkeeradres onthouden terwijl hij al lang niet meer in de subroutine zit, waardoor op een moment het stapelgeheugen volloopt (= stack overflow).

Een 14-bit PIC (wat de PIC16F628A óók is) kan maar 8 adressen onthouden.
Bovendien gebruikt de compiler daarvan al (maximaal) 4 niveaus voor zijn library (= bibliotheek) subroutines, dus ga nooit dieper nesten bij een PIC16F628(A) dan 4 niveaus.
Bij een 16-bit PIC kan tot 28 niveaus diep genest worden.
Als je dieper gaat nesten dan mogelijk is dan "vergeet" de PIC zijn weg terug naar de allereerste GOSUB's.

Bedenk wel dat de beperking alleen voor het nesten geldt.
Je kunt dus gerust tientallen subroutines in een PIC16F628A programmeren.

Ho ho ho, niet een Var1 clear doen als je na de return nog terug komt in je select he!!

Dat brengt me overigens meteen bij het probleem: je valt altijd door naar de case 'onder je', er ontbreken dus 'break' statements bij elke case.

Er is nog een afwijking in het voorbeeld van r3dnax, in Karel z'n code doorloop je namelijk altijd eerst 1 keer de vooruit-routine, zonder dat er nog iets van serieel is gekomen. Dus je moet er nog een GoSub Vooruit helemaal bovenin na de CLS bij zetten (tenzij dat nooit zo bedoeld was...)

[Bericht gewijzigd door Jochem op (12%)]

Op 8 augustus 2011 12:56:51 schreef Jochem:
Dat brengt me overigens meteen bij het probleem: je valt altijd door naar de case 'onder je', de ontbreken dus 'break' statements bij elke case.

Het is een select routine. Als de case eronder de waarde niet heeft, moet daar toch over heen gesprongen worden?

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