corrected careless mistake
[my-code/atmel.git] / beginners / light_control.asm
1 ;
2 ; control the light connected to the pwm output pins
3 ;
4 ; author: hackbard@hackdaworld.org
5 ;
6
7 ; specify device
8 .include "../include/2313def.inc"
9
10 ; for register/bit definitions compatibility
11 .include "./s90_to_tiny.inc"
12
13 ; ------------------
14 ; interrupt vectors:
15 ; ------------------
16
17 ; reset
18 rjmp INIT
19 ; int0
20 rjmp INT_ROUTINE
21 ; int1
22 reti
23 ; timer 1 capture
24 reti
25 ; timer 1 compare
26 reti
27 ; timer 1 overflow
28 reti
29 ; timer 0 overflow
30 reti
31 ; usart rx complete
32 rjmp UART_RX
33 ; usart data register empty
34 reti
35 ; usart tx complete
36 reti
37 ; analog comperator
38 reti
39 ; pin change interrupt
40 reti
41 ; timer/counter 1 compare match b
42 reti
43 ; timer/counter 0 compare match a
44 reti
45 ; timer/counter 0 compare match b
46 reti
47 ; usi start condition
48 reti
49 ; usi overflow
50 reti
51 ; eeprom ready
52 reti
53 ; watchdog timer overflow
54 reti
55
56 ; -----
57 ; code:
58 ; -----
59
60 INIT:
61         ; set stackpointer
62         ldi r16,low(RAMEND)     ; write top of ramend (lowbyte)
63         out SPL,r16             ; to stackpointer
64
65         ; rs232 init
66         ldi r16,0
67         out UBRRH,r16
68         ldi r16,12      ; "38.4k bps @ 8 mhz" / "4.8k bps @ 1 mhz"
69         out UBRRL,r16   ; write to uart baudrate register
70         ldi r16,(1<<RXEN)|(1<<TXEN)|(1<<RXCIE)  ; enable rx/tx + rx interrupt
71         out UCSRB,r16   ; write to uart control register
72
73         ; int0
74         ldi r16,(1<<PD2)        ; int0 input
75         out DDRD,r16
76         ldi r16,(1<<PD2)        ; int0 pull-up
77         out PORTD,r16
78         ldi r16,0               ; interrupt on low level of int0
79         out MCUCR,r16
80         ldi r16,(1<<INT0)       ; ir enable
81         out GIMSK,r16
82
83         ; port config
84         ldi r16,0               ; output
85         out DDRB,r16
86         ldi r16,0xff            ; pull high
87         out PORTB,r16
88
89         ; some initial values
90         ldi r20,0
91         ldi r17,0xff
92         ldi r25,0x4c
93
94         ; global interrupt enable
95         sei
96
97 MAIN:
98         out PORTB,r17
99         
100         rjmp MAIN
101
102
103 UART_RX:
104         in r29,UDR
105         UART_OUT:
106                 sbis UCSRA,UDRE
107                 rjmp UART_OUT
108                 out UDR,r29
109         reti
110
111
112 INT_ROUTINE:
113         ldi r16,0               ; disable int0
114         out GIMSK,r16
115         cpi r17,0xff            ; toggle light
116         breq TURN_ON
117         TURN_OFF:
118                 ldi r17,0xff    ; turn off light
119                 ldi r25,0x44    ; D
120                 rjmp CONTINUE
121         TURN_ON:
122                 ldi r17,0       ; turn on light
123                 ldi r25,0x4c    ; L
124         CONTINUE:
125                 out PORTB,r17
126                 sbis UCSRA,UDRE
127                 rjmp CONTINUE
128                 out UDR,r25
129         ldi r20,0
130         WAIT:
131                 ldi r21,0
132                 WAIT_II:
133                         inc r21
134                         cpi r21,0xff
135                         brne WAIT_II
136                 inc r20
137                 cpi r20,0xff
138                 brne WAIT
139
140         ldi r16,(1<<INT0) ; (re)activate int0
141         out GIMSK,r16
142
143         reti
144                 
145 ; eof