-> mapping to an 1/x like behaviour
[my-code/atmel.git] / beginners / rgb_moritz.asm
index 51e4c32..c3b3984 100644 (file)
@@ -7,20 +7,30 @@
 ; author: hackbard@hackdaworld.org
 
 
-.include "../include/2313def.inc"
+.include "../include/tn2313def.inc"
 
 ; defines & equals
 .def zero = r0
 .def one = r1
+.def two = r2
 .def tmp = r16
 .def count = r17
 .def red = r18
 .def green = r19
 .def blue = r20
 .def rgb_level = r21
+.def rgb_dir = r22
+.def rgb_upd_cnt = r23
+.def r_map = r24
+.def g_map = r25
+.def b_map = r26
 .equ pin_red = 0x01
 .equ pin_green = 0x02
 .equ pin_blue = 0x04
+.equ max = 255
+.equ min = 0
+.equ mid = 170
+.equ rgb_upd = 10
 
 ; interrupt vectors
 ; reset
@@ -34,9 +44,9 @@ reti
 ; timer/counter compare
 reti
 ; timer/counter overflow 1
-rjmp TCO1
-; timer/counter overflow 0
 reti
+; timer/counter overflow 0
+rjmp TCO0
 ; uart rx complete
 reti
 ; uart data register empty
@@ -57,18 +67,20 @@ ldi tmp,low(RAMEND)
 out SPL,tmp
 
 ; timer: clock/8
-ldi tmp,(1<<CS11)
-out TCCR1B,tmp
+ldi tmp,(1<<CS00)
+out TCCR0B,tmp
 
 ; enable timer overflow interrupt
-ldi tmp,(1<<TOIE1)
+ldi tmp,(1<<TOIE0)
 out TIMSK,tmp
 
 ; register values
-ldi tmp,1
-mov one,tmp
 ldi tmp,0
 mov zero,tmp
+ldi tmp,1
+mov one,tmp
+ldi tmp,2
+mov two,tmp
 
 ; port b 0-2 -> output
 ; port b 0-2 -> high
@@ -76,22 +88,57 @@ ldi tmp,0x07
 out DDRB,tmp
 out PORTB,tmp
 
+; uart
+ldi tmp,0
+out UBRRH,tmp
+ldi tmp,25
+out UBRRL,tmp
+ldi tmp,(1<<TXEN)
+out UCSRB,tmp
+ldi tmp,(1<<UCSZ0)|(1<<UCSZ1)
+out UCSRC,tmp
+
 ;
 ; more init
 ;
 
 ; rgb offsets
-mov red,zero
-ldi tmp,85
+ldi tmp,min
+mov red,tmp
+ldi tmp,mid
 mov green,tmp
-ldi tmp,170
+ldi tmp,mid
 mov blue,tmp
 
+; initial mapping intensities of intensities
+ldi ZL,low(INTENSITIES*2)
+ldi ZH,high(INTENSITIES*2)
+add ZL,red
+adc ZH,zero
+lpm r_map,Z
+ldi ZL,low(INTENSITIES*2)
+ldi ZH,high(INTENSITIES*2)
+add ZL,green
+adc ZH,zero
+lpm g_map,Z
+ldi ZL,low(INTENSITIES*2)
+ldi ZH,high(INTENSITIES*2)
+add ZL,blue
+adc ZH,zero
+lpm b_map,Z
+
+; rgb propagation init
+ldi rgb_dir,0x04
+
 ; level init
 ldi rgb_level,0x07
 
 ; init count variable
 mov count,zero
+mov rgb_upd_cnt,zero
+
+; enable interrupts
+sei
 
 ;
 ; main routine
@@ -101,27 +148,97 @@ MAIN:
 
 rjmp MAIN
 
-TCO1:
+TCO0:
 
 cp count,zero
 brne CHECK_RED
+
+; update rgb propagation
+
+cpi rgb_upd_cnt,rgb_upd
+brne POWER_LEDS
+
+; reset counter
+mov rgb_upd_cnt,zero
+
+UPD_R_L:
+cpi red,min
+brne UPD_R_H
+andi rgb_dir,~0x01
+UPD_R_H:
+cpi red,max
+brne UPD_G_L
+ori rgb_dir,0x01
+
+UPD_G_L:
+cpi green,min
+brne UPD_G_H
+andi rgb_dir,~0x02
+UPD_G_H:
+cpi green,max
+brne UPD_B_L
+ori rgb_dir,0x02
+
+UPD_B_L:
+cpi blue,min
+brne UPD_B_H
+andi rgb_dir,~0x04
+UPD_B_H:
+cpi blue,max
+brne INC_RGB
+ori rgb_dir,0x04
+
+; inc rgb values
+INC_RGB:
+sbrc rgb_dir,0
+sub red,two
+add red,one
+sbrc rgb_dir,1
+sub green,two
+add green,one
+sbrc rgb_dir,2
+sub blue,two
+add blue,one
+
+; update mapping
+ldi ZL,low(INTENSITIES*2)
+ldi ZH,high(INTENSITIES*2)
+add ZL,red
+adc ZH,zero
+lpm r_map,Z
+ldi ZL,low(INTENSITIES*2)
+ldi ZH,high(INTENSITIES*2)
+add ZL,green
+adc ZH,zero
+lpm g_map,Z
+ldi ZL,low(INTENSITIES*2)
+ldi ZH,high(INTENSITIES*2)
+add ZL,blue
+adc ZH,zero
+lpm b_map,Z
+
+; power on the leds
+POWER_LEDS:
 mov rgb_level,zero
 
+; increase rgp update counter
+add rgb_upd_cnt,one
+
 CHECK_RED:
 
-cp count,red
+cp count,r_map
 brne CHECK_GREEN
 ori rgb_level,pin_red
 
 CHECK_GREEN:
 
-cp count,green
+cp count,g_map
 brne CHECK_BLUE
 ori rgb_level,pin_green
 
 CHECK_BLUE:
 
-cp count,blue
+cp count,b_map
 brne SET_PORTS
 ori rgb_level,pin_blue
 
@@ -129,5 +246,12 @@ SET_PORTS:
 
 out PORTB,rgb_level
 
+; increase counter
+add count,one
+
 reti
 
+; intensities
+INTENSITIES:
+.include "rgb_moritz_intensities.asm"
+