Hallo,
Ik ben op zoek naar een led dimmer omdat ik in mijn huis over wil stappen naar led verlichting.
Momenteel heb ik diverse X10 dimmers maar daar kan ik geen led's mee dimmen.
Echter het principe van X10 bevalt me goed korte puls - verl. aan / uit vasthouden - dimmen.
Ik heb internet af gezocht maar helaas heb ik er geen led dimmer dmv 1 pulsschakelaar kunnen vinden.
Wel heb ik op picbasic de motor HPWM sturing gevonden en iets aangepast, nu loop ik echter vast met de software.
Wie kan me hier mee verder helpen?
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
;Algemene constanten
SYMBOL Daling = 40 ;mSec: Daalsnelheid ledverlichting
SYMBOL Stijging = 40 ;mSec: Stijgsnelheid ledverlichting
SYMBOL AAN = 1 ;Schakelaar aan = hoog (1)
SYMBOL S1 = PORTA.0 ;Op poort A.0 zit S1 aangesloten
;Variabele declareren
DIM Duty AS BYTE ;'Duty' is de variabele die de ledverlichting regeld
HPWM 1, 0, 2000 ;Reset de CCP/PWM module (Op 0% = constant laag)
; 76543210
TRISB = %11110111 ;PORTB.3 is uitgang voor PWM signaal
CLEAR ;Wis alle RAM geheugen
;Hoofdprogramma
WHILE 1 = 1 ;Oneindige lus
IF S1 = AAN THEN ;uit de lus springen als S1 = aan
FOR Duty = 1 TO 255 ;ledverlichting gaat steeds feller branden tot maximum (= 255)
HPWM 1, Duty, 2000 ;De snelheid is afhankelijk van de FOR...NEXT telvariabele
DELAYMS Stijging ;Stijgsnelheid van ledverlichting
NEXT
FOR Duty = 254 TO 0 STEP -1 ;ledverlichting gaat steeds verder dimmen tot 0
HPWM 1, Duty, 2000 ;ledverlichting felheid is afhankelijk van 'Duty', de telvariabele
DELAYMS Daling ;Daalsnelheid van ledverlichting
NEXT
ENDIF
WEND ;Terug naar WHILE
END
Niemand??
Hoe kan ik met een pulsschakelaar het onderstaande activeren?
FOR Duty = 1 TO 255 ;ledverlichting gaat steeds feller branden tot maximum (= 255)
HPWM 1, Duty, 2000 ;De snelheid is afhankelijk van de FOR...NEXT telvariabele
DELAYMS Stijging ;Stijgsnelheid van ledverlichting
NEXT
FOR Duty = 254 TO 0 STEP -1 ;ledverlichting gaat steeds verder dimmen tot 0
HPWM 1, Duty, 2000 ;ledverlichting felheid is afhankelijk van 'Duty', de telvariabele
DELAYMS Daling ;Daalsnelheid van ledverlichting
NEXT
ENDIF
WEND ;Terug naar WHILE
En als ik dan de pulsdrukker los laat de led in die waarde blijft branden?
SYMBOL AAN = 0
SYMBOL UIT = 1
SYMBOL pulsschakelaar = portb.1
PORTB_PULLUPS_ON
begin:
WHILE 1 = 1
If pulsschakelaar = AAN THEN GOTO heen_en_weer
WEND
heen_en_weer:
FOR Duty = 1 TO 255 ;ledverlichting gaat steeds feller branden tot maximum (= 255)
HPWM 1, Duty, 2000 ;De snelheid is afhankelijk van de FOR...NEXT telvariabele
DELAYMS Stijging ;Stijgsnelheid van ledverlichting
IF pulsschakelaar = uit THEN GOTO einde
NEXT
FOR Duty = 254 TO 0 STEP -1 ;ledverlichting gaat steeds verder dimmen tot 0
HPWM 1, Duty, 2000 ;ledverlichting felheid is afhankelijk van 'Duty', de telvariabele
DELAYMS Daling ;Daalsnelheid van ledverlichting
if pulsschakelaar = uit then GOTO einde
NEXT
einde:
GOTO begin
Wat doet die endif daar eigenlijk?
het verschil tussen lang en kort drukken is weer een heel ander verhaal met timers enz.
Sorry voor die endif, ik ben al geruime tijd aan het stoeien maar kom er niet uit.
Ik wil het zelf graag leren, maar hier staat geen uitleg over op de picbasis cursus.
In ieder geval ben ik nu al weer een stukje verder.
Ga het gelijk effe proberen.
Let op, dit is iet de hele code, dat had je zelf misschien ook wel gezien, ik had die symbols er voor de zekerheid bij gedaan. Ik heb ook nog wat veranderd, ik zal hem even verklaren: Eerst wordt er gewacht tot je de knop indrukt(ingang laag maakt, hoog is los vanwege pullups) Daarna wordt er steeds 1 stapje gedimt en dan gekeken of je schakelaar nog is ingedrukt. Zo nee dan sprint hij uit de loop.
[Bericht gewijzigd door pientertje op (52%)]
Hoera het werkt.
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
;Algemene constanten
SYMBOL Daling = 40 ;mSec: Daalsnelheid ledverlichting
SYMBOL Stijging = 40 ;mSec: Stijgsnelheid ledverlichting
SYMBOL AAN = 1
SYMBOL UIT = 0
SYMBOL pulsschakelaar = PORTA.0
;Variabele declareren
DIM Duty AS BYTE ;'Duty' is de variabele die de ledverlichting regeld
HPWM 1, 0, 2000 ;Reset de CCP/PWM module (Op 0% = constant laag)
; 76543210
TRISB = %11110111 ;PORTB.3 is uitgang voor PWM signaal
CLEAR ;Wis alle RAM geheugen
begin:
WHILE 1 = 1
IF pulsschakelaar = AAN THEN GOTO heen_en_weer
WEND
heen_en_weer:
FOR Duty = 1 TO 255 ;ledverlichting gaat steeds feller branden tot maximum (= 255)
HPWM 1, Duty, 2000 ;De snelheid is afhankelijk van de FOR...NEXT telvariabele
DELAYMS Stijging ;Stijgsnelheid van ledverlichting
IF pulsschakelaar = UIT THEN GOTO einde
NEXT
FOR Duty = 254 TO 0 STEP -1 ;ledverlichting gaat steeds verder dimmen tot 0
HPWM 1, Duty, 2000 ;ledverlichting felheid is afhankelijk van 'Duty', de telvariabele
DELAYMS Daling ;Daalsnelheid van ledverlichting
IF pulsschakelaar = UIT THEN GOTO einde
NEXT
einde:
GOTO begin
Nu ga ik proberen om door middel van dezelfde pulsdrukker de verlichting aan en uit te schakelen dmv 3 sec. vasthouden van de pulsdrukker.
Nu moet er in het programa iets komen van ;Als s1 langer dan 3 sec aan is dan toggle B3.
IF S1 = AAN THEN
LED1 = LED1 ^ 1 ;Als LED1 aan was dan uitzetten anders aanzetten
DELAYMS 25 ;Anti contactdender
WHILE S1 = AAN : WEND ;Wacht tot S1 wordt losgelaten
ENDIF
Deze code komt ook van de cursus.
Hier moet alleen nog een vertraging in komen.
(ga er morgen mee verder)
( Dat er nog niet eerder vraag is geweest naar zo'n dimmer)
[Bericht gewijzigd door jurg op (12%)]
Ik ben nu bezig met de aan / uit schakeling van de uitgang.
Deze moet bij een korte pus aan / uit schakelen.
Dit is de code die ik nu heb;
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
;Algemene constanten
SYMBOL Daling = 40 ;mSec: Daalsnelheid ledverlichting
SYMBOL Stijging = 40 ;mSec: Stijgsnelheid ledverlichting
SYMBOL AAN = 1
SYMBOL UIT = 0
SYMBOL pulsschakelaar = PORTA.0
;Variabele declareren
DIM Duty AS BYTE ;'Duty' is de variabele die de ledverlichting regeld
HPWM 1, 0, 2000 ;Reset de CCP/PWM module (Op 0% = constant laag)
; 76543210
TRISB = %11110111 ;PORTB.3 is uitgang voor PWM signaal
CLEAR ;Wis alle RAM geheugen
begin:
WHILE 1 = 1
IF pulsschakelaar = AAN THEN
PORTB.3 = PORTB.3 ^ 1 ;Als LED aan was dan uitzetten anders aanzetten
DELAYMS 75 ;Anti contactdender
IF pulsschakelaar = AAN : THEN GOTO heen_en_weer ;Wacht tot pulsschakelaar wordt losgelaten
ENDIF
WEND
heen_en_weer:
FOR Duty = 1 TO 255 ;ledverlichting gaat steeds feller branden tot maximum (= 255)
HPWM 2, Duty, 2000 ;De snelheid is afhankelijk van de FOR...NEXT telvariabele
DELAYMS Stijging ;Stijgsnelheid van ledverlichting
IF pulsschakelaar = UIT THEN GOTO einde
NEXT
FOR Duty = 254 TO 0 STEP -1 ;ledverlichting gaat steeds verder dimmen tot 0
HPWM 2, Duty, 2000 ;ledverlichting felheid is afhankelijk van 'Duty', de telvariabele
DELAYMS Daling ;Daalsnelheid van ledverlichting
IF pulsschakelaar = UIT THEN GOTO einde
NEXT
einde:
GOTO begin
In de onderstaande regel gaat het fout;
IF pulsschakelaar = AAN : THEN GOTO heen_en_weer ;Wacht tot pulsschakelaar wordt losgelaten
IF pulsschakelaar = AAN THEN
PORTB.3 = PORTB.3 ^ 1 ;Als LED aan was dan uitzetten anders aanzetten
DELAYMS 75 ;Anti contactdender
IF pulsschakelaar = AAN : THEN GOTO heen_en_weer ;Wacht tot pulsschakelaar wordt losgelaten
ENDIF
Kan netter, waarom twee keer testen of iets aan is?
In tussentijd kan er al een statusverandering zijn.
Edit: Je probeert Frits na te doen, maar dan verkeerd
En vergeet je ook je ingang te trissen... (plus een slordigheidje wat het gebruik van TRIS zelf betreft).
Zie http://www.picbasic.nl/beginners3.htm
[Bericht gewijzigd door Henry S. op (21%)]
Mijn gedachtengang is dat als de pulsdrukker nog hoog is na de vertraging het programma dan verder moet gaan met heen_en_weer.
Mss iets te kort door de bocht?
Ik heb nu de in- en uitgangen geconfigureerd.
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
;Algemene constanten
SYMBOL Daling = 40 ;mSec: Daalsnelheid ledverlichting
SYMBOL Stijging = 40 ;mSec: Stijgsnelheid ledverlichting
SYMBOL AAN = 1
SYMBOL UIT = 0
SYMBOL pulsschakelaar = PORTA.0
;Variabele declareren
DIM Duty AS BYTE ;'Duty' is de variabele die de ledverlichting regeld
HPWM 1, 0, 2000 ;Reset de CCP/PWM module (Op 0% = constant laag)
; 76543210
PORTA = %00000000 ;Alle niveaus van PORTA eerst laag maken
PORTB = %00000000 ;Alle niveaus van PORTB laag
TRISA = %00000001 ;PORTA.7 / A.1 omschakelen als uitgang, de rest blijft ingang
TRISB = %11110111 ;PORTB.3 is uitgang voor PWM signaal
CLEAR ;Wis alle RAM geheugen
begin:
WHILE 1 = 1
IF pulsschakelaar = AAN THEN
PORTB.3 = PORTB.3 ^ 1 ;Als LED aan was dan uitzetten anders aanzetten
DELAYMS 75 ;Anti contactdender
IF pulsschakelaar = AAN : THEN GOTO heen_en_weer ;Wacht tot pulsschakelaar wordt losgelaten
ENDIF
WEND
heen_en_weer:
FOR Duty = 1 TO 255 ;ledverlichting gaat steeds feller branden tot maximum (= 255)
HPWM 2, Duty, 2000 ;De snelheid is afhankelijk van de FOR...NEXT telvariabele
DELAYMS Stijging ;Stijgsnelheid van ledverlichting
IF pulsschakelaar = UIT THEN GOTO einde
NEXT
FOR Duty = 254 TO 0 STEP -1 ;ledverlichting gaat steeds verder dimmen tot 0
HPWM 2, Duty, 2000 ;ledverlichting felheid is afhankelijk van 'Duty', de telvariabele
DELAYMS Daling ;Daalsnelheid van ledverlichting
IF pulsschakelaar = UIT THEN GOTO einde
NEXT
einde:
GOTO begin
Wat doe ik verkeerd?
IF pulsschakelaar = AAN : THEN GOTO heen_en_weer ;Wacht tot pulsschakelaar wordt losgelaten
Ik zal proberen dit na te zoeken.
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
Op 25 januari 2009 23:15:03 schreef jurg:
Wat doe ik verkeerd?
IF pulsschakelaar = AAN : THEN GOTO heen_en_weer ;Wacht tot pulsschakelaar wordt losgelatenIk zal proberen dit na te zoeken.
Wat doet die dubbele punt daar?
En keyword GOTO is in dit geval ook overbodig.
EDIT:
Ook het commentaar in de REM regel slaat nergens op, de getoonde programmaregel doet in ieder geval niet wat jij er achter hebt geschreven.
[Bericht gewijzigd door Frits Kieftenbelt op (17%)]
klein is fijn
Moderator
einde:
GOTO beginNiet dat het iets aan de werking veranderd, maar een beetje van label naar label springen in vrij zinloos. Geef dan overal meteen een goto begin.
Idem voor PORTB.3 = PORTB.3 ^ 1, daar heb je een Toggle commando voor.
Sorry voor de late reactie, ben een paar dagen op karwei geweest.
Ik heb inmiddels de code aangepast (begin het nu een beetje te snappen).
DEVICE 16F628A ;Gebruik een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE ;Alle ingangen digitaal
;Algemene constanten
SYMBOL Daling = 20 ;mSec: Daalsnelheid ledverlichting
SYMBOL Stijging = 20 ;mSec: Stijgsnelheid ledverlichting
SYMBOL AAN = 1
SYMBOL UIT = 0
SYMBOL pulsschakelaar = PORTA.0
;Variabele declareren
DIM Duty AS BYTE ;'Duty' is de variabele die de ledverlichting regeld
DIM aantal AS BYTE
HPWM 1, 0, 2000 ;Reset de CCP/PWM module (Op 0% = constant laag)
; 76543210
PORTA = %00000000 ;Alle niveaus van PORTA laag maken
PORTB = %00000000 ;Alle niveaus van PORTB laag maken
TRISA = %00000001 ;PORTA.7 / A.1 omschakelen als uitgang, de rest blijft ingang
TRISB = %11110111 ;PORTB.3 is uitgang voor PWM signaal
CLEAR ;Wis alle RAM geheugen
begin:
WHILE 1=1
IF pulsschakelaar = AAN THEN GOTO verder
WEND
verder:
FOR aantal = 1 TO 30
DELAYMS 100
IF pulsschakelaar = UIT THEN GOTO kort
NEXT
FOR Duty = 1 TO 255 ;ledverlichting gaat steeds feller branden tot maximum (= 255)
HPWM 2, Duty, 2000 ;De snelheid is afhankelijk van de FOR...NEXT telvariabele
DELAYMS Stijging ;Stijgsnelheid van ledverlichting
IF pulsschakelaar = UIT THEN GOTO einde
NEXT
FOR Duty = 254 TO 0 STEP -1 ;ledverlichting gaat steeds verder dimmen tot 0
HPWM 2, Duty, 2000 ;ledverlichting felheid is afhankelijk van 'Duty', de telvariabele
DELAYMS Daling ;Daalsnelheid van ledverlichting
IF pulsschakelaar = UIT THEN GOTO einde
NEXT
einde:
GOTO begin
kort:
TOGGLE PORTB.3
GOTO begin
Het dimmen gaat prima, maar de uitgang PORTB.3 is niet uit te zetten.
Frits Kieftenbelt
Ohm sweet Ohm | www.picbasic.nl
Op 26 januari 2009 20:44:49 schreef klein is fijn:
Idem voor PORTB.3 = PORTB.3 ^ 1, daar heb je een Toggle commando voor.
Da's niet helemaal hetzelfde.
De oplossing PORTB.3 = PORTB.3 ^ 1 is ietwat beter, omdat de instructie TOGGLE ook de betreffende poort naar uitgang omschakelt (ook als deze reeds als uitgang stond ingesteld), en iets op '0' zetten wat al '0' is (idem voor '1') (TRIS), is natuurlijk zonde van het programmageheugen, ook al is het maar weinig extra HEX.
Nog beter is PORTB.3 = ~PORTB.3 ;Toggle uitgang B.3
TOGGLE is wel makkelijk voor beginners, die hoeven zich dan nog niet druk te maken over "eerst naar uitgang omschakelen".
Cursus deel 1 & 2 doen het dus met TOGGLE, in deel 3 wordt uitgelegd waarom TOGGLE (en ook LOW en HIGH) toch niet zo fijn is dan gedacht.
Zie ook www.picbasic.nl/beginners3.htm
Anoniem
Hallo Jurg,
ben je er inmiddels uit?
Ik ben naar precies hetzelfde op zoek als jij beschrijft.
Ik heb zelf diverse constante stroombronnen voor leds ontworpen, ook met pwm dimmer maar dan m.b.v. potmeter.
Ook heb ik een ontvanger voor 8 kanalen die je met een universele (RC5) code afstandsbediening kan aansturen en dimmen heb ik hier werkend liggen.
Ben nog niet zo thuis in het zelf schrijven van software voor pic's of Atmel controllers, maar wie weet kunnen we elkaar helpen?
Ik zou me zelf natuurlijk beter in kunnen gaan verdiepen, maar heb nog zoveel andere projecten liggen 