Beste mensen,

ik wou een programma schrijven in proton IDE, maar nu liep ik op een probleem;
Dit schema heb ik:
http://i630.photobucket.com/albums/uu25/antiadmin44/schema-1.png

Ik wou dit programma schrijven:

Als ik op knop 1 klik, moet lamp 1 aangaan.
als ik op knop 2 klik, moet lamp 2 aangaan
als ik op knop 1 EN 2 klik, dan moet lamp 1 en 2 ombeurten een seconde aan staan.
dit is opzich geen probleem. maar als ik nu hetzelfde wil, maar bij schakelaar 3 en 4, en lamp 3 en 4, en ik zet het in proton in een While - wend loop, en je klikt knop 1 en 2, en knop 3 en 4 samen in, dan zouden ze dus om de 2 seconde knipperen.

Ik heb dit:

While 1 = 1
If I1 = IN Then
    If I2 = IN Then
        High O1
        DelayMS 1000
        Low O2
    ElseIf I2 = IN And I1 = UIT Then
        High 02
    EndIf
    If I2 <> IN Then High O1
EndIf

If I3 = IN Then
    If I4 = IN Then
        High O3
        DelayMS 1000
        Low O4
    ElseIf I4 = IN And I3 = UIT Then
        High O4
    EndIf
    If I4 = UIT Then High O3
EndIf
    
Wend

hardware matig werkt alles.

Ik dacht eraan een timermodule te gebruiken. Maar mischien zit ik helemaal verkeerd te denken.

Alvast bedankt, Marcel vd Heuvel

De beschrijving van wat je wilt is onvolledig en onduidelijk.
Wat moet er bijvoorbeeld gebeuren als je knop1 en knop2 niet indrukt, wat moet er gebeuren na het knipperen, hoe lang moet er worden geknipperd?

Als je eerst alle mogelijkheden uitwerkt kom je een stuk verder.

Verder is deze constructie erg onlogisch en vooral foutgevoelig.


If I1 = IN Then
    If I2 = IN Then
        High O1
        DelayMS 1000
        Low O2
    ElseIf I2 = IN And I1 = UIT Then 
                       ; Hoe kan dit?, I1 is toch IN? 
                       ; Of komt dat door de delayMS ?
        High 02
    EndIf
    If I2 <> IN Then High O1
EndIf

En wat doet de schakeling nu, want je suggestie is dat het niet werkt zoals je wilt.

Bedankt voor je reactie, sorry voor mn onduidelijkheid.

Maar, als je de knop(pen) los laat, stopt alles, dus als je knop 1 los laat, gaat lamp 1 ook weer uit.
het knipperen gaat dus ook door todat je knop 1 en 2 loslaat, of 3 en 4 dan.

Verder is deze constructie erg onlogisch en vooral foutgevoelig.

Daarom vroeg ik dus hulp.

Marcel

He Marcel,
je hoeft je niet meteen te verontschuldigen hoor.
Ik heb in mijn leven al zoveel onduidelijkheden en onvolledigheden van ICT-professionals gezien dat dit er bij in het niet valt.
En...je stelt een vraag en dat is altijd goed.

Maar ik mis nog steeds een zo goed mogelijke beschrijving van wat je product moet gaan doen (en je geeft nog steeds niet aan wat er nu niet goed gaat).

Advies: stel een tabel op met alle mogelijkheden, begin met twee knoppen:


knop 1 knop 2  actie
 aan    uit    1 aan, 2 uit
 uit    aan    1 uit, 2 aan
 uit    uit    1 uit, 2 uit
 aan    aan    1 aan, 2 uit, wacht, 1 uit, 2 aan, wacht, 2 uit

Met knop 3 en 4 (en lamp 3 en 4) er bij krijg je in principe 16 mogelijkheden.


knop 1  knop 2  knop 3  knop 4   actie
 aan     uit     uit     uit
 uit     aan     uit     uit
 uit     uit     uit     uit
 aan     aan     uit     uit

 aan     uit     aan     uit
 uit     aan     aan     uit
 uit     uit     aan     uit
 aan     aan     aan     uit

 aan     uit     uit     aan
 uit     aan     uit     aan
 uit     uit     uit     aan
 aan     aan     uit     aan

 aan     uit     aan     aan
 uit     aan     aan     aan
 uit     uit     aan     aan
 aan     aan     aan     aan

Vervolgens moet je voor de implementatie nadenken over hoe je omgaat met die knoppen: wanneer vraag je ze uit? Dit bepaalt namelijk de 'gevoeligheid' (lees: bedieningsgemak) van je product als er een periode 'wachten' in zit.

Oke, opzich gaat alles goed, maar het gaat vooral om het knipperen. als ik op knop 1 en 2 klik, knipperen de lampen wel, maar, als ik dan op knop 3 en 4 klik, dan gaat l1 aan, na 1 seconde weer uit en l2 aan, en daarna l3 aan, en weer na 1 seconde l4 aan. en dus duurt de hele loop 2 seconde, terwijl ik dus wil, als ik schakelaar 1 en 2 induw, gaat lamp 1 en 2 knipperen. Maar als ik knop 3 en 4 induw, moet lamp 1 en 2 om de seconde knipperen, onafhankelijk van lamp 3 en 4.

Ik hoop dat ik zo duidelijk ben geweest :)

Bedankt,
Marcel

Maar in je code is geen enkele relatie te vinden tussen knop 3/4 en lamp 1/2, dus daar begrijp ik niets van.
Heb je de code intussen veranderd?
Laat even de hele code zien.

nee knop 3 en 4 hebben niets met l1 en 2 te maken, ik bedoel als je knop 1, 2, 3 en 4 in klikt, zou die dus allebei de delayms 1000 pakken, waardoor ik dus een loop krijg van 2 seconden

Inderdaad en met lampen 1 en 3 knipperend omdat de voorwaarden voor 2 en 4 nooit worden vervuld.
Ik snap je probleem nu helemaal niet meer want je maakt helemaal niet duidelijk wat het verschil is tussen het gewenste resultaat en het feitelijke resultaat.

[Bericht gewijzigd door hadv op (14%)]

While 1 = 1
If I1 = IN Then 
    High O1
Else
    Low O1
EndIf

If I2 = IN Then
    High O2
Else
    Low O2
EndIf

If I1 And I2 = IN Then
    Low O2
    High O1
    DelayMS 1000
    Low O1
    High O2  
Else 
    Low O1
    Low O2
EndIf

If I3 = IN Then
    High O3
Else
    Low O3
EndIf

If I4 = IN Then
    High O4
Else
    Low O4
EndIf

If I3 = IN And I4 = IN Then
    Low O4
    High O3
    DelayMS 1000
    Low O3
    High O4
Else
    Low O3
    Low O4
EndIf
  
Wend

dit is de code die ik nu heb. Maar kijk, als ik nu i1 and i2 induw, en i3 and i4, dan gaat L1 aan, na 1 seconde gaat deze weer uit, en gaat L2 aan, maar dan, gaat L3 pas aan, en na 1 seconde gaat L4 weer aan, en daarna gaat L1 pas weer aan. Ik wil deze dus zo hebben:
l2 uit
L1 aan
1 sec. Delay
l1 uit
l2 aan
1 sec. Delay

en ook

L4 uit
L3 aan
1 sec. Delay
L3 uit
L4 aan
1 sec. Delay

maar, dit wil ik dus onafhankelijk van elkaar maken. dus dat L1 aan gaat, seconde wachten, L2 aan, Seconde wachten L1 aan enz. enz. enz.

Bedankt,
Marcel

Even een beetje door gelezen, maar het word alleen maar onduidelijker.

Doe even wat hadv schreef en maak een tabel.

Geeft meer duidelijkheid. Wat ik zelf doe als er een tijd mee gemoeid is en die heb jij is het volgende.

Edit aanvulling: De letters A...H geven aan de stand status van de knoppen en resultaat van de leds.
In geval van A wordt alle knoppen 8 seconden ingedrukt, in geval van H wordt knop1, 1 sec ingedrukt.



    ___-_-
    000101
    
StateNo:    A           B      .... G   H
    knop1   11111111    1111        0   1
          
    knop2   11111111    1111        1   0

    knop3   11111111    0000        0   0

    knop4   11111111    0000        0   0

    led1    10101010    1010        0   1

    led2    01010101    0101        1   0
    
    led3    00100010    0000        0   0

    led4    00010001    0000        0   0
    
    --==> tijd 0101 = _-_- = 4 sec


Weet niet of je dit bedoelde in je eisen.

Met het hierboven vb kan het volgende doen.



while ( 1)    
    led1 = 0
    led2 = 0
    led3 = 0
    led4 = 0
//A    
    while ( knop1 & knop2 & knop3 & knop4 ) then
        ButTimeState = ButTimeState + 1
        if ButTimeState & 1 then
            led1 = 1
            led2 = 0
        endif
        if ButTimeState & 2 then
            led1 = 0
            led2 = 1
        endif
        if ButTimeState = 3 then
            led3 = 1
            led4 = 0
        endif
        if ButTimeState = 4 then
            ButTimeState = 0
            led3 = 0
            led4 = 1
        endif
        delay 1000
    wend
// B
    while ( knop1 & knop2 & !knop3 & !knop4 ) then
        ButTimeState = ButTimeState + 1
            led3 = 0
            led4 = 0
        if ButTimeState = 1 then
            led1 = 1
            led2 = 0
        else
            ButTimeState = 0
            led1 = 0
            led2 = 1
        endif
        delay 1000
    wend
.....
//H
    while ( knop1 & !knop2 & !knop3 & !knop4 ) then
            led1 = 1
            led2 = 0
            led3 = 0
            led4 = 0
            // delay 1000ms
    wend
wend

Wat ik hier beschreef is een voorbeeld, alleen jij kan en moet een juiste tabel maken.
Tuurlijk kan je vereenvoudigen of wat dan ook, maar als je iets later wilt aanpassen is het niet meer simpel te noemen en leesbaar. Tevens reageert bovenstaande per seconde direct op het indrukken en loslaten van een knop en geeft ook geen geflikker. In je eigen code moet je een status var hebben en deze aan het eind omzetten naar je led anders krijg je dat geflikker en met leds niets zo erg maar als er logica nog achter zit kan het een probleem geven. Typo's guarantied!
HTH

Edit achteraf: Ik zie dat ik een laatste wijziging schijnbaar niet had gesaved. Schijnbaar te slaperig. Maar ja, je begrijpt de bedoeling.

En maak een 'state' voor hoe je lampen moeten branden/knipperen.

Lees beide toetsen tegelijk uit en 'bereken' de nieuwe state. Laat eventueel een timer je lampen knipperen. Of gebruik een counter in je mainloop om de 'tijd' te bepalen. De main-loop duurt nu immers altijd even lang (ongeveer).

Door de toetsen uitlezen, de state zetten en de lampen te bedienen in aparte code te doen is het duidelijker en makkelijker.

bv.
state12 = {uit, 1aan, 2aan, knipper}
state34 = {uit, 3aan, 4aan, knipper}


if(t1)
  if(t2)
    state12 = knipper
  else
    state12 = 1aan
  end
end
if(t2) ; & dus !t1
   state12 = 2aan
end if
; impliceert: !t1 && !t2 => huidige state behouden.

ontimer:
  if state12 = knipper
    lamp1 = !lamp1
    lamp2 = !lamp2
  end if

edit:
Of zonder timer:


while(1)
 if(t1)
  if(t2)
    state12 = knipper
  else
    state12 = 1aan
  end
 end
 if(t2) ; & dus !t1
   state12 = 2aan
 end if
; impliceert: !t1 && !t2 => huidige state behouden.

 ; eventueel knipperen:
 counter = counter + 1
 if counter == 10
   counter = 0
   if state12 = knipper 
     lamp1 = !lamp1
     lamp2 = lamp1
   end if
 end if

 sleep(100ms)
end while

Toetsen worden 10x/sec uitgelezen en de state berekend, lampen knipperen, indien nodig, 1x/sec.

Ik weet niet of je dit hebt gedaan maar je moet ook melden aan de proton welke PIC je gebruikt.
In jouw geval:

DEvice 16F628A

Ook gebruik je l1 e.d. deze moet je dan ook koppelen aan een poort:

symbol port x.xx ;op x komt dan of je poort a of b gebruikt en op xx welke nummer

Soms is het ook handig om wat notities of meer informatie bij een regel te zetten, dit kan door een ; te zetten dan tekst te plaatsen:

high porta.1  ;we maken poort a.1 hoog

Ik weet niet of je dit al hebt gedaan maar zie dit niet in de code staan.
Kijk ook eens op deze site: [url="www.picbasic.nl"]picbasic.nl[/url]

Nog veel succes en hopen dat het werkt!

Ledfan: Commentaar is bedoeld om uit te leggen wat er gebeurt en waarom, zodat je later nog begrijpt waarom het programma in elkaar zit zoals het in elkaar zit.
Alleen uitleggen wat een instructie doet is geen commentaar maar overbodige tekst, zeker als de instructie zelf glashelder is.

@Marzl: blijkbaar ben je niet van plan de adviezen op te volgen.
Teksten als 'enz. enz. enz.' zeggen mij genoeg.
Ik heb mijn kristallen bol uitgezet.

[Bericht gewijzigd door hadv op (21%)]

Op 3 november 2010 11:48:54 schreef hadv:
Ledfan: Commentaar is bedoeld om uit te leggen wat er gebeurt en waarom, zodat je later nog begrijpt waarom het programma in elkaar zit zoals het in elkaar zit.
Alleen uitleggen wat een instructie doet is geen commentaar maar overbodige tekst, zeker als de instructie zelf glashelder is.

@Marzl: blijkbaar ben je niet van plan de adviezen op te volgen.
Teksten als 'enz. enz. enz.' zeggen mij genoeg.
Ik heb mijn kristallen bol uitgezet.

@hadv, nog even geduld met uitzetten. Misschien komt er goed bericht vandaag. Velen vergeten, een goed begin is het halve werk, en vele wegen lijden naar Rome denken ze, maar er zijn er maar een paar goede. :-)

@ Hadv dat klopt ,was gewoon een voorbeeld.

Op 3 november 2010 12:30:49 schreef Lord Anubis:
[...]

@hadv, nog even geduld met uitzetten. Misschien komt er goed bericht vandaag. Velen vergeten, een goed begin is het halve werk, en vele wegen lijden naar Rome denken ze, maar er zijn er maar een paar goede. :-)

Dat "lijden" was onbedoeld grappig. Alle wegen leiden naar Rome, ook deze lijdensweg (Via Dolorosa).
Verder, een goed begin is het halve werk, inderdaad, maar een goed begin is ook een heel werk. Met half werken wordt het nooit wat.

[Bericht gewijzigd door hadv op (14%)]

Op 3 november 2010 16:43:03 schreef hadv:
[...]
Dat "lijden" was onbedoeld grappig. Alle wegen leiden naar Rome, ook deze lijdensweg (Via Dolorosa).
Verder, een goed begin is het halve werk, inderdaad, maar een goed begin is ook een heel werk. Met half werken wordt het nooit wat.

Klopt, ik had eerst een zin idd met lijden erin, bedoeld als pijn lijdensweg ivm door denken. Maar vond dat te! en veranderde wel het einde van de zin en vergat het woord zelf te veranderen. Drie gezegden / grollen in een zin was beetje veel. Nu toch nog bijna.

Oke,

Bedankt voor al jullie reacties, maar heb een oplossing gevonden.

ik kan het nog niet testen, maar ik heb zo'n vaag vermoeden dat dit wel eens kon werken.

Ik weet dat deze code er niet zo goed uitziet als jullie, maar, daarvoor zijn we toch hier ;)

hier komt tie:


'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 11/1/2010                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 16F628A
Config INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal (voor de toetsen)

Symbol I1 = PORTB.1
Symbol I2 = PORTB.2
Symbol I3 = PORTB.3
Symbol I4 = PORTB.4
Symbol I5 = PORTB.5
Symbol I6 = PORTB.6
Symbol I7 = PORTB.7
Symbol O1 = PORTA.3
Symbol O2 = PORTA.2
Symbol O3 = PORTA.4
Symbol O4 = PORTA.1
Symbol O5 = PORTA.0
Symbol O6 = PORTA.7
Symbol O7 = PORTA.6

Symbol IN = 0
Symbol UIT = 1

        ;76543210
TRISA = %00100000
TRISB = %11111111
ALL_DIGITAL TRUE
PORTB_PULLUPS TRUE

start:


If I1 = IN And I2 = UIT Then                                                     ;als alleen 1 hoog is
    High O1
    GoTo start                                                                   ;waarom? anders zou o1 meteen weer uitgaan bij het volgende statement
Else
    Low O1
EndIf

If I2 = IN And I1 = UIT Then                                                     ;als alleen 2 hoog is
    High O2
    GoTo start
Else
    Low O2
EndIf

If I1 = IN And I2 = IN And I3 = UIT And I4 = UIT Then                                 ;als 1 en 2 hoog zijn, maar 3 en 4  niet
    Low O2
    High O1
    DelayMS 1000
    Low O1
    High O2
    GoTo start  
Else 
    Low O1
    Low O2
EndIf

If I3 = IN And I4 = UIT Then                                                     ;als alleen 3 hoog is
    High O3
    GoTo start
Else
    Low O3
EndIf

If I4 = IN And I3 = UIT Then                                                     ;als alleen 4 hoog is
    High O4
    GoTo start
Else
    Low O4
EndIf

If I3 = IN And I4 = IN And I1 = UIT And I2 = UIT Then                            ;als alleen 3 en 4 hoog zijn, maar 1 en 2 niet.
    Low O4
    High O3
    DelayMS 1000
    Low O3
    High O4
    GoTo start
Else
    Low O3
    Low O4
EndIf

If I1 = IN And I2 = IN And I3 = IN And I4 = IN Then                            ;als ingang 1,2,3 en 4 hoog zijn.
    Low O2
    Low O4
    High O1
    High O3
    DelayMS 1000
    Low O1
    Low O3
    High O2
    High O4
    DelayMS 1000
    GoTo start
Else
    Low O1
    Low O2
    Low O3
    Low O4
EndIf
  
GoTo start
End

Ik zou 'author' niet invullen ;)

probeer het nu eens zoals meerdere je adviseren:
* bekijk alle mogelijkheden
* zie dit als 'states'
Dan in code:
* lees je toetsen uit
* set je state
* afhankelijk van state je lampen bedienen
* delay.

Staan aantal goede opzetjes hierboven die een kwart van de code genereren.

Beste CO'ers: hij luistert gewoon niet.
Ik durf te wedden dat als TS het straks bouwt hij zegt dat O4 niet werkt.