final version (before xmas)
[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 .equ pin_red = 0x01
25 .equ pin_green = 0x02
26 .equ pin_blue = 0x04
27 .equ max = 255
28 .equ min = 0
29 .equ mid = 170
30 .equ rgb_upd = 10
31
32 ; interrupt vectors
33 ; reset
34 rjmp INIT
35 ; int0
36 reti
37 ; int1
38 reti
39 ; timer/counter capt 1
40 reti
41 ; timer/counter compare
42 reti
43 ; timer/counter overflow 1
44 reti
45 ; timer/counter overflow 0
46 rjmp TCO0
47 ; uart rx complete
48 reti
49 ; uart data register empty
50 reti
51 ; uart tx complete
52 reti
53 ; analog comparator
54 reti
55
56 ;
57 ; init routine
58 ;
59
60 INIT:
61
62 ; stack pointer
63 ldi tmp,low(RAMEND)
64 out SPL,tmp
65
66 ; timer: clock/8
67 ldi tmp,(1<<CS00)
68 out TCCR0B,tmp
69
70 ; enable timer overflow interrupt
71 ldi tmp,(1<<TOIE0)
72 out TIMSK,tmp
73
74 ; register values
75 ldi tmp,0
76 mov zero,tmp
77 ldi tmp,1
78 mov one,tmp
79 ldi tmp,2
80 mov two,tmp
81
82 ; port b 0-2 -> output
83 ; port b 0-2 -> high
84 ldi tmp,0x07
85 out DDRB,tmp
86 out PORTB,tmp
87
88 ; uart
89 ldi tmp,0
90 out UBRRH,tmp
91 ldi tmp,25
92 out UBRRL,tmp
93 ldi tmp,(1<<TXEN)
94 out UCSRB,tmp
95 ldi tmp,(1<<UCSZ0)|(1<<UCSZ1)
96 out UCSRC,tmp
97
98 ;
99 ; more init
100 ;
101
102 ; rgb offsets
103 ldi tmp,min
104 mov red,tmp
105 ldi tmp,mid
106 mov green,tmp
107 ldi tmp,mid
108 mov blue,tmp
109
110 ; rgb propagation init
111 ldi rgb_dir,0x04
112
113 ; level init
114 ldi rgb_level,0x07
115
116 ; init count variable
117 mov count,zero
118 mov rgb_upd_cnt,zero
119
120 ; enable interrupts
121 sei
122
123 ;
124 ; main routine
125
126
127 MAIN:
128
129 rjmp MAIN
130
131 TCO0:
132
133 cp count,zero
134 brne CHECK_RED
135
136 ; update rgb propagation
137
138 cpi rgb_upd_cnt,rgb_upd
139 brne POWER_LEDS
140
141 ; reset counter
142 mov rgb_upd_cnt,zero
143
144 UPD_R_L:
145 cpi red,min
146 brne UPD_R_H
147 andi rgb_dir,~0x01
148 UPD_R_H:
149 cpi red,max
150 brne UPD_G_L
151 ori rgb_dir,0x01
152
153 UPD_G_L:
154 cpi green,min
155 brne UPD_G_H
156 andi rgb_dir,~0x02
157 UPD_G_H:
158 cpi green,max
159 brne UPD_B_L
160 ori rgb_dir,0x02
161
162 UPD_B_L:
163 cpi blue,min
164 brne UPD_B_H
165 andi rgb_dir,~0x04
166 UPD_B_H:
167 cpi blue,max
168 brne INC_RGB
169 ori rgb_dir,0x04
170
171 ; inc rgb values
172 INC_RGB:
173 sbrc rgb_dir,0
174 sub red,two
175 add red,one
176 sbrc rgb_dir,1
177 sub green,two
178 add green,one
179 sbrc rgb_dir,2
180 sub blue,two
181 add blue,one
182
183 ; power on the leds
184 POWER_LEDS:
185 mov rgb_level,zero
186
187 ; increase rgp update counter
188 add rgb_upd_cnt,one
189
190 CHECK_RED:
191
192 cp count,red
193 brne CHECK_GREEN
194 ori rgb_level,pin_red
195
196 CHECK_GREEN:
197
198 cp count,green
199 brne CHECK_BLUE
200 ori rgb_level,pin_green
201
202 CHECK_BLUE:
203
204 cp count,blue
205 brne SET_PORTS
206 ori rgb_level,pin_blue
207
208 SET_PORTS:
209
210 out PORTB,rgb_level
211
212 ; increase counter
213 add count,one
214
215 reti
216