-> mapping to an 1/x like behaviour
[my-code/atmel.git] / beginners / rgb_moritz.asm
1 ;
2 ; rgb moritz
3 ;
4
5 ; hopefully more improved version of rgb for mali
6
7 ; author: hackbard@hackdaworld.org
8
9
10 .include "../include/tn2313def.inc"
11
12 ; defines & equals
13 .def zero = r0
14 .def one = r1
15 .def two = r2
16 .def tmp = r16
17 .def count = r17
18 .def red = r18
19 .def green = r19
20 .def blue = r20
21 .def rgb_level = r21
22 .def rgb_dir = r22
23 .def rgb_upd_cnt = r23
24 .def r_map = r24
25 .def g_map = r25
26 .def b_map = r26
27 .equ pin_red = 0x01
28 .equ pin_green = 0x02
29 .equ pin_blue = 0x04
30 .equ max = 255
31 .equ min = 0
32 .equ mid = 170
33 .equ rgb_upd = 10
34
35 ; interrupt vectors
36 ; reset
37 rjmp INIT
38 ; int0
39 reti
40 ; int1
41 reti
42 ; timer/counter capt 1
43 reti
44 ; timer/counter compare
45 reti
46 ; timer/counter overflow 1
47 reti
48 ; timer/counter overflow 0
49 rjmp TCO0
50 ; uart rx complete
51 reti
52 ; uart data register empty
53 reti
54 ; uart tx complete
55 reti
56 ; analog comparator
57 reti
58
59 ;
60 ; init routine
61 ;
62
63 INIT:
64
65 ; stack pointer
66 ldi tmp,low(RAMEND)
67 out SPL,tmp
68
69 ; timer: clock/8
70 ldi tmp,(1<<CS00)
71 out TCCR0B,tmp
72
73 ; enable timer overflow interrupt
74 ldi tmp,(1<<TOIE0)
75 out TIMSK,tmp
76
77 ; register values
78 ldi tmp,0
79 mov zero,tmp
80 ldi tmp,1
81 mov one,tmp
82 ldi tmp,2
83 mov two,tmp
84
85 ; port b 0-2 -> output
86 ; port b 0-2 -> high
87 ldi tmp,0x07
88 out DDRB,tmp
89 out PORTB,tmp
90
91 ; uart
92 ldi tmp,0
93 out UBRRH,tmp
94 ldi tmp,25
95 out UBRRL,tmp
96 ldi tmp,(1<<TXEN)
97 out UCSRB,tmp
98 ldi tmp,(1<<UCSZ0)|(1<<UCSZ1)
99 out UCSRC,tmp
100
101 ;
102 ; more init
103 ;
104
105 ; rgb offsets
106 ldi tmp,min
107 mov red,tmp
108 ldi tmp,mid
109 mov green,tmp
110 ldi tmp,mid
111 mov blue,tmp
112
113 ; initial mapping intensities of intensities
114 ldi ZL,low(INTENSITIES*2)
115 ldi ZH,high(INTENSITIES*2)
116 add ZL,red
117 adc ZH,zero
118 lpm r_map,Z
119 ldi ZL,low(INTENSITIES*2)
120 ldi ZH,high(INTENSITIES*2)
121 add ZL,green
122 adc ZH,zero
123 lpm g_map,Z
124 ldi ZL,low(INTENSITIES*2)
125 ldi ZH,high(INTENSITIES*2)
126 add ZL,blue
127 adc ZH,zero
128 lpm b_map,Z
129
130 ; rgb propagation init
131 ldi rgb_dir,0x04
132
133 ; level init
134 ldi rgb_level,0x07
135
136 ; init count variable
137 mov count,zero
138 mov rgb_upd_cnt,zero
139
140 ; enable interrupts
141 sei
142
143 ;
144 ; main routine
145
146
147 MAIN:
148
149 rjmp MAIN
150
151 TCO0:
152
153 cp count,zero
154 brne CHECK_RED
155
156 ; update rgb propagation
157
158 cpi rgb_upd_cnt,rgb_upd
159 brne POWER_LEDS
160
161 ; reset counter
162 mov rgb_upd_cnt,zero
163
164 UPD_R_L:
165 cpi red,min
166 brne UPD_R_H
167 andi rgb_dir,~0x01
168 UPD_R_H:
169 cpi red,max
170 brne UPD_G_L
171 ori rgb_dir,0x01
172
173 UPD_G_L:
174 cpi green,min
175 brne UPD_G_H
176 andi rgb_dir,~0x02
177 UPD_G_H:
178 cpi green,max
179 brne UPD_B_L
180 ori rgb_dir,0x02
181
182 UPD_B_L:
183 cpi blue,min
184 brne UPD_B_H
185 andi rgb_dir,~0x04
186 UPD_B_H:
187 cpi blue,max
188 brne INC_RGB
189 ori rgb_dir,0x04
190
191 ; inc rgb values
192 INC_RGB:
193 sbrc rgb_dir,0
194 sub red,two
195 add red,one
196 sbrc rgb_dir,1
197 sub green,two
198 add green,one
199 sbrc rgb_dir,2
200 sub blue,two
201 add blue,one
202
203 ; update mapping
204 ldi ZL,low(INTENSITIES*2)
205 ldi ZH,high(INTENSITIES*2)
206 add ZL,red
207 adc ZH,zero
208 lpm r_map,Z
209 ldi ZL,low(INTENSITIES*2)
210 ldi ZH,high(INTENSITIES*2)
211 add ZL,green
212 adc ZH,zero
213 lpm g_map,Z
214 ldi ZL,low(INTENSITIES*2)
215 ldi ZH,high(INTENSITIES*2)
216 add ZL,blue
217 adc ZH,zero
218 lpm b_map,Z
219
220 ; power on the leds
221 POWER_LEDS:
222 mov rgb_level,zero
223
224 ; increase rgp update counter
225 add rgb_upd_cnt,one
226
227 CHECK_RED:
228
229 cp count,r_map
230 brne CHECK_GREEN
231 ori rgb_level,pin_red
232
233 CHECK_GREEN:
234
235 cp count,g_map
236 brne CHECK_BLUE
237 ori rgb_level,pin_green
238
239 CHECK_BLUE:
240
241 cp count,b_map
242 brne SET_PORTS
243 ori rgb_level,pin_blue
244
245 SET_PORTS:
246
247 out PORTB,rgb_level
248
249 ; increase counter
250 add count,one
251
252 reti
253
254 ; intensities
255 INTENSITIES:
256 .include "rgb_moritz_intensities.asm"
257