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.

Geposte link goed lezen.
je TRISA klopt ook niet... Weet je zelf wat je doet?

Je kan in plaats van dat rommeltje ook zeggen:

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 losgelaten

Ik 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%)]

einde:
GOTO begin

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

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

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