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

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.

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.

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 :)

Waarom werk je niet gewoon met timer interrupts? Is een stuk netter.

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.

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.

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.

Ik had ook al gevraagd waar die teller ophoogde :P

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.

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)

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