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