added rgb_mali asm code
[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 R = r19
21 .def G = r20
22 .def B = 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 reti
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 ; enable uart + rx complete interrupt
67 ldi tmp,51 ; 9600 baud, 0,2% error @ 8mhz
68 out UBRR,tmp
69 ldi tmp,((1<<RXCIE)|(1<<RXEN))
70 out UCR,tmp
71 ; init registers
72 ldi tmp,1
73 mov one,tmp
74 ldi tmp,0
75 mov zero,tmp
76 ldi uart_count,0
77 ldi count,0
78 ldi R,0xff
79 ldi G,0xff
80 ldi B,0xff
81 ; led pins are outputs
82 ldi tmp,((1<<LED_R)|(1<<LED_G)|(1<<LED_B))
83 out DDRD,tmp
84 ; enable interrupts (global=
85 sei
86 ; jump to main
87 rjmp MAIN
88
89 ;
90 ; main routine
91 ;
92 MAIN:
93 ; jumpt to main loop
94 rjmp LOOP
95
96 :
97 ; main loop
98 ;
99 LOOP:
100 ; reset lights if loop starts 
101 cpi count,0
102 breq RESET_LEDS
103 ; now check leds
104 rjmp CHECK_RED
105
106 ;
107 ; reset leds
108 ;
109 ldi OUTR,((1<<LED_R)|(1<<LED_G)|(LED_B))
110 add count,one
111 ret
112
113 ;
114 ; check red + jump to green check
115 ;
116 CHECK_RED:
117 cp count,R
118 breq SWITCH_OFF_R
119 rjmp CHECK_GREEN
120
121 ;
122 ; switch of red led
123 ;
124 SWITCH_OFF_R:
125 subi OUTR,(1<<LED_R)
126 rjmp CHECK_GREEN
127
128 ;
129 ; check green + jump to blue check
130 ;
131 CHECK_GREEN:
132 cp count,G
133 breq SWITCH_OFF_G
134 rjmp CHECK_BLUE
135
136 ;
137 ; switch of green led
138 ;
139 SWITCH_OFF_G:
140 subi OUTR,(1<<LED_G)
141 rjmp CHECK_BLUE
142
143 ;
144 ; check blue + "do the light"
145 ;
146 CHECK_BLUE:
147 cp count,B
148 breq SWITCH_OFF_B
149 rjmp LIGHT
150
151 ;
152 ; switch of blue led
153 ;
154 SWITCH_OFF_G:
155 sub OUTR,(1<<LED_B)
156 rjmp LIGHT
157
158 ;
159 ; light it up
160 ;
161 LIGHT:
162 ldi FULLR,0xff
163 sub FULLR,OUTR
164 out LED_PORT,FULLR
165
166 rjmp INC_COUNT
167
168 ;
169 ; increase counter + jump back to main loop
170 ;
171 add counter,one
172 rjmp LOOP
173
174 ;
175 ; receive from uart
176 ;
177 UART_RECEIVE:
178 reti
179