Sida 1 av 1

RGB LED fader med AVR. Inkl kod

Postat: 12 augusti 2008, 01:56:33
av övrigt
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

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


Postat: 12 augusti 2008, 09:40:43
av MicaelKarlsson
Såg ju snyggt ut!

"vi kan väl kalla den ”pedagogisk”"
Nja, då var det allt lite för lite kommentarer för min smak i alla fall! :)

Postat: 12 augusti 2008, 09:50:45
av Micke_s
Övrigt: student?

Postat: 12 augusti 2008, 11:22:40
av övrigt
yes, pluggar elektroteknik på lunds tekniska högskola.

hehe hurså?

Postat: 12 augusti 2008, 12:04:56
av ElectricMan
Det står "Ort: Lund" på Micke_s ;)

Postat: 12 augusti 2008, 12:06:09
av Micke_s
Och under yrke/sysselsätting: Student 50%/Jobbar 50%

Postat: 21 augusti 2008, 07:58:39
av $tiff
Bra jobbat, övrigt!

Köpte du möjligtvis din AVR någonstans på skolan?
Nu har du klarat en RGB, nästa utmaning måste vara 12 RGB med individuell styrning med en Tiny2313 och utan externa kretsar. Då kan man bygga en färgglad blinkande tomtemössa, som du kan beskåda på några nördiga LTH-studenters huvud varje vintersäsong sedan 2005-isch.

Postat: 23 augusti 2008, 02:40:53
av övrigt
Hej och tack $tiff

Nej jag har inte ens gått med i ETF ännu... ska försöka bättra mig denna terminen :)
Kan ju passa på å fråga, vad brukar ni göra där ni som hänger där? Leker ni bara - som jag i denna tråden - eller tar ni beställningar å sånt också?

Hm, det blir ju en utmaning ja... Attiny har 18I/O pinnar och 12 RGB blir om jag tänker rätt 3*12 = 36 pinnar att styra.

...

6 genensam anod + 6 genensam katod RGB:er kanske? Smart! Det hade jag aldrig kommit på om jag inte fått utmaningen :oops:

Postat: 23 augusti 2008, 08:05:42
av $tiff
Jag tycker absolut att du ska visa dig i ETF och växla några ord med oss en lunch då du har för lite att göra :).
Föreningen är ju till för sådana som dig, som kan bygga på egen hand eller vill lära sig.
Vi leker mest, men även en hel del seriöst. Vi har bäst företagskontakter på skolan i elektronik produktion- & prototyp-området och anordnar seminarier, kurser, auktioner och annat nörd-skoj :)
Men aktivitetsnivån beror ju helt på hur många som vill hjälpa till och dra ett strå till stacken!

HEj

Postat: 11 september 2008, 13:47:46
av mindbraker20
övrigt skrev:yes, pluggar elektroteknik på lunds tekniska högskola.

hehe hurså?
Vilket år är du på. Jag kan inte komma ihåg en Micke.

Detta är Ted E