RGB LED fader med AVR. Inkl kod
Postat: 12 augusti 2008, 01:56:33
Tänkte presentera ett litet projekt som jag slängde ihop och som blev långt häftigare än vad jag trott. Det är en AVR ATtiny2313 som driver en rgb lysdiod och låter den mjukt ändra mellan olika färger. En till tänker ni, men jag slänger med källkoden ifall nån vill bygga sig en sån själv. Programmet är skrivet pss att övergångarna känns naturliga. Låter flummigt men se koden så förstår ni vad jag menar. En helt lineär ändring av pulskvoten gav inte speciellt snygga övergångar.
En liten film på resultatet, ser verkligen mycket bättre ut i verkligheten!
Gör man en egen så kanske man vill lägga ner lite mer tid på arrangemanget än vad jag gjort på filmen, precis som jag tänker göra senare
. Sen är ju inte koden den snyggaste, vi kan väl kalla den pedagogisk
.
Mvh
En liten film på resultatet, ser verkligen mycket bättre ut i verkligheten!
Gör man en egen så kanske man vill lägga ner lite mer tid på arrangemanget än vad jag gjort på filmen, precis som jag tänker göra senare


Mvh
Kod: Markera allt
;***** A nicer looking way to fade eg a rgb LED. (rkbg)
;Couple a common cathode RGB LED on PD0..2.
;Change speed with RESOLUTION_PWM and decide a pattern in MAIN.
;Clk = 8MHz.
;For ATtiny2313.
.include "2313def.inc"
.def OutBin =r16
.def Temp = r17
.def Temp2 = r18
.def Temp3 =r19
.def DLY_HIGH_0 = r20
.def DLY_HIGH_1 = r21
.def DLY_HIGH_2 = r22
.equ RESOLUTION_PWM = 170 ;Sets both speed and resolution.
.cseg
.org 0x13
RESET:
;ldi OutBin,0b00000111
;out DDRB,OutBin
ldi OutBin,0b00000111
out DDRD,OutBin
ldi Temp2, low(RAMEND)
out SPL, Temp2
rcall SET_ALL_LOW
rcall FADE_0_UP
;********************************************************************
;********************************************************************
MAIN:
rcall FADE_1_UP
rcall FADE_0_DOWN
rcall FADE_2_UP
rcall FADE_1_DOWN
rcall FADE_0_UP
rcall FADE_2_DOWN
rcall FADE_1_UP
rcall FADE_2_UP
rcall FADE_0_DOWN
rcall FADE_1_DOWN
rcall FADE_0_UP
rcall FADE_2_DOWN
rjmp Main
;********************************************************************
;*************************** Subroutines ****************************
;May as always destroy Temp registers.
;******************************************************************** 0
MAKE_CYCLE_0:
;Makes one "flat" cycle on PD0 with argument in DLY_HIGH_0.
;Complete version.
push Temp2
mov Temp2,DLY_HIGH_0
com Temp2
MAKE_CYCLE_0_RET_T:
push DLY_HIGH_0
push Temp
ldi Temp,RESOLUTION_PWM
in OutBin,PORTD
;com OutBin
ori OutBin,0b00000001
MAKE_CYCLE_0_RET:
cpi DLY_HIGH_0,0
brne LAT1_0
andi OutBin,0b00000110
LAT1_0:
dec DLY_HIGH_0
;rcall PWM_DLY
;com OutBin
out PORTD,OutBin
;com OutBin
dec Temp
brne MAKE_CYCLE_0_RET
pop Temp
pop DLY_HIGH_0
dec Temp2
brne MAKE_CYCLE_0_RET_T
pop Temp2
ret
;******************************************************************** 1
MAKE_CYCLE_1:
;Makes one "flat" cycle on PD1 with argument in DLY_HIGH_1.
;Complete version.
push Temp2
mov Temp2,DLY_HIGH_1
com Temp2
MAKE_CYCLE_1_RET_T:
push DLY_HIGH_1
push Temp
ldi Temp,RESOLUTION_PWM
in OutBin,PORTD
;com OutBin
ori OutBin,0b00000010
MAKE_CYCLE_1_RET:
cpi DLY_HIGH_1,0
brne LAT1_1
andi OutBin,0b00000101
LAT1_1:
dec DLY_HIGH_1
;rcall PWM_DLY
;com OutBin
out PORTD,OutBin
;com OutBin
dec Temp
brne MAKE_CYCLE_1_RET
pop Temp
pop DLY_HIGH_1
dec Temp2
brne MAKE_CYCLE_1_RET_T
pop Temp2
ret
;******************************************************************** 2
MAKE_CYCLE_2:
;Makes one "flat" cycle on PD2 with argument in DLY_HIGH_2.
;Complete version.
push Temp2
mov Temp2,DLY_HIGH_2
com Temp2
MAKE_CYCLE_2_RET_T:
push DLY_HIGH_2
push Temp
ldi Temp,RESOLUTION_PWM
in OutBin,PORTD
;com OutBin
ori OutBin,0b00000100
MAKE_CYCLE_2_RET:
cpi DLY_HIGH_2,0
brne LAT1_2
andi OutBin,0b00000011
LAT1_2:
dec DLY_HIGH_2
;rcall PWM_DLY
;com OutBin
out PORTD,OutBin
;com OutBin
dec Temp
brne MAKE_CYCLE_2_RET
pop Temp
pop DLY_HIGH_2
dec Temp2
brne MAKE_CYCLE_2_RET_T
pop Temp2
ret
;********************************************************************
SET_ALL_LOW:
ldi DLY_HIGH_0,0x00
ldi DLY_HIGH_1,0x00
ldi DLY_HIGH_2,0x00
ret
FADE_0_UP:
cpi DLY_HIGH_0,RESOLUTION_PWM
breq L2
inc DLY_HIGH_0
rcall MAKE_CYCLE_0
rjmp FADE_0_UP
L2:
ret
FADE_1_UP:
cpi DLY_HIGH_1,RESOLUTION_PWM
breq L3
inc DLY_HIGH_1
rcall MAKE_CYCLE_1
rjmp FADE_1_UP
L3:
ret
FADE_2_UP:
cpi DLY_HIGH_2,RESOLUTION_PWM
breq L4
inc DLY_HIGH_2
rcall MAKE_CYCLE_2
rjmp FADE_2_UP
L4:
ret
FADE_0_DOWN:
cpi DLY_HIGH_0,0
breq L5
dec DLY_HIGH_0
rcall MAKE_CYCLE_0
rjmp FADE_0_DOWN
L5:
rcall MAKE_CYCLE_0
ret
FADE_1_DOWN:
cpi DLY_HIGH_1,0
breq L6
dec DLY_HIGH_1
rcall MAKE_CYCLE_1
rjmp FADE_1_DOWN
L6:
rcall MAKE_CYCLE_1
ret
FADE_2_DOWN:
cpi DLY_HIGH_2,0
breq L7
dec DLY_HIGH_2
rcall MAKE_CYCLE_2
rjmp FADE_2_DOWN
L7:
rcall MAKE_CYCLE_2
ret
;***************************** Delay routines ***********************
PWM_DLY:
push Temp2
ldi Temp2,0x10
PWM_DLY_T:
dec Temp2
brne PWM_DLY_T
pop Temp2
ret
TEMP_DLY:
push Temp
push Temp2
ser Temp
ldi Temp2,6
TEMP_DLY_RET:
dec Temp
brne TEMP_DLY_RET
dec Temp2
brne TEMP_DLY_RET
pop Temp2
pop Temp
ret