mirror of
1
0
Fork 0
avr_demo/button_debounce/main.lst

553 lines
21 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

1 .file "main.c"
2 __SREG__ = 0x3f
3 __SP_H__ = 0x3e
4 __SP_L__ = 0x3d
5 __tmp_reg__ = 0
6 __zero_reg__ = 1
7 .global __do_copy_data
8 .global __do_clear_bss
9 .text
10 .Ltext0:
11 .global digital_read
13 digital_read:
14 .LFB6:
15 .file 1 "main.c"
1:main.c **** /*
2:main.c **** * Button with debouncing. Based on the Arduino example but without
3:main.c **** * Arduino libraries.
4:main.c **** *
5:main.c **** * http://www.arduino.cc/en/Tutorial/Debounce
6:main.c **** *
7:main.c **** * To compile and upload run: make clean; make; make program;
8:main.c **** *
9:main.c **** * Copyright 2011 Mika Tuupola
10:main.c **** *
11:main.c **** * Licensed under the MIT license:
12:main.c **** * http://www.opensource.org/licenses/mit-license.php
13:main.c **** *
14:main.c **** */
15:main.c ****
16:main.c ****
17:main.c **** #ifndef F_CPU
18:main.c **** #define F_CPU 16000000UL
19:main.c **** #endif
20:main.c ****
21:main.c **** #include <stdlib.h>
22:main.c **** #include <avr/io.h>
23:main.c **** #include <stdio.h>
24:main.c **** #include <util/delay.h>
25:main.c **** #include <stdint.h>
26:main.c **** #include <avr/sfr_defs.h>
27:main.c ****
28:main.c **** #include "main.h"
29:main.c **** #include "uart.h"
30:main.c **** #include "timer.h"
31:main.c ****
32:main.c **** void init(void) {
33:main.c ****
34:main.c **** /* Make PORTD2 (Arduino digital 2) input by clearing bit in DDR */
35:main.c **** DDRD &= ~(_BV(PORTD2));
36:main.c ****
37:main.c **** /* In input mode, when pull-up is enabled, default state of pin becomes 1. So even if */
38:main.c **** /* you dont connect anything to pin and if you try to read it, it will read as 1. Now, */
39:main.c **** /* when you externally drive that pin to zero(i.e. connect to ground / or pull-down), */
40:main.c **** /* only then it will be read as 0. */
41:main.c ****
42:main.c **** /* Enable pullups by setting bits in PORT. Default state is now high. */
43:main.c **** PORTD |= (_BV(PORTD2));
44:main.c ****
45:main.c **** /* Make PORTB5 (Arduino digital 13) an output by setting bit in DDR. */
46:main.c **** DDRB |= _BV(PORTB5);
47:main.c ****
48:main.c **** }
49:main.c ****
50:main.c **** uint8_t digital_read(int input_register, int pin) {
16 .loc 1 50 0
17 .LVL0:
18 0000 CF93 push r28
19 .LCFI0:
20 0002 DF93 push r29
21 .LCFI1:
22 0004 00D0 rcall .
23 .LCFI2:
24 0006 CDB7 in r28,__SP_L__
25 0008 DEB7 in r29,__SP_H__
26 .LCFI3:
27 /* prologue: function */
28 /* frame size = 2 */
29 /* stack size = 4 */
30 .L__stack_usage = 4
31 000a 9A83 std Y+2,r25
32 000c 8983 std Y+1,r24
51:main.c **** return bit_is_set(input_register, pin) != 0 ? 1 : 0;
33 .loc 1 51 0
34 000e 8981 ldd r24,Y+1
35 .LVL1:
36 0010 90E0 ldi r25,lo8(0)
37 0012 00C0 rjmp 2f
38 0014 9595 1: asr r25
39 0016 8795 ror r24
40 0018 6A95 2: dec r22
41 001a 02F4 brpl 1b
52:main.c **** }
42 .loc 1 52 0
43 001c 8170 andi r24,lo8(1)
44 /* epilogue start */
45 001e 0F90 pop __tmp_reg__
46 0020 0F90 pop __tmp_reg__
47 0022 DF91 pop r29
48 0024 CF91 pop r28
49 0026 0895 ret
50 .LFE6:
52 .global digital_write
54 digital_write:
55 .LFB7:
53:main.c ****
54:main.c **** /* You could use cbi ie &= ~ or sbi ie |= but this makes code more readable. */
55:main.c **** void digital_write(volatile uint8_t *data_port, uint8_t pin, uint8_t value) {
56 .loc 1 55 0
57 .LVL2:
58 /* prologue: function */
59 /* frame size = 0 */
60 /* stack size = 0 */
61 .L__stack_usage = 0
62 0028 FC01 movw r30,r24
56:main.c **** if (0 == value) {
57:main.c **** *data_port &= ~(_BV(pin));
63 .loc 1 57 0
64 002a 2081 ld r18,Z
65 002c 81E0 ldi r24,lo8(1)
66 002e 90E0 ldi r25,hi8(1)
67 .LVL3:
68 0030 00C0 rjmp 2f
69 0032 880F 1: lsl r24
70 0034 991F rol r25
71 0036 6A95 2: dec r22
72 0038 02F4 brpl 1b
56:main.c **** if (0 == value) {
73 .loc 1 56 0
74 003a 4423 tst r20
75 003c 01F4 brne .L3
76 .loc 1 57 0
77 003e 8095 com r24
78 0040 8223 and r24,r18
79 0042 8083 st Z,r24
80 0044 0895 ret
81 .L3:
58:main.c **** } else {
59:main.c **** *data_port |= _BV(pin);
82 .loc 1 59 0
83 0046 282B or r18,r24
84 0048 2083 st Z,r18
85 004a 0895 ret
86 .LFE7:
88 .data
89 .LC0:
90 0000 2D20 5265 .string "- Reading toggled %d (%d)\n"
90 6164 696E
90 6720 746F
90 6767 6C65
90 6420 2564
91 .LC1:
92 001b 2B20 5374 .string "+ State toggled %d (%d)\n"
92 6174 6520
92 746F 6767
92 6C65 6420
92 2564 2028
93 .section .text.startup,"ax",@progbits
94 .global main
96 main:
97 .LFB8:
60:main.c **** }
61:main.c **** }
62:main.c ****
63:main.c **** int main(void) {
98 .loc 1 63 0
99 0000 CF93 push r28
100 .LCFI4:
101 0002 DF93 push r29
102 .LCFI5:
103 0004 00D0 rcall .
104 .LCFI6:
105 0006 CDB7 in r28,__SP_L__
106 0008 DEB7 in r29,__SP_H__
107 .LCFI7:
108 /* prologue: function */
109 /* frame size = 2 */
110 /* stack size = 4 */
111 .L__stack_usage = 4
112 .LBB6:
113 .LBB7:
35:main.c **** DDRD &= ~(_BV(PORTD2));
114 .loc 1 35 0
115 000a 5298 cbi 42-0x20,2
43:main.c **** PORTD |= (_BV(PORTD2));
116 .loc 1 43 0
117 000c 5A9A sbi 43-0x20,2
46:main.c **** DDRB |= _BV(PORTB5);
118 .loc 1 46 0
119 000e 259A sbi 36-0x20,5
120 .LBE7:
121 .LBE6:
64:main.c ****
65:main.c **** init();
66:main.c **** timer_init();
122 .loc 1 66 0
123 0010 0E94 0000 call timer_init
67:main.c **** uart_init();
124 .loc 1 67 0
125 0014 0E94 0000 call uart_init
68:main.c **** stdout = &uart_output;
126 .loc 1 68 0
127 0018 80E0 ldi r24,lo8(uart_output)
128 001a 90E0 ldi r25,hi8(uart_output)
129 001c 9093 0000 sts __iob+2+1,r25
130 0020 8093 0000 sts __iob+2,r24
69:main.c **** stdin = &uart_input;
131 .loc 1 69 0
132 0024 80E0 ldi r24,lo8(uart_input)
133 0026 90E0 ldi r25,hi8(uart_input)
134 0028 9093 0000 sts __iob+1,r25
135 002c 8093 0000 sts __iob,r24
136 .LVL4:
70:main.c ****
71:main.c **** uint8_t current_reading;
72:main.c **** uint8_t previous_reading = 0;
73:main.c **** uint8_t current_state = 0;
74:main.c **** uint8_t previous_state = 0;
137 .loc 1 74 0
138 0030 7724 clr r7
73:main.c **** uint8_t current_state = 0;
139 .loc 1 73 0
140 0032 00E0 ldi r16,lo8(0)
72:main.c **** uint8_t previous_reading = 0;
141 .loc 1 72 0
142 0034 20E0 ldi r18,lo8(0)
75:main.c ****
76:main.c **** uint64_t last_toggle_time;
77:main.c ****
78:main.c **** while (1) {
79:main.c ****
80:main.c **** current_reading = digital_read(PIND, PIND2);
81:main.c **** if (current_reading != previous_reading) {
82:main.c **** /* Note the time in millis of last change of button state. */
83:main.c **** last_toggle_time = timer_millis();
84:main.c **** printf("- Reading toggled %d (%d)\n", current_reading, last_toggle_time);
143 .loc 1 84 0
144 0036 40E0 ldi r20,lo8(.LC0)
145 0038 442E mov r4,r20
146 003a 40E0 ldi r20,hi8(.LC0)
147 003c 542E mov r5,r20
85:main.c **** }
86:main.c ****
87:main.c **** /* If there has been more than 10 millis since last toggling */
88:main.c **** /* of button state, assume it is real and not bouncing noise. */
89:main.c **** if ((timer_millis() - last_toggle_time) > 10) {
90:main.c **** current_state = current_reading;
91:main.c **** }
92:main.c ****
93:main.c **** /* Just for debugging purposes. */
94:main.c **** if (current_state != previous_state) {
95:main.c **** printf("+ State toggled %d (%d)\n", current_state, last_toggle_time);
148 .loc 1 95 0
149 003e 50E0 ldi r21,lo8(.LC1)
150 0040 252E mov r2,r21
151 0042 50E0 ldi r21,hi8(.LC1)
152 0044 352E mov r3,r21
153 0046 00C0 rjmp .L6
154 .LVL5:
155 .L23:
51:main.c **** return bit_is_set(input_register, pin) != 0 ? 1 : 0;
156 .loc 1 51 0
157 0048 212F mov r18,r17
158 .LVL6:
159 .L6:
80:main.c **** current_reading = digital_read(PIND, PIND2);
160 .loc 1 80 0
161 004a 89B1 in r24,41-0x20
162 004c 8983 std Y+1,r24
163 004e 1A82 std Y+2,__zero_reg__
164 .LVL7:
165 .LBB8:
166 .LBB9:
51:main.c **** return bit_is_set(input_register, pin) != 0 ? 1 : 0;
167 .loc 1 51 0
168 0050 8981 ldd r24,Y+1
169 0052 90E0 ldi r25,lo8(0)
170 0054 9595 asr r25
171 0056 8795 ror r24
172 0058 9595 asr r25
173 005a 8795 ror r24
174 005c 182F mov r17,r24
175 005e 1170 andi r17,lo8(1)
176 .LBE9:
177 .LBE8:
81:main.c **** if (current_reading != previous_reading) {
178 .loc 1 81 0
179 0060 1217 cp r17,r18
180 0062 01F0 breq .L7
83:main.c **** last_toggle_time = timer_millis();
181 .loc 1 83 0
182 0064 0E94 0000 call timer_millis
183 .LVL8:
184 0068 4901 movw r8,r18
185 .LVL9:
186 006a 5A01 movw r10,r20
187 006c 6B01 movw r12,r22
188 006e 7C01 movw r14,r24
189 .LVL10:
84:main.c **** printf("- Reading toggled %d (%d)\n", current_reading, last_toggle_time);
190 .loc 1 84 0
191 0070 8DB7 in r24,__SP_L__
192 0072 9EB7 in r25,__SP_H__
193 0074 0C97 sbiw r24,12
194 0076 0FB6 in __tmp_reg__,__SREG__
195 0078 F894 cli
196 007a 9EBF out __SP_H__,r25
197 007c 0FBE out __SREG__,__tmp_reg__
198 007e 8DBF out __SP_L__,r24
199 0080 EDB7 in r30,__SP_L__
200 0082 FEB7 in r31,__SP_H__
201 0084 3196 adiw r30,1
202 0086 ADB7 in r26,__SP_L__
203 0088 BEB7 in r27,__SP_H__
204 008a 1296 adiw r26,1+1
205 008c 5C92 st X,r5
206 008e 4E92 st -X,r4
207 0090 1197 sbiw r26,1
208 0092 1283 std Z+2,r17
209 0094 1382 std Z+3,__zero_reg__
210 0096 8482 std Z+4,r8
211 0098 9582 std Z+5,r9
212 009a A682 std Z+6,r10
213 009c B782 std Z+7,r11
214 009e C086 std Z+8,r12
215 00a0 D186 std Z+9,r13
216 00a2 E286 std Z+10,r14
217 00a4 F386 std Z+11,r15
218 .LCFI8:
219 00a6 0E94 0000 call printf
220 00aa 8DB7 in r24,__SP_L__
221 00ac 9EB7 in r25,__SP_H__
222 00ae 0C96 adiw r24,12
223 00b0 0FB6 in __tmp_reg__,__SREG__
224 00b2 F894 cli
225 00b4 9EBF out __SP_H__,r25
226 00b6 0FBE out __SREG__,__tmp_reg__
227 00b8 8DBF out __SP_L__,r24
228 .LVL11:
229 .L7:
89:main.c **** if ((timer_millis() - last_toggle_time) > 10) {
230 .loc 1 89 0
231 .LCFI9:
232 00ba 0E94 0000 call timer_millis
233 00be E22F mov r30,r18
234 00c0 E819 sub r30,r8
235 00c2 F1E0 ldi r31,lo8(1)
236 00c4 2E17 cp r18,r30
237 00c6 00F0 brlo .L9
238 00c8 F0E0 ldi r31,lo8(0)
239 .L9:
240 00ca A32F mov r26,r19
241 00cc A919 sub r26,r9
242 00ce 21E0 ldi r18,lo8(1)
243 00d0 3A17 cp r19,r26
244 00d2 00F0 brlo .L10
245 00d4 20E0 ldi r18,lo8(0)
246 .L10:
247 00d6 3A2F mov r19,r26
248 00d8 3F1B sub r19,r31
249 00da F1E0 ldi r31,lo8(1)
250 00dc A317 cp r26,r19
251 00de 00F0 brlo .L11
252 00e0 F0E0 ldi r31,lo8(0)
253 .L11:
254 00e2 2F2B or r18,r31
255 00e4 A42F mov r26,r20
256 00e6 AA19 sub r26,r10
257 00e8 F1E0 ldi r31,lo8(1)
258 00ea 4A17 cp r20,r26
259 00ec 00F0 brlo .L12
260 00ee F0E0 ldi r31,lo8(0)
261 .L12:
262 00f0 4A2F mov r20,r26
263 00f2 421B sub r20,r18
264 00f4 21E0 ldi r18,lo8(1)
265 00f6 A417 cp r26,r20
266 00f8 00F0 brlo .L13
267 00fa 20E0 ldi r18,lo8(0)
268 .L13:
269 00fc F22B or r31,r18
270 00fe A52F mov r26,r21
271 0100 AB19 sub r26,r11
272 0102 21E0 ldi r18,lo8(1)
273 0104 5A17 cp r21,r26
274 0106 00F0 brlo .L14
275 0108 20E0 ldi r18,lo8(0)
276 .L14:
277 010a 5A2F mov r21,r26
278 010c 5F1B sub r21,r31
279 010e F1E0 ldi r31,lo8(1)
280 0110 A517 cp r26,r21
281 0112 00F0 brlo .L15
282 0114 F0E0 ldi r31,lo8(0)
283 .L15:
284 0116 2F2B or r18,r31
285 0118 A62F mov r26,r22
286 011a AC19 sub r26,r12
287 011c F1E0 ldi r31,lo8(1)
288 011e 6A17 cp r22,r26
289 0120 00F0 brlo .L16
290 0122 F0E0 ldi r31,lo8(0)
291 .L16:
292 0124 6A2F mov r22,r26
293 0126 621B sub r22,r18
294 0128 21E0 ldi r18,lo8(1)
295 012a A617 cp r26,r22
296 012c 00F0 brlo .L17
297 012e 20E0 ldi r18,lo8(0)
298 .L17:
299 0130 F22B or r31,r18
300 0132 272F mov r18,r23
301 0134 2D19 sub r18,r13
302 0136 A1E0 ldi r26,lo8(1)
303 0138 7217 cp r23,r18
304 013a 00F0 brlo .L18
305 013c A0E0 ldi r26,lo8(0)
306 .L18:
307 013e 722F mov r23,r18
308 0140 7F1B sub r23,r31
309 0142 F1E0 ldi r31,lo8(1)
310 0144 2717 cp r18,r23
311 0146 00F0 brlo .L19
312 0148 F0E0 ldi r31,lo8(0)
313 .L19:
314 014a AF2B or r26,r31
315 014c F82F mov r31,r24
316 014e FE19 sub r31,r14
317 0150 21E0 ldi r18,lo8(1)
318 0152 8F17 cp r24,r31
319 0154 00F0 brlo .L20
320 0156 20E0 ldi r18,lo8(0)
321 .L20:
322 0158 8F2F mov r24,r31
323 015a 8A1B sub r24,r26
324 015c A1E0 ldi r26,lo8(1)
325 015e F817 cp r31,r24
326 0160 00F0 brlo .L21
327 0162 A0E0 ldi r26,lo8(0)
328 .L21:
329 0164 2A2B or r18,r26
330 0166 9F19 sub r25,r15
331 0168 9217 cp r25,r18
332 016a 01F4 brne .L24
333 016c 8823 tst r24
334 016e 01F4 brne .L24
335 0170 7723 tst r23
336 0172 01F4 brne .L24
337 0174 6623 tst r22
338 0176 01F4 brne .L24
339 0178 5523 tst r21
340 017a 01F4 brne .L24
341 017c 4423 tst r20
342 017e 01F4 brne .L24
343 0180 3323 tst r19
344 0182 01F4 brne .L24
345 0184 EB30 cpi r30,lo8(11)
346 0186 00F0 brlo .L8
347 .L24:
51:main.c **** return bit_is_set(input_register, pin) != 0 ? 1 : 0;
348 .loc 1 51 0
349 0188 012F mov r16,r17
350 .LVL12:
351 .L8:
94:main.c **** if (current_state != previous_state) {
352 .loc 1 94 0
353 018a 0715 cp r16,r7
354 018c 01F4 brne .+2
355 018e 00C0 rjmp .L23
356 .loc 1 95 0
357 0190 ADB7 in r26,__SP_L__
358 0192 BEB7 in r27,__SP_H__
359 0194 1C97 sbiw r26,12
360 0196 0FB6 in __tmp_reg__,__SREG__
361 0198 F894 cli
362 019a BEBF out __SP_H__,r27
363 019c 0FBE out __SREG__,__tmp_reg__
364 019e ADBF out __SP_L__,r26
365 01a0 EDB7 in r30,__SP_L__
366 01a2 FEB7 in r31,__SP_H__
367 01a4 3196 adiw r30,1
368 01a6 1296 adiw r26,1+1
369 01a8 3C92 st X,r3
370 01aa 2E92 st -X,r2
371 01ac 1197 sbiw r26,1
372 01ae 0283 std Z+2,r16
373 01b0 1382 std Z+3,__zero_reg__
374 01b2 8482 std Z+4,r8
375 01b4 9582 std Z+5,r9
376 01b6 A682 std Z+6,r10
377 01b8 B782 std Z+7,r11
378 01ba C086 std Z+8,r12
379 01bc D186 std Z+9,r13
380 01be E286 std Z+10,r14
381 01c0 F386 std Z+11,r15
382 .LCFI10:
383 01c2 0E94 0000 call printf
384 .LVL13:
385 01c6 8DB7 in r24,__SP_L__
386 01c8 9EB7 in r25,__SP_H__
387 01ca 0C96 adiw r24,12
388 01cc 0FB6 in __tmp_reg__,__SREG__
389 01ce F894 cli
390 01d0 9EBF out __SP_H__,r25
391 01d2 0FBE out __SREG__,__tmp_reg__
392 01d4 8DBF out __SP_L__,r24
393 01d6 702E mov r7,r16
394 01d8 00C0 rjmp .L23
395 .LFE8:
397 .global uart_input
398 .data
401 uart_input:
402 0034 0000 00 .skip 3,0
403 0037 01 .byte 1
404 0038 0000 0000 .skip 4,0
405 003c 0000 .word 0
406 003e 0000 .word gs(uart_getchar)
407 0040 0000 .word 0
408 .global uart_output
411 uart_output:
412 0042 0000 00 .skip 3,0
413 0045 02 .byte 2
414 0046 0000 0000 .skip 4,0
415 004a 0000 .word gs(uart_putchar)
416 004c 0000 .word 0
417 004e 0000 .word 0
512 .Letext0:
513 .file 2 "/usr/local/Cellar/avr-gcc/4.6.1/lib/gcc/avr/4.6.1/../../../../avr/include/stdint.h"
514 .file 3 "/usr/local/Cellar/avr-gcc/4.6.1/lib/gcc/avr/4.6.1/../../../../avr/include/stdio.h"
515 .file 4 "uart.h"
DEFINED SYMBOLS
*ABS*:0000000000000000 main.c
/var/folders/6p/hvps1d6n58jfd6qghfhb96600000gn/T//ccYMcvqY.s:2 *ABS*:000000000000003f __SREG__
/var/folders/6p/hvps1d6n58jfd6qghfhb96600000gn/T//ccYMcvqY.s:3 *ABS*:000000000000003e __SP_H__
/var/folders/6p/hvps1d6n58jfd6qghfhb96600000gn/T//ccYMcvqY.s:4 *ABS*:000000000000003d __SP_L__
/var/folders/6p/hvps1d6n58jfd6qghfhb96600000gn/T//ccYMcvqY.s:5 *ABS*:0000000000000000 __tmp_reg__
/var/folders/6p/hvps1d6n58jfd6qghfhb96600000gn/T//ccYMcvqY.s:6 *ABS*:0000000000000001 __zero_reg__
/var/folders/6p/hvps1d6n58jfd6qghfhb96600000gn/T//ccYMcvqY.s:13 .text:0000000000000000 digital_read
/var/folders/6p/hvps1d6n58jfd6qghfhb96600000gn/T//ccYMcvqY.s:54 .text:0000000000000028 digital_write
/var/folders/6p/hvps1d6n58jfd6qghfhb96600000gn/T//ccYMcvqY.s:96 .text.startup:0000000000000000 main
/var/folders/6p/hvps1d6n58jfd6qghfhb96600000gn/T//ccYMcvqY.s:411 .data:0000000000000042 uart_output
/var/folders/6p/hvps1d6n58jfd6qghfhb96600000gn/T//ccYMcvqY.s:401 .data:0000000000000034 uart_input
UNDEFINED SYMBOLS
__do_copy_data
__do_clear_bss
timer_init
uart_init
__iob
timer_millis
printf
uart_getchar
uart_putchar