Verdomme, ik wist dat ik iets vergeten was.
Ik was weereens in een erg vergeetachtige bui, die dag.
Zo dacht ik ook mij aan iedereen op de stand voorgesteld had, niet dus 
Maar geen nood, als ik zover ben, om aan dat project te beginnen, laat ik er wel eentje opsturen.
@ Damic:
Deze week ga ik enkele dingen uitproberen, maar ik verwacht zelf dat de motoren stoppen, wanneer de aansturing naar de H-brug laag word.
Eindelijk weer een update! (na te drukke werkzaamheden)
Na wat softwareproblemen w.b. de motoraansturing, eindelijk weer zover dat er volgende week weer getest kan worden met Johnny6.
De noodstop zit er op, en werkt naar behoren.
Ik heb een klein 5V relais op de 0-toets (afstandbediening) gemonteerd, die de MCLR even 'losgooit' en alles, incl. de H-Brug acuut stopt.
Als alles straks naar behoren werkt ga ik een afatandbediening maken met 2 433Mhz modules en een pic als afstandbediening (Usart)
Met het programma ben ik al aan het experimenteren.
Voor mij is dat uiteraard ook weer een stap verder met picbasic, en waarschijnlijk zal ik wel enige hulp nodig hebben.
Mochten er ideeën zijn w.b. Pic to Pic communicaties, hoor ik het graag.
@Mods: ik weet het... >90 dagen, maar ik wil graag dit topic nog even open houden, bvb dank
Damic
Ben Belg sowat :D :: plaatjes zijn meestal klikbaar
Ik denk wel dat ze je gaan vergeven omdat het nog altijd hetzelfde project is. Zou nogal dom zijn om telkens als er wat tussen komt een nieuw stuk te beginnen. Alle met 11 pagina's mag dat wel eens eignelijk, Johny6 part2
Tja, die loodsopruiming en grabbags hebben dit 'tijdsgat' gecreeërd, en de meesten weten wel dat ik daar ontzettend (te)veel tijd in heb gestoken.
Daarom was ik ook vastbesloten om deze vakantie voor een groot deel aan dit project te besteden.
Hij staat inmiddels al weer op de lift, en is weer van een nieuwe motor voorzien.
[Bericht gewijzigd door Kareltje op (15%)]
Jochem
If you want to succeed, double your failure rate.
Je kent de mijlpaal Karel: volgende Rosmalen-beurs moet hij zelfstandig de trap op kunnen richting CO-stand 
Voor het traplopen zal hij nog wel de nodige hulp moeten hebben.
Vrijdag de IR sensoren uitgetest op de robot.
Ik denk dat ik hier toch nog een drastische wijziging in moet voeren.
Om de beste resultaten te verkrijgen (volgens de datasheet) zouden ze verticaal opgesteld moeten worden, wat bij mij niet het geval is.
Het probleem is nu, dat hij links veel eerder detecteerd als rechts, en als er iets van precies het midden komt, of zelfs een beetje rechts, dat hij toch door links eerder gedetecteerd word.
Iemand ervaring met dit soort sensoren?
Zouden ze onderling ook nog te 'dimmen' zijn, d.m.v. een instelpot, om ze beter symetrisch af te stellen?
Het is achteraf natuurlijk, maar misschien had je beter een analoog type kunnen nemen. Dan kan je nog iets met de afstand en met het schakelpunt doen, in de software wel te verstaan.
Hier kan je weinig aan veranderen vrees ik.
Lucky Luke
Eluke.nl | handgetypt | I'm a poor, lonesome cowboy, with a long, long way to go.
Ik vraag me af of ze nog last van elkaar zouden hebben, dat ze elkaars IR licht (of een reflectie daarvan) zien.
loopycoaster
Mijn youtube profiel: http://www.youtube.com/user/PicBasicMaster
Ik denk dat de enige oplossing dan zou zijn, is dat je de rechter sensor iets meer naar voren monteert, zodat deze weer eerder reageert. Deze afstand kun je dus bepalen door het gewoon uit te proberen, of je meet per sensor bij welke afstand hij reageert (de linker zal dus een grotere afstand hebben), en het verschil in afstand is de afstand die de rechtersensor naar voren moet.
@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?