Voor een toepassing gebruik heb ik onderstaand proggie geschreven, alleen heb ik wat vraagtekens op juistheid.
Ik ga met goto naar de subroutine:
overstroom en acculaag.
Hieruit ga ik met goto start... dit lijkt te werken maar niet altijd vlekkeloos.
Tevens wil ik in de overstroom een delay zetten tussen low mlinks (aandrijving)en high mrechts (aandrijving). Dit zonder dat het invloed heeft op de detectie van de schakelaar 'cyclus'. nu stopt mrechts niet altijd door de 500 ms vertraging. Hoe vang je zoiets goed af??
Alvast bedankt
Device 16F819
Config INTRC_IO,WDT_OFF,BODEN_ON,LVP_OFF,MCLRE_ON, PWRTE_ON, CP_OFF
OSCCON = %01110000 ' 8MHz
XTAL = 8
ADIN_RES = 12
ADIN_TAD = FRC
ADIN_STIME = 50
ALL_DIGITAL TRUE ;Alle ingangen digitaal
PORTB_PULLUPS On ;On-chip pull-up weerstanden actief
TRISA = %00000011 ;
TRISB = %00110000
ADCON1 = %11000000
Symbol mlinks = PORTB.0 ; motor linksom
Symbol mrechts = PORTB.1 ; motor rechtsom
Symbol groen = PORTB.2 ; led groen
Symbol rood = PORTB.3 ; led rood
Symbol cyclus = PORTB.4 ; cyclusschakelaar
Symbol deur = PORTB.5 ; deurschakelaar
Symbol aan =0
Symbol uit =1
Symbol open = 1
Symbol dicht =0
; dummybit
Dim ddeur As Bit
Dim dcyclus As Bit
; analoge signalen
Dim stroom As Word
Dim accu As Word
Clear ;Wis alle RAM geheugen
ddeur= 0 ; zet dymmy bit op 0
dcyclus = 0
; hoofdprogramma
start:
stroom = ADIn 1 ; lezen analoge ingangen
accu = ADIn 0
; accuspanning
If accu > 670 Then groen = 1
If accu < 670 And cyclus = 0 Then groen =0 ; als accuspanning lager dan 10VDC wordt en de cyclus is gereed
; dan led groen uit.
If accu < 514 And cyclus = 1 Then GoTo overstroom ; als accuspanning tijdens bedrijf onder de 8 VDC zakt gaat de motor terug naar start
If stroom > 41 Then GoTo overstroom ; als opgenomen motorstroom > 14A dan naar 'overstroom'.
If deur ! = ddeur Then ; als deur niet gelijk aan dummy deur is dan,
If deur = dicht Then ; als deur dicht is dan motor linksom aan.
mlinks =1
EndIf
EndIf
ddeur = deur ; dummy deur = deur
If cyclus ! = dcyclus Then ; als cyclus niet gelijk aan dcyclus dan
If cyclus = aan Then ; als cyclus aan is dan stop motor linksom
mlinks = 0
EndIf
EndIf
dcyclus = cyclus
If deur = open Then ; als deur geopend wordt stop motor linksom
mlinks = 0
EndIf
If groen = 0 Then GoTo acculaag ; als led groen uit is ga naar 'acculaag'
DelayMS 100
GoTo start
acculaag:
DelayMS 200 ; als accuspanning lager dan 10VDC wordt en de cyclus is gereed
While 1=1 ; dan led rood knipperen en start geblokkeerd
accu = ADIn 0
If accu > 670 Then groen = 1
High rood
DelayMS 1000
Low rood
DelayMS 1000
If groen = 1 Then Break
Wend
overstroom: ; Als opgenomen stroom > 14 A is of de accuspanning tijdens bedrijf onder de VDC zakt
; dan wordt aandrijving gestopt en terug naar start gestuurd.
While 1=1
Low mlinks
Low groen
High rood
DelayMS 500
If cyclus = 1 Then High mrechts
If cyclus = 0 Then Low mrechts
If cyclus = 0 Then Low rood
If cyclus = 0 Then Break
Wend
GoTo start
elmowww
PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
Zoals in cursus deel 1 al wordt geschreven moet je GOTO eigenlijk nooit gebruiken, tenzij je goed weet wat je doet en de boel gestructureerd opzet.
In jouw code staat in de routine AccuLaag:
IF Groen = 1 THEN BREAK
Dat betekent dat als Groen '1' is, dat hij uit de WHILE ... WEND springt en meteen de routine OverStroom binnenwandelt.
Ik neem aan dat dat niet de bedoeling is.
Zoals elmowww al schreef kun je veel beter met GOSUB naar een subroutine gaan en dan met RETURN weer terug.
Lees cursus deel 6:
www.picbasic.nl/beginners6_nl.htm#GOSUBRETURN over de GOSUB en RETURN.
die GoSub en return staan trouwens ook goed beschreven in de handleiding van PROTON developer zelf. Daarnaast moet je toch even verder kijken naar de efficientie van je code.
GoSub acculaag
acculaag:
DelayMS 200
While groen = 0
accu = ADIn 0
If accu > 670 Then groen = 1
High rood
DelayMS 1000
Low rood
DelayMS 1000
Wend
Return
en code mag je post tussen code tags 
Bedankt voor jullie reakties. Ik ga het meteen veranderen.
Hoe zou je zoals eerder beschreven een delay in de sub overstroom kunnen zetten zonder dat het invloed heeft op de werking van cyclus schakelaar. (nu kan hij in de delay zitten terwijl de schakelaar bedient wordt).
Alvast bedankt
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
Interrupts, maar dat is nog te hoog gegrepen voor je denk ik.
Je kunt dat doet d.m.v. polling.
Stel, je wilt 5 seconden wachten dan kun je dat doen door DELAYMS 5000.
Maar de PIC ligt dan verder helemaal stil, dus ziet ie ook niet wat er op een ingang gebeurt.
Door de DELAYMS 5000 in stukjes te breken en in een lus te zetten die (bijvoorbeeld) 5000 keer wordt doorlopen kan het wel.
DIM Tijd AS WORD ;Tijd als WORD declareren
FOR Tijd = 1 TO 5000 ;Lus lopen totdat 'Tijd' voorbij is
DELAYMS 1 ;1 mSec wachten
IF PORTB.0 = LAAG THEN GOTO Label ;Als op toets is gedrukt
NEXT Zoiets...
Het ligt eraan hoe snel je wilt meten.
Je kunt bijvoorbeeld ook DELAYMS 10 in de lus zetten.
Dan hoef je voor 5 seconden maar 500 keer de lus door te lopen.
Als je vaak moet wachten terwijl een ingang gecontroleerd moet worden kun je dit stukje code in een subroutine zetten.
Hierover ook een stukje in de cursus:
www.picbasic.nl/beginners6_nl.htm#Onderbreken
Let hierbij wel op dat de for next en instructies hiertussen naast de delay ook tijd in beslag nemen. Natuurlijk is het afhankelijk van hoe nouwkeurig deze delay tijd moet zijn.
Ik heb al eens een uv-timer op deze manier gemaakt met een maximum tijd van 15 minuten, bleek er toch al een halve naast te zitten.
Als je trouwens gebruikt wil maken van software interrupts moet je de delay nog op de manier doen zoals Frits dat zegt.
anders genereert de software pas een interrupt na de delay.
Bedankt voor de hulp.
Ik heb voor zover gebruik gemaakt van de For/ Next methode.
Tevens heb ik hier en daar nog wat aanpassingen gedaan.
Ik ga eerdaags zeker de interrupts bestuderen, maar zoals Frits al zegt is dat misschien nog iets te vroeg gezien mijn prog ervaring.
Bedankt.