@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.
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
ENDHoewel er zeker data binnen komt op het display blijven die 2 poorten laag.
"Need input"
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
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 receivedDit is afgeleid uit de handleiding van Proton.
hoe laat ik nu 'iets' doen met die "var1" ?
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
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
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 
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
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 gewistSELECT Var1
CASE 33
PORTD.2 = hoogCASE 45
PORTD.3 = hoog
ENDSELECTGOTO Loop ' Loop forever
END
Wederom bedankt voor de les ("Input")
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Wie keek er het meest overheen? 
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
ENDr3dnax
Nieuwe website: http://members.home.nl/xanderhuisman/Sites/Xander/home.html
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.
Jochem
If you want to succeed, double your failure rate.
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%)]
r3dnax
Nieuwe website: http://members.home.nl/xanderhuisman/Sites/Xander/home.html
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
EndEDIT:
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.
Jochem
If you want to succeed, double your failure rate.
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%)]
r3dnax
Nieuwe website: http://members.home.nl/xanderhuisman/Sites/Xander/home.html
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?
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.