Na wat puzzelen heb ik een stukje code gemaakt om m.b.v. 3 drukknoppen mijn ledstrips de gewenste kleur te geven.

Nu vroeg ik me af wie er hier ervaring mee heeft en hoe ik de onderstaande code misschien beter kan maken.

Heeft er iemand misschien nog ideen als toevoeging aan het projectje. Het is de bedoeling dat de strips in de slaapkamer tegen een witte muur komen als indirecte verlichting.

Momenteel maak ik gebruik van een pic 16f819 (had ik nog liggen) 3 x een mosfet irf 530N met wat drukknopen op een breadbordje.

Alvast bedankt.

PS;misschien leuk om straks als het klaar is op de site onder lichteffecten te plaatsen..

DEVICE 16F819
CONFIG HS_OSC,WDT_OFF,BODEN_ON,LVP_OFF,MCLRE_Off, PWRTE_ON, CP_OFF
DECLARE XTAL = 8 ; BIJ GEBRUIK KRISTAL 20MHZ???
ALL_DIGITAL TRUE ; ALLE INGANGEN DIGITAAL

DIM a AS BYTE ; RAMPUP/DOWN VOOR ROOD
DIM b AS BYTE ; RAMPUP/DOWN VOOR GROEN
DIM c AS BYTE ; RAMPUP/DOWN VOOR BLAUW

DIM red AS BYTE ; AAN TIJD ROOD
DIM green AS BYTE ; AAN TIJD GROEN
DIM blue AS BYTE ; AAN TIJD BLAUW

DIM offtime AS BYTE ; UIT TIJD ROOD
DIM offtimegr AS BYTE ; UIT TIJD GROEN
DIM offtimebl AS BYTE ; UIT TIJD BLAUW

SYMBOL pb_red PORTA.0 ; PULSDRUKKER VOOR ROOD
SYMBOL pb_green PORTA.1 ; PULSDRUKKER VOOR GROEN
SYMBOL pb_blue PORTA.2 ; PULSDRUKKER VOOR BLAUW
SYMBOL pb_modus PORTA.3

SYMBOL lred PORTB.4 ; UITGANG LED ROOD
SYMBOL ldgreen PORTB.5 ; UITGANG LED ROOD
SYMBOL ldblue PORTB.6 ; UITGANG LED ROOD

GOTO Loop

WHILE 1 = 1 ; DOE VOOR ALTIJD

Loop:

a = 15 ; RAMP TIJD ROOD
b = 15 ; RAMP TIJD GROEN
c = 15 ; RAMP TIJD BLAUW

IF pb_red = 0 THEN red = red + 1 ; ALS PD ROOS INGEDRUKT DAN VERLENG AAN TIJD ROOD
GOSUB Dimmer1 ; SPRING NAAR SUBROUTINE DIMMER 1
IF red > 254 THEN GOTO loop2 ; ALS ROOD = VOLUIT DAN SPRING NAAR LOOP2

IF pb_green = 0 THEN green = green + 1 ; ZIE ROOD
GOSUB dimmer2
IF green > 254 THEN GOTO loop2

IF pb_blue= 0 THEN blue = blue + 1 ; ZIE ROOD
GOSUB dimmer3
IF blue > 254 THEN GOTO loop2
GOTO Loop

loop2:
; RAMP TIJD ROOD
a = 15 ; RAMP TIJD GROEN
b = 15 ; RAMP TIJD BLAUW
c = 15

IF pb_red = 0 THEN red = red - 1 ; ALS PB ROOD INGEDRUKT DAN VERKORT AAN TIJD ROOD
GOSUB Dimmer1 ; SPRING NAAR SUBROUTINE DIMMER 1
IF red < 1 THEN GOTO Loop ; ALS ROOD = MINIMAAL DAN SPRING NAAR LOOP

IF pb_green = 0 THEN green = green - 1 ; ZIE ROOD
GOSUB dimmer2
IF green < 1 THEN GOTO Loop

IF pb_blue= 0 THEN blue = blue - 1 ; ZIE ROOD
GOSUB dimmer3
IF blue < 1 THEN GOTO Loop
GOTO loop2

Dimmer1: ; SUBROUTINE

HIGH PORTB.4 ; UITGANG ROOD AAN
DELAYUS red ; WACHTTIJD ROOD AAN
LOW PORTB.4 ; UITGANG ROOD UIT
offtime = 255 - red ; WACHTTIJD ROOD UIT
DELAYUS offtime ; AANTAL KEREN DAT SUBROUTINE 1 UITGEVOERD
; WORDT ALVORENS ER WEER NAAR DE PB GEKEKEN WORDT.
a = a - 1
IF a > 0 THEN GOTO Dimmer1
RETURN

dimmer2: ; ZIE ROOD

HIGH PORTB.5
DELAYUS green
LOW PORTB.5
offtimegr = 255 - green
DELAYUS offtimegr
b = b - 1
IF b > 0 THEN GOTO dimmer2
RETURN

dimmer3: ; ZIE ROOD

HIGH PORTB.6
DELAYUS blue
LOW PORTB.6
offtimebl = 255 - blue
DELAYUS offtimebl
c = c - 1
IF c > 0 THEN GOTO dimmer3
RETURN

WEND

END

Xtal moet gewoon op 20 lijkt me.

Drukknopjes vervangen door potmeter/rotary encoders. Is imo makkelijker dan 100x drukken.

Je zou nog allemaal extra's toe kunnen voegen. Langzame kleur overgang oid.

tussen code tags helpt met lezen

Graag Zou ik m.b.v. onderstaande code verder willen gaan maar ik krijg hiermee een alleen wat flikkeringen. Heeft er iemand uitleg over de benodigde instellingen om de interrupt te kunnen laten werken.
Alvast bedankt


DEVICE 16F819 
CONFIG HS_OSC,WDT_OFF,BODEN_ON,LVP_OFF,MCLRE_Off, PWRTE_ON, CP_OFF  
DECLARE XTAL = 20             
ALL_DIGITAL TRUE                ; ALLE INGANGEN DIGITAAL


ALL_DIGITAL TRUE                ; ALLE INGANGEN DIGITAAL
'****************************************************************
'VARIABLES :-
DIM TELLER1  AS BYTE          ; TELLER1 LED 1
DIM TELLER2  AS BYTE          ; TELLER2 LED 2
DIM TELLER3  AS BYTE          ; TELLER3 LED 3
DIM TEMP     AS WORD          ; TIJDELIJKE WORD
DIM VERTR    AS WORD         ; Vertraging
'****************************************************************
'SYMBOL ALIAS'S :-
SYMBOL T0IF = INTCON.2        ; TMR0 Overflow Interrupt Flag
SYMBOL T0IE = INTCON.5        ; TMR0 Overflow Interrupt Enable
SYMBOL GIE  = INTCON.7        ; Global Interrupt Enable

SYMBOL PS0 = OPTION_REG.0      ' Prescaler ratio bit-0 
SYMBOL PS1 = OPTION_REG.1      ' Prescaler ratio bit-1 
SYMBOL PS2 = OPTION_REG.2      ' Prescaler ratio bit-2  
SYMBOL PSA = OPTION_REG.3      ' Prescaler Assignment (1=assigned to WDT 0=assigned to oscillator)  
SYMBOL T0CS = OPTION_REG.5     ' Timer0 Clock Source Select (0=Internal clock 1=External PORTA.4) 

SYMBOL GROEN = PORTB.5        ; PWM uitgang Groene led
SYMBOL BLAUW = PORTB.6        ; PWM uitgang Blauwe led        
SYMBOL ROOD  = PORTB.4        ; PWM uitgang Rood led      

TELLER1 = 1                 ; STARTwaarde 
TELLER2 = 1                 ; STARTwaarde
TELLER3 = 1                 ; STARTwaarde

'****************************************************************
'DATA STATEMENTS ;-
'****************************************************************
'JUMP OVER SUBROUTINES
ON_INTERRUPT GOTO PWM_INT     ; POINT INTERRUPT TO HANDLER

GOTO MAIN
'****************************************************************
'INTERRUPT SUBROUTINE
PWM_INT:
  PWM ROOD,  TELLER1, 2     ; PWM LED1
  PWM GROEN, TELLER2, 2     ; PWM LED2
  PWM BLAUW, TELLER3, 2     ; PWM LED3
T0IF = 0                    ; INTERRUPT RESET
CONTEXT RESTORE 
'****************************************************************
' MAIN PROGRAM :-
MAIN:
;        76543210
TRISB = %00000000
TRISA = %11111111

GIE = 0                          ' Turn off global interrupts 
WHILE GIE = 1: GIE = 0: WEND     ; ZEKER WETEN DAT GIE UIT IS
PSA = 0                         ' Assign the prescaler to external oscillator 
PS0 = 1                         ' Set the prescaler 
PS1 = 1                         ' to increment TMR0 
PS2 = 1                         ' every 256th instruction cycle 
T0CS = 0                        ' Assign TMR0 clock to internal source 
TMR0 = 0                        ' Clear TMR0 initially 
T0IE = 1                        ' Enable TMR0 overflow interrupt 
GIE = 1                         ' Enable global interrupts 

WHILE 1=1

VERTR = 1000                  ; LENGTE DELAY

WHILE TELLER1 < 250
 INC TELLER1
 FOR TEMP = 0 TO VERTR : NEXT  
WEND

WHILE TELLER3 > 1
 DEC TELLER3
 FOR TEMP = 0 TO VERTR : NEXT   ; EXTRA DELAY
WEND

WHILE TELLER2 < 250
 INC TELLER2
 FOR TEMP = 0 TO VERTR : NEXT
WEND 

WHILE TELLER1 > 1
 DEC TELLER1
 FOR TEMP = 0 TO VERTR : NEXT
WEND

WHILE TELLER3 < 250
 INC TELLER3
 FOR TEMP = 0 TO VERTR : NEXT
WEND

WHILE TELLER2 > 1
 DEC TELLER2
 FOR TEMP = 0 TO VERTR : NEXT
WEND

WEND

END                           ;Einde programma