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

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%)]

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.

Ik vraag me af of ze nog last van elkaar zouden hebben, dat ze elkaars IR licht (of een reflectie daarvan) zien.

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