Technojunk
Printje geëtst hebben? mail me! | Even the invisible must be perfect | Ook een Meetsnoeren ophangrekje
Ik ben ondertussen nog steeds bezig met mijn lichtsluis-project.
Wat er moet gebeuren:
Als S1 = aan, en daarna S2 = aan -> led 1 moet aan gaan,
Als S2 = aan, en daarna S1 = aan -> led 2 moet aan gaan.
Dit werkt perfect maar:
Nu moet als S3 of S4 langer dan 2000mS aan is, led 3 aan gaan (S4 is even weggelaten in de progje)
Dit word totaal overgeslagen, ongeacht waar dit in het programma staat.
Los werkt het trouwens wel..
Device 16F628A
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE
Symbol S1 = PORTB.0
Symbol S2 = PORTB.1
Symbol S3 = PORTB.2
Symbol S4 = PORTB.3
Symbol LED1 = PORTA.0
Symbol LED2 = PORTA.1
Symbol LED3 = PORTA.2
Dim teller As Word
Dim teller1 As Word
Symbol Aan = 0
Symbol Uit = 1
; 76543210 <<<Een hulpregeltje
PORTA = %00000000
PORTB = %00000000
TRISA = %00000000
TRISB = %11111111
PORTB_PULLUPS On
Clear
Chek:
If S1 = Aan Then
While teller <= 50
If S2 = Aan Then
teller = 0
LED1 = 1
DelayMS 500
LED1 = 0
GoTo Chek
EndIf
DelayMS 100
Inc teller
Wend
teller = 0
ElseIf S2 = Aan Then
While teller1 <= 50
If S1 = Aan Then
teller1 = 0
LED2 = 1
DelayMS 500
LED2 = 0
GoTo Chek
EndIf
DelayMS 100
Inc teller1
Wend
teller1 = 0
ElseIf S3 = Aan Then
DelayMS 2000
If S3 = Aan Then
LED3 = 1
DelayMS 1000
LED3 = 0
GoTo Chek
EndIf
EndIf
DelayMS 100
GoTo Chek
End
Bedankt voor de moeite alvast..
plantrekker
True story bro!
Aj, een delay van 2000 ms doe je in ieder gaval al beter niet. Als S3 of S4 ingedrukt wordt, moet je een timer instellen, neem hiervoor een 16bit timer. Bij elke overflow laat je een ISR uitvoeren die kijkt of de schakelaar nog steeds ingedrukt is. Stel dat je timer op 20MHz loopt dan tel je in je ISR dus tot 610, is je schakelaar er voor al losgelaten, dan zorg je er voor dat de timer geen interrupts meer genereerd.
Op die manier (door bij iedere interrupt te controleren of de schakelaar nog steeds hoog is) vermijd je ook dat als de schakelaar eerst even ingedrukt werd en na iets minder dan 2sec opnieuw ingedrukt werd, je pic dit als 2sec hoog zal zien.
Technojunk
Printje geëtst hebben? mail me! | Even the invisible must be perfect | Ook een Meetsnoeren ophangrekje
Zal dat het probleem oplossen, dat S3 helemaal niet gechecked word?
Zelfs zonder delay werkt het niet..
Je teller blijft 0, want hij wordt nergens verhoogd. Als nu S1 danwel S2 laag wordt, blijft hij in die loop, totdat de ander laag wordt.
En waarom staat er een delay na de laatste GoTo? Daar komt het programma nooit, als het goed is.
Technojunk
Printje geëtst hebben? mail me! | Even the invisible must be perfect | Ook een Meetsnoeren ophangrekje
Ik heb dat stukje code van iemand gekregen, apart werken de stukjes code perfect..
Ik denk dat het aan de lange delay licht, zonder werkt het wel, maar dan heb ik m'n zin niet 
klein is fijn
Moderator
Op 12 oktober 2009 17:33:55 schreef Technojunk:
Ik heb dat stukje code ergens weggeplukt..
apart werken de stukjes code perfect..
5000 onderdelen op een tafel smijten maakt ook geen auto, daar is iemand voor nodig die er verstand van heeft.
Ik gok dat het aan de lange delay licht
Nou, nee. Begin maar eens met de opmerking van Hagdos.
Technojunk
Printje geëtst hebben? mail me! | Even the invisible must be perfect | Ook een Meetsnoeren ophangrekje
Op 12 oktober 2009 17:53:06 schreef klein is fijn:
Nou, nee. Begin maar eens met de opmerking van Hagdos.
Nouja, dat is nou net het stuk dat wel werkt..
Ik vindt het ook vreemd om het zo te doen, normaal werk je met inc en dec om je teller te verhogen of te verlagen.
klein is fijn
Moderator
Op 12 oktober 2009 17:59:57 schreef Technojunk:
Nouja, dat is nou net het stuk dat wel werkt..
Tja, jij vraagt advies, wij geven het. Wat je er mee doet moet je zelf weten.
Maar mensen gaan steeds minder moeite voor je doen als je hun advies zo makkelijk opzij schuift.
Daan Timmer
Ik ben programmeur! geen electronicus! http://www.daantimmer.nl/ Er is een ontwerp! nu nog inhoud :-)
Technojunk
Printje geëtst hebben? mail me! | Even the invisible must be perfect | Ook een Meetsnoeren ophangrekje
Het programmatje even aangepast, nu staat er een inc teller bij.
Ik denk dat ik het probleem al heb:
Om even te testen, laat ik 1 schakelaar 2 poorten tegelijk naar de GND schakelen, als ik er maar 1 doe (S3 dus) werkt het wel.
Als ik bijvoorbeeld S1 en S3 tegelijk naar de GND schakel, word er alleen naar S1 gekeken, en niet naar S3.
Hoe zou ik dit het beste op kunnen lossen?
Als je de goto chek uit de if functie haalt zal hij wel beiden doen.
Nu springt hij steeds terug naar check en komt alleen bij de if s3 = aan als s1 en s2 beiden 0 zijn.
Volgens mij telt de teller nog steeds niet.
Nog voor de Inc teller spring je terug naar chek.
Daarom zou ik de goto chek weglaten.
En enkel deze op het eind laten staan.
Technojunk
Printje geëtst hebben? mail me! | Even the invisible must be perfect | Ook een Meetsnoeren ophangrekje
Als ik dat doe van jou lukasje, 1x op S1 druk, en daarna 1x op S2 druk, gaat led 1 aan, dat is goed.
Als ik daarna 1x op S2 druk, gaat led 1 weer aan.. dus dat is niet goed..
Overgens, als ik 3 echte aparte schakelaars zou pakken, zal het wel werken. (zie vorige post van mij)
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
Op 12 oktober 2009 19:52:51 schreef Technojunk:
Om even te testen, laat ik 1 schakelaar 2 poorten tegelijk naar de GND schakelen, als ik er maar 1 doe (S3 dus) werkt het wel.Als ik bijvoorbeeld S1 en S3 tegelijk naar de GND schakel, word er alleen naar S1 gekeken, en niet naar S3.
Hoe zou ik dit het beste op kunnen lossen?
Door geen gebruik te maken van ELSEIF maar van twee losse IF's, zoiets als in het tweede voorbeeld van cursus deel 2, en dat in een loopje te laten lopen:
www.picbasic.nl/beginners2.htm
