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