ca83557f4ac48bc292a193be862112fd5d91beb4
[my-code/atmel.git] / beginners / rgb_mali.asm
1 ; rgb_mali.asm
2 ;
3 ; 3 leds (red, green, blue) on different ports.
4 ; cm mode: continuous mixed colors
5 ; rgb mode: keep one special color
6 ;
7 ; modes switchable by uart
8 ;
9 ; author: hackbard@hackdaworld.dyndns.org
10
11
12 .include "../include/2313def.inc"
13
14 ; defines & equals
15 .def zero = r0
16 .def one = r1
17 .def tmp = r16
18 .def uart_count = r17
19 .def count = r18
20 .def RED = r19
21 .def GREEN = r20
22 .def BLUE = r21
23 .def mode = r22
24 .equ cm = 0
25 .equ rgb = 1
26 .def OUTR = r23
27 .def FULLR = r24
28 .equ LED_R = PD2
29 .equ LED_G = PD3
30 .equ LED_B = PD4
31 .equ LED_PORT = PORTD
32
33 ;
34 ; interrupt voctors
35 ;
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 rjmp INC_RGB
48 ; timer/counter overflow 0
49 reti
50 ; uart rx complete
51 rjmp UART_RECEIVE
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 INIT:
63 ; alloc stack pointer
64 ldi r16,low(RAMEND)
65 out SPL,r16
66 ; timer: clock/1024
67 ldi tmp,((1<<CS11))
68 out TCCR1B,tmp
69 ; enable timer overflow interrupt
70 ldi tmp,(1<<TOIE1)
71 out TIMSK,tmp
72 ; enable uart + rx complete interrupt
73 ldi tmp,51 ; 9600 baud, 0,2% error @ 8mhz
74 out UBRR,tmp
75 ldi tmp,((1<<RXCIE)|(1<<RXEN))
76 out UCR,tmp
77 ; init registers
78 ldi tmp,1
79 mov one,tmp
80 ldi tmp,0
81 mov zero,tmp
82 ldi uart_count,0
83 ldi count,0
84 ldi RED,0x22
85 ldi GREEN,0x77
86 ldi BLUE,0xff
87 ; led pins are outputs
88 ldi tmp,((1<<LED_R)|(1<<LED_G)|(1<<LED_B))
89 out DDRD,tmp
90 ; enable interrupts (global)
91 sei
92 ; jump to main
93 rjmp MAIN
94
95 ;
96 ; increase rgb values
97 ;
98 INC_RGB:
99 add RED,one
100 add BLUE,one
101 add GREEN,one
102 reti
103
104 ;
105 ; main routine
106 ;
107 MAIN:
108 ; jumpt to main loop
109 rjmp LOOP
110
111 :
112 ; main loop
113 ;
114 LOOP:
115 ; reset lights if loop starts 
116 cpi count,0
117 breq RESET_LEDS
118 ; now check leds
119 rjmp CHECK_RED
120
121 ;
122 ; reset leds
123 ;
124 RESET_LEDS:
125 ldi OUTR,((1<<LED_R)|(1<<LED_G)|(LED_B))
126 rjmp CHECK_RED
127
128 ;
129 ; check red + jump to green check
130 ;
131 CHECK_RED:
132 cp count,RED
133 breq SWITCH_OFF_R
134 rjmp CHECK_GREEN
135
136 ;
137 ; switch of red led
138 ;
139 SWITCH_OFF_R:
140 subi OUTR,(1<<LED_R)
141 rjmp CHECK_GREEN
142
143 ;
144 ; check green + jump to blue check
145 ;
146 CHECK_GREEN:
147 cp count,GREEN
148 breq SWITCH_OFF_G
149 rjmp CHECK_BLUE
150
151 ;
152 ; switch of green led
153 ;
154 SWITCH_OFF_G:
155 subi OUTR,(1<<LED_G)
156 rjmp CHECK_BLUE
157
158 ;
159 ; check blue + "do the light"
160 ;
161 CHECK_BLUE:
162 cp count,BLUE
163 breq SWITCH_OFF_B
164 rjmp LIGHT
165
166 ;
167 ; switch of blue led
168 ;
169 SWITCH_OFF_B:
170 subi OUTR,(1<<LED_B)
171 rjmp LIGHT
172
173 ;
174 ; light it up
175 ;
176 LIGHT:
177 ldi FULLR,0xff
178 eor FULLR,OUTR
179 out LED_PORT,FULLR
180 rjmp INC_COUNT
181
182 ;
183 ; increase counter + jump back to main loop
184 ;
185 INC_COUNT:
186 add count,one
187 rjmp LOOP
188
189 ;
190 ; receive from uart
191 ;
192 UART_RECEIVE:
193 reti
194