sjors007
...
Hallo iedereen;)
ik zit even met een probleem waarvan ik weet waar het aan licht maar niet weet hoe ik het moet oplossen.
if shpwm = aan then
inc schakstand
delayms contactdender
while shpwm = aan : wend
select SchakStand
case 0 : gosub updatehpwm1
case 1 : gosub updatehpwm2
end select
endif
IF Update2 = FALSE AND SchakStand = 0 THEN SchakStand = 1
IF Update1 = FALSE AND SchakStand = 1 THEN SchakStand = 0
weerstand = pot ldr, schaal
if weerstand >bovengrens and schakstand = 0 and update2 = true then
gosub updatehpwm2 ; case1 50
schakstand = 1
update1 = true
update2 = false
endif
if weerstand <ondergrens and schakstand = 1 and update1 = true then
gosub updatehpwm1 ; case0 250
schakstand = 0
update1 = false
update2 = true
endif
wenddit stukje code werkt als volgt. ik meet met mijn LDR continue, wanneer het donker is (hoge weerstand) ga ik naar een subroutine die de lichtintensiteit van me display bepaalt. ook wil ik deze met behulp van een schakelaar kunnen regelen.
dus stel de weerstand is heel hoog dan gaat ie naar UpdateHPWM2, maar stel ik druk op de schakelaar dan moet ie naar UpdateHPWM1 gaan. dit werkt! en hij gaat weer over naar de LDR status wanneer hij onder een bepaalde waarde komt(ondergrens)
het probleem is nu: stel hij staat in UpdateHPWM2, dan is:
- schakstand = 1
- update1 = true
- update2 = false
wanneer ik nu op de schakelaar(SHPWM) druk gaat ie netjes naar UpdateHPWM1.
schakstand word weer 0 omdat ik hem met 1 verhoogd
maar omdat er staat:
IF Update2 = FALSE AND SchakStand = 0 THEN SchakStand = 1
IF Update1 = FALSE AND SchakStand = 1 THEN SchakStand = 0 zal ik dit geval schakstand 1 worden.
wanneer me weerstand lager word dan Ondergrens zal hij niet hoeven reageren want hij staat al in UpdateHPWM1, maar dit gebeurt wel omdat:
-schakstand = 1
-update1 = true
-update2 = false
if weerstand <ondergrens and schakstand = 1 and update1 = true then
gosub updatehpwm1 ; case0 250
schakstand = 0
update1 = false
update2 = true
endifdus zal hij nog 1x naar UpdateHPWM1 gaan, dit komt omdat Update1 = true
maar eigenlijk wanneer ik me schakelaar in druk moet ie apart de weerstand meten en wanneer die lager word dan Ondergrens dan moet Update1 false worden zodat ie niet nog een keer naar UpdateHPWM1 gaat. maar ik weet niet hoe ik dit even moet aanpassen
WilToyo
Maak me niet gek, ik ben al gek.
Vind het een beetje wazig verhaal.
Je wilt het backlight van je display dimmen aan de hand van de lichtintensiteit door een ldr. Maar je wilt het ook dmv een schakelaar/drukknop doen?
Dat gaat niet werken, je zult op de ene of andere manier moeten selecteren of het dimmen automatisch (ldr) of handmatig (knop) gaat.
sjors007
...
ik wil de lichtintensiteit van me 7 Segment display kunnen veranderen.
het programma wat ik nu gebruikt werkt er zit alleen 1 probleem, ik weet wat het probleem is alleen weet ik niet hoe ik het kan oplossen:p
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Ik begrijp het ook niet erg. Wil je nu via LDR of schakelaar regelen. Het kan niet allebei tegelijk...
sjors007
...
ik wil me licht kunnen regelen in 2 stappen 100% en 25%
dit word gedaan via ldr, maar wanneer ik op een schakelaar druk moet ie naar de andere waarde gaan.
het is beetje lastig uit te leggen misschien is het het makkelijkst om er een film van me maken wat ik bedoel
sjors007
...
het is beetje moeilijk om uit te leggen het beste kan je dit gewoon even in een pic doen.
ledje op Hpwm port en een schakelaar toevoegen
symbol Bovengrens = 220
symbol Ondergrens = 180
symbol LDR = porta.5
Symbol SHpwm = portb.0
DIM SchakStand AS bit
dim Update1 aS BIT
dim Update2 as bit
schakstand = 0
update1 = true
update2 = true
portb_pullups on
goto hoofdprogramma
UpdateHPWM1:
for duty = minWaarde to maxWaarde
hpwm 1, duty, 2000
delayms 2
next
return
UpdateHPWM2:
for duty = MaxWaarde to MinWaarde step -1
hpwm 1, duty, 2000
delayms 2
next
return
Hoofdprogramma:
while 1 = 1
if shpwm = aan then
inc schakstand
delayms contactdender
while shpwm = aan : wend
select SchakStand
case 0 : gosub updatehpwm1
case 1 : gosub updatehpwm2
end select
endif
IF Update2 = FALSE AND SchakStand = 0 THEN SchakStand = 1
IF Update1 = FALSE AND SchakStand = 1 THEN SchakStand = 0
weerstand = pot ldr, schaal
if weerstand >bovengrens and schakstand = 0 and update2 = true then
gosub updatehpwm2 ; case1 50
schakstand = 1
update1 = true
update2 = false
endif
if weerstand <ondergrens and schakstand = 1 and update1 = true then
gosub updatehpwm1 ; case0 250
schakstand = 0
update1 = false
update2 = true
endif
wendje zal zien wanneer je je hand op de ldr houd dat het licht minder fel is en wanneer je juist veel licht op de ldr houd er veel licht uit de led komt.
en wanneer je nou met je hand op de ldr blijft zitten zal dus het ledje minder fel schijnen en wanneer je dan op de schakelaar drukt hij juist fel zal schijnen. wanneer je je hand van de ldr hou en er dus veel licht op komt, dan zal ie veranderen van lichtsterkte weer naar fel maar daar stond ie al in dus hoeft hij daar niet meer in te komen en dan komt omdat Update1 True blijft.
prop het programma even in je pic en kijk wat er gebeurt!;)
MVG Sjors
joopv
Golden Member
Op 2 december 2009 21:50:41 schreef sjors007:
het is beetje lastig uit te leggen
Dat is misschien wel je probleem... 
Bij programmeren is het zo dat als je je vraagstuk goed omschreven hebt, het alleen nog maar een kwestie is van coderen.
Zolang je je probleem niet goed kunt omschrijven in je moeders taal, zal het in een programmeertaal al helemaal niet lukken.
sjors007
...
ik snap zelf het probleem wel:p maar ik weet alleen niet hoe ik het kan oplossen
maar ik blijf doorproberenxd
Sjors
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
Als je met de schakelaar hem op de andere stand hebt gezet, meet hij 1 seconde later weer dat de lichtintensiteit "anders" is dan de huidige dim-stand. WAT moet hij daarmee doen?
- Niks totdat de LDR ook een overgang naar die dim-stand detecteerd?
- 30 seconden lang niks, daarna weer LDR volgen?
- meteen weer terug? (niet handig!).
Als je hierover hebt nagedacht, dat hebt omschreven, wordt het waarschijnlijk duidelijker. Zowel voor jou om het te programmeren als voor de mensen die je hier proberen te helpen.
sjors007
...
stel ik zet hem met de schakelaar in stand1 (bovengrens)
en de ldr werkt pas weer als ie onder de ondergrens komt!
stop het programma maar even in je pic. dan zie je wat ik bedoel!
Sjors
WilToyo
Maak me niet gek, ik ben al gek.
In je andere topic omschrijf je wel duidelijk wat je met de schakelaar wil. Tenminste ik neem aan dat het om hetzelfde gaat.
Je wilt dus dat de schakelaar voorrang heeft op de ldr. Dat is niet zo moeilijk te realiseren.
Ik prop het wel even in c-code, dat zul je zelf even in basic moeten zetten.
if(schakelaar==1)
{
-doe wat je moet bij de schakelaar-
}
else
{
-doe je ding met de ldr-
}
rew
four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/
volgens mij moet je dan 3 standen schakelaar hebben: stand1 is AAN, stand2 = UIT, stand 3 = volg LDR...
sjors007
...
@Wil Toyo
ik krijg het niet voor elkaar:p
de code die ik nu gebruik is:
IF SHpwm = AAN THEN
INC SchakStand
DELAYMS ContactDender
WHILE SHpwm = AAN : WEND
SELECT SchakStand
CASE 0 : Update1 = FALSE : Update2 = FALSE : GOSUB UpdateHPWM1
CASE 1 : Update2 = FALSE : Update1 = FALSE : GOSUB UpdateHPWM2
END SELECT
ENDIF
IF Update2 = FALSE AND SchakStand = 0 THEN SchakStand = 1
IF Update1 = FALSE AND SchakStand = 1 THEN SchakStand = 0
IF Weerstand <Ondergrens AND Update1 = FALSE AND Update2 = FALSE THEN Update1 = FALSE : Update2 = TRUE
IF Weerstand >Bovengrens AND Update1 = FALSE AND Update2 = FALSE THEN Update2 = FALSE : Update1 = TRUE
Weerstand = POT LDR, Schaal
IF Weerstand >Bovengrens AND SchakStand = 0 AND Update2 = TRUE THEN
GOSUB UpdateHPWM2 ; case1 50
SchakStand = 1
Update1 = TRUE
Update2 = FALSE
ENDIF
IF Weerstand <Ondergrens AND SchakStand = 1 AND Update1 = TRUE THEN
GOSUB UpdateHPWM1 ; case0 250
SchakStand = 0
Update1 = FALSE
Update2 = TRUE
ENDIF
dit werkt in zoverre goed dat wanneer de weerstand hoog is(Bovengrens) gaat me ledje dimmen, wanneer ik dan op me schakelaar druk geeft het ledje netjes weer op volle sterkte. de LDR mag pas weer reageren wanneer ie onder zijn "Ondergrens" komt. dit werkt ook naar behoren alleen het probleem komt nu. stel het word lichter buiten en de LDR meet onder de Ondergrens dat zou dus betekenen dat het ledje vel moet schijnen, maar dat deed ie al want je had op de schakelaar gedrukt, dus hoeft ie niet nog een keer naar gosub UpdateHPWM1 want hij staat al in die functie.
alleen dat probleem krijg ik er niet uit. snap je wat ik bedoel?
Begin eens met het tekenen van een flowchart
Wellicht dat je dan ziet waar de knelpunten liggen en hoe ze op te lossen.
Arco
Special Member
Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
WilToyo
Maak me niet gek, ik ben al gek.
Inderdaad maak eens een flowchart en begin helemaal overnieuw. Of zet alles achter elkaar op papier in een soort spreek/schrijftaal (GEEN CODE). Voorbeeld: als a en b gelijk zijn moet er dit en dat gebeuren anders moet er dat andere gebeuren.
Als je dingen op papier zet worden dingen soms ineens duidelijk, terwijl je er met hoofd niet bij kon.
Ik kan van dat stuk code wat je daar hebt neergezet niet veel wijs worden, het is een beetje een rommeltje. Het lijkt alsof het één invloed heeft op het ander en het ander invloed heeft op het één (deze zin is net zo warrig als je code)