;COLOR MAGIC MOOD LIGHT
;(C) 2004 Markus Vohburger
;Gewerbliche Nutzung untersagt

.include "tn12def.inc"


.equ EE_OSCCAL =$3f
.equ EE_SPEED0 =$00
.equ EE_SPEED1 =$01
.equ EE_SPEED2 =$02


.def speed0 = r02
.def speed1 = r03
.def speed2 = r04





.def temp1 = r16
.def swcount0 = r17
.def swcount1 = r18
.def swcount2 = r19

.def output = r20

.def pwmcount = r21
.def pwmvalue_red = r22
.def pwmvalue_green = r23
.def pwmvalue_blue = r24
.def director = r25
.def pwmvalue = r27
.def dirty = r28
.def swcount3 = r29
.def colorselect = r30
.def temp2 = r31








.equ timer_value = $d0

;reset handler
.org $0000
rjmp main


;timer overflow interrut handler
.org OVF0Addr
rjmp OVF0Handler

.org $0010
main:

;stack setup



;read osccal byte

ldi temp1,EE_OSCCAL
rcall readeeprom
out osccal,temp1



;port setup

;port b input with pullups

ldi temp1,$07
out ddrb,temp1


;port b output off, pullups on
ldi temp1,$1f
out portb,temp1

setstatus:
sbic eecr,eewe
rjmp setstatus
ldi temp1,$03
out eear,temp1
sbi eecr,eere
in temp1,eedr

cpi temp1,$00
breq ok
cpi temp1,$07
breq ok
ldi temp1,$07

ok:
out ddrb,temp1




;Toggle Power On Mode
sbis pinb,4
rjmp toggle

sbic pinb,3
rjmp notoggle

toggle:

ldi temp2,$00
ldi temp1,EE_SPEED0
rcall writeeeprom

ldi temp1,EE_SPEED1
rcall writeeeprom
ldi temp1,EE_SPEED2
rcall writeeeprom



;neuen status schreiben
writeok:








notoggle:
;Timer zurücksetzen
ldi temp1,timer_value
out tcnt0,temp1


;Timer interrupts an
ldi temp1,(1<<toie0)
out timsk,temp1


;Timer starten, clck/8 
ldi temp1,$04
out tccr0,temp1


ldi swcount0, $00
ldi swcount1, $00
ldi swcount2, $00
ldi swcount3, $00

ldi pwmvalue_red,$00
ldi pwmvalue_green,$00
ldi pwmvalue_blue,$00
ldi colorselect,$00



ldi pwmcount,$00



ldi director,$00
ldi dirty,$00

ldi temp1,EE_SPEED0
rcall readeeprom
andi temp1,$07
mov speed0,temp1


ldi temp1,EE_SPEED1
rcall readeeprom
andi temp1,$07
mov speed1,temp1

ldi temp1,EE_SPEED2
rcall readeeprom
andi temp1,$07
mov speed2,temp1


sei



loop:

;leds aus
ldi output,$1f

cp pwmvalue_red,pwmcount
brsh check_green
;leds an
cbr output,$01


check_green:
cp pwmvalue_green,pwmcount
brsh check_blue
;leds an
cbr output,$02

check_blue:
cp pwmvalue_blue,pwmcount
brsh writeoutput
;leds an
cbr output,$04


writeoutput:
out portb,output
inc pwmcount
rjmp loop





OVF0Handler:
in r1,sreg



inc swcount0
cp swcount0,speed0
brlo end_change_red
ldi swcount0,$00


sbrc director,$00
rjmp do_red_inc

dec pwmvalue_red
cpi pwmvalue_red,$00
brne end_change_red
sbr director,$01
rjmp end_change_red


do_red_inc:
inc pwmvalue_red
cpi pwmvalue_red,$ff
brne end_change_red
cbr director,$01

end_change_red:


inc swcount1
cp swcount1,speed1
brlo end_change_green
ldi swcount1,$00


sbrc director,$01
rjmp do_green_inc

dec pwmvalue_green
cpi pwmvalue_green,$00
brne end_change_green
sbr director,$02
rjmp end_change_green


do_green_inc:
inc pwmvalue_green
cpi pwmvalue_green,$ff
brne end_change_green
cbr director,$02
end_change_green:

inc swcount2
cp swcount2,speed2
brlo end_change_blue
ldi swcount2,$00


sbrc director,$02
rjmp do_blue_inc

dec pwmvalue_blue
cpi pwmvalue_blue,$00
brne end_change_blue
sbr director,$04
rjmp end_change_blue


do_blue_inc:
inc pwmvalue_blue
cpi pwmvalue_blue,$ff
brne end_change_blue
cbr director,$04

end_change_blue:



sbis pinb,3
rjmp pressedhandler
sbis pinb,4 
rjmp pressedhandler


cpi swcount3,$80
brsh writesettings

cpi swcount3,$20
brsh colorselect

cpi swcount3,$05
brlo releasehandler


cpi colorselect,$00
brne testgb

mov temp1,speed0
inc temp1
andi temp1,$07
mov speed0,temp1
rjmp releasehandler

testgb:

cpi colorselect,$01
brne testb

mov temp1,speed1
inc temp1
andi temp1,$07
mov speed1,temp1
rjmp releasehandler

testb:
mov temp1,speed2
inc temp1
andi temp1,$07
mov speed2,temp1
rjmp releasehandler



releasehandler:
ldi swcount3,$00

exit_ovf0Handler:

ldi temp1,timer_value
out tcnt0,temp1
out sreg,r1
reti


pressedhandler:
cpi swcount3,$80
brsh exit_ovf0handler
inc swcount3
rjmp exit_ovf0Handler

colorselect:
inc colorselect
cpi colorselect,$03
brne nocolorrollover
ldi colorselect,$00
nocolorrollover:
ldi temp1,0b00011110
cpi colorselect,$00
breq docolorselect
ldi temp1,0b00011101
cpi colorselect,$01
breq docolorselect
ldi temp1,0b00011011


docolorselect:
out portb,temp1

ldi temp1,$00
ldi temp2,$00
delay:
nop
nop
nop
nop
nop
dec temp1
brne delay
dec temp2
brne delay


rjmp releasehandler

writesettings:
ldi temp1,EE_SPEED0
mov temp2,speed0
rcall writeeeprom

ldi temp1,EE_SPEED1
mov temp2,speed1
rcall writeeeprom

ldi temp1,EE_SPEED2
mov temp2,speed2
rcall writeeeprom


rjmp releasehandler










;lese byte aus EEprom, adresse in temp1, gelesener wert ebenfalls in temp1
readeeprom:

sbic eecr,eewe
rjmp waitstable_readeeprom

out eear,temp1
waitstable_readeeprom:

sbi eecr,eere
in temp1,eedr
ret



writeeeprom:
sbic eecr,eewe
rjmp writeeeprom

out eear,temp1
out eedr,temp2
sbi eecr,eemwe
sbi eecr,eewe
ret








