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
Wendhardware matig werkt alles.
Ik dacht eraan een timermodule te gebruiken. Maar mischien zit ik helemaal verkeerd te denken.
Alvast bedankt, Marcel vd Heuvel
hadv
Just find out what you like and let it kill you
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
hadv
Just find out what you like and let it kill you
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
hadv
Just find out what you like and let it kill you
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
hadv
Just find out what you like and let it kill you
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
Wenddit 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 16F628AOok 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 nummerSoms 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 hoogIk 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!
hadv
Just find out what you like and let it kill you
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
Just find out what you like and let it kill you
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
EndIk 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.
hadv
Just find out what you like and let it kill you
Beste CO'ers: hij luistert gewoon niet.
Ik durf te wedden dat als TS het straks bouwt hij zegt dat O4 niet werkt.