Skip to content

Instantly share code, notes, and snippets.

@zacharyvoase
Last active December 14, 2015 08:49
Show Gist options
  • Save zacharyvoase/5060886 to your computer and use it in GitHub Desktop.
Save zacharyvoase/5060886 to your computer and use it in GitHub Desktop.
Make your Arduino speak Morse code. Hook it up to an LED or a buzzer in series with a small resistor, and then write in text over the serial port. Done. This gist now includes an object code dump.
int led_pin = 2;
#define PERIOD (100)
void setup() {
pinMode(led_pin, OUTPUT);
Serial.begin(9600);
}
void writeMorse(char *code) {
int i = 0;
while (true) {
char currentChar = code[i];
if (currentChar == '\0') {
break;
}
else if (currentChar == '.') {
digitalWrite(led_pin, HIGH);
delay(PERIOD);
digitalWrite(led_pin, LOW);
delay(PERIOD);
}
else if (currentChar == '-') {
digitalWrite(led_pin, HIGH);
delay(PERIOD * 2);
digitalWrite(led_pin, LOW);
delay(PERIOD);
}
else if (currentChar == ' ') {
digitalWrite(led_pin, LOW);
delay(PERIOD * 2);
}
else if (currentChar == '/') {
digitalWrite(led_pin, LOW);
delay(PERIOD * 7);
}
i += 1;
}
}
void loop () {
// noop.
}
void serialEvent () {
char c = Serial.read();
switch (c) {
case 'A':
case 'a':
writeMorse(".- "); break;
case 'B':
case 'b':
writeMorse("-... "); break;
case 'C':
case 'c':
writeMorse("-.-. "); break;
case 'D':
case 'd':
writeMorse("-.. "); break;
case 'E':
case 'e':
writeMorse(". "); break;
case 'F':
case 'f':
writeMorse("..-. "); break;
case 'G':
case 'g':
writeMorse("--. "); break;
case 'H':
case 'h':
writeMorse(".... "); break;
case 'I':
case 'i':
writeMorse(".. "); break;
case 'J':
case 'j':
writeMorse(".--- "); break;
case 'K':
case 'k':
writeMorse("-.- "); break;
case 'L':
case 'l':
writeMorse(".-.. "); break;
case 'M':
case 'm':
writeMorse("-- "); break;
case 'N':
case 'n':
writeMorse("-. "); break;
case 'O':
case 'o':
writeMorse("--- "); break;
case 'P':
case 'p':
writeMorse(".--. "); break;
case 'Q':
case 'q':
writeMorse("--.- "); break;
case 'R':
case 'r':
writeMorse(".-. "); break;
case 'S':
case 's':
writeMorse("... "); break;
case 'T':
case 't':
writeMorse("- "); break;
case 'U':
case 'u':
writeMorse("..- "); break;
case 'V':
case 'v':
writeMorse("...- "); break;
case 'W':
case 'w':
writeMorse(".-- "); break;
case 'X':
case 'x':
writeMorse("-..- "); break;
case 'Y':
case 'y':
writeMorse("-.-- "); break;
case 'Z':
case 'z':
writeMorse("--.. "); break;
case ' ':
writeMorse("/"); break;
case '1':
writeMorse(".---- "); break;
case '2':
writeMorse("..--- "); break;
case '3':
writeMorse("...-- "); break;
case '4':
writeMorse("....- "); break;
case '5':
writeMorse("..... "); break;
case '6':
writeMorse("-.... "); break;
case '7':
writeMorse("--... "); break;
case '8':
writeMorse("---.. "); break;
case '9':
writeMorse("----. "); break;
case '0':
writeMorse("----- "); break;
default:
break;
}
}
/var/folders/3s/70md0ygx2jq18jxg_6_13rd40000gn/T/build1988031117167001169.tmp/sketch_mar02a.cpp.elf: file format elf32-avr
Disassembly of section .text:
00000000 <__vectors>:
timer0_millis = m;
timer0_overflow_count++;
}
unsigned long millis()
{
0: 0c 94 bd 00 jmp 0x17a ; 0x17a <__ctors_end>
SREG = oldSREG;
}
int digitalRead(uint8_t pin)
{
4: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
!defined(SIG_UART0_RECV) && !defined(USART0_RX_vect) && \
!defined(SIG_UART_RECV)
#error "Don't know what the Data Received vector is called for the first UART"
#else
void serialEvent() __attribute__((weak));
void serialEvent() {}
8: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
n += write(*buffer++);
}
return n;
}
size_t Print::print(const __FlashStringHelper *ifsh)
c: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
10: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
14: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
18: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
1c: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
20: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
24: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
28: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
2c: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
30: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
34: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
38: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
3c: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
40: 0c 94 c7 01 jmp 0x38e ; 0x38e <__vector_16>
44: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
48: 0c 94 45 03 jmp 0x68a ; 0x68a <__vector_18>
4c: 0c 94 93 03 jmp 0x726 ; 0x726 <__vector_19>
50: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
54: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
58: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
5c: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
60: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
64: 0c 94 e5 00 jmp 0x1ca ; 0x1ca <__bad_interrupt>
68: 94 01 movw r18, r8
6a: b8 01 movw r22, r16
6c: b8 01 movw r22, r16
6e: b8 01 movw r22, r16
70: b8 01 movw r22, r16
72: b8 01 movw r22, r16
74: b8 01 movw r22, r16
76: b8 01 movw r22, r16
78: b8 01 movw r22, r16
7a: b8 01 movw r22, r16
7c: b8 01 movw r22, r16
7e: b8 01 movw r22, r16
80: b8 01 movw r22, r16
82: b8 01 movw r22, r16
84: b8 01 movw r22, r16
86: b8 01 movw r22, r16
88: b4 01 movw r22, r8
8a: 97 01 movw r18, r14
8c: 9a 01 movw r18, r20
8e: 9d 01 movw r18, r26
90: a0 01 movw r20, r0
92: a3 01 movw r20, r6
94: a6 01 movw r20, r12
96: a9 01 movw r20, r18
98: ac 01 movw r20, r24
9a: af 01 movw r20, r30
9c: b8 01 movw r22, r16
9e: b8 01 movw r22, r16
a0: b8 01 movw r22, r16
a2: b8 01 movw r22, r16
a4: b8 01 movw r22, r16
a6: b8 01 movw r22, r16
a8: b8 01 movw r22, r16
aa: 46 01 movw r8, r12
ac: 49 01 movw r8, r18
ae: 4c 01 movw r8, r24
b0: 4f 01 movw r8, r30
b2: 52 01 movw r10, r4
b4: 55 01 movw r10, r10
b6: 58 01 movw r10, r16
b8: 5b 01 movw r10, r22
ba: 5e 01 movw r10, r28
bc: 61 01 movw r12, r2
be: 64 01 movw r12, r8
c0: 67 01 movw r12, r14
c2: 6a 01 movw r12, r20
c4: 6d 01 movw r12, r26
c6: 70 01 movw r14, r0
c8: 73 01 movw r14, r6
ca: 76 01 movw r14, r12
cc: 79 01 movw r14, r18
ce: 7c 01 movw r14, r24
d0: 7f 01 movw r14, r30
d2: 82 01 movw r16, r4
d4: 85 01 movw r16, r10
d6: 88 01 movw r16, r16
d8: 8b 01 movw r16, r22
da: 8e 01 movw r16, r28
dc: 91 01 movw r18, r2
de: b8 01 movw r22, r16
e0: b8 01 movw r22, r16
e2: b8 01 movw r22, r16
e4: b8 01 movw r22, r16
e6: b8 01 movw r22, r16
e8: b8 01 movw r22, r16
ea: 46 01 movw r8, r12
ec: 49 01 movw r8, r18
ee: 4c 01 movw r8, r24
f0: 4f 01 movw r8, r30
f2: 52 01 movw r10, r4
f4: 55 01 movw r10, r10
f6: 58 01 movw r10, r16
f8: 5b 01 movw r10, r22
fa: 5e 01 movw r10, r28
fc: 61 01 movw r12, r2
fe: 64 01 movw r12, r8
100: 67 01 movw r12, r14
102: 6a 01 movw r12, r20
104: 6d 01 movw r12, r26
106: 70 01 movw r14, r0
108: 73 01 movw r14, r6
10a: 76 01 movw r14, r12
10c: 79 01 movw r14, r18
10e: 7c 01 movw r14, r24
110: 7f 01 movw r14, r30
112: 82 01 movw r16, r4
114: 85 01 movw r16, r10
116: 88 01 movw r16, r16
118: 8b 01 movw r16, r22
11a: 8e 01 movw r16, r28
11c: 91 01 movw r18, r2
0000011e <port_to_mode_PGM>:
11e: 00 00 00 00 24 00 27 00 2a 00 ....$.'.*.
00000128 <port_to_output_PGM>:
128: 00 00 00 00 25 00 28 00 2b 00 ....%.(.+.
00000132 <port_to_input_PGM>:
132: 00 00 00 00 23 00 26 00 29 00 ....#.&.).
0000013c <digital_pin_to_port_PGM>:
13c: 04 04 04 04 04 04 04 04 02 02 02 02 02 02 03 03 ................
14c: 03 03 03 03 ....
00000150 <digital_pin_to_bit_mask_PGM>:
150: 01 02 04 08 10 20 40 80 01 02 04 08 10 20 01 02 ..... @...... ..
160: 04 08 10 20 ...
00000164 <digital_pin_to_timer_PGM>:
164: 00 00 00 07 00 02 01 00 00 03 04 06 00 00 00 00 ................
174: 00 00 00 00 ....
00000178 <__ctors_start>:
178: ff 04 cpc r15, r15
0000017a <__ctors_end>:
17a: 11 24 eor r1, r1
17c: 1f be out 0x3f, r1 ; 63
17e: cf ef ldi r28, 0xFF ; 255
180: d8 e0 ldi r29, 0x08 ; 8
182: de bf out 0x3e, r29 ; 62
184: cd bf out 0x3d, r28 ; 61
00000186 <__do_copy_data>:
186: 11 e0 ldi r17, 0x01 ; 1
188: a0 e0 ldi r26, 0x00 ; 0
18a: b1 e0 ldi r27, 0x01 ; 1
18c: e2 e7 ldi r30, 0x72 ; 114
18e: fb e0 ldi r31, 0x0B ; 11
190: 02 c0 rjmp .+4 ; 0x196 <.do_copy_data_start>
00000192 <.do_copy_data_loop>:
192: 05 90 lpm r0, Z+
194: 0d 92 st X+, r0
00000196 <.do_copy_data_start>:
196: a0 3e cpi r26, 0xE0 ; 224
198: b1 07 cpc r27, r17
19a: d9 f7 brne .-10 ; 0x192 <.do_copy_data_loop>
0000019c <__do_clear_bss>:
19c: 12 e0 ldi r17, 0x02 ; 2
19e: a0 ee ldi r26, 0xE0 ; 224
1a0: b1 e0 ldi r27, 0x01 ; 1
1a2: 01 c0 rjmp .+2 ; 0x1a6 <.do_clear_bss_start>
000001a4 <.do_clear_bss_loop>:
1a4: 1d 92 st X+, r1
000001a6 <.do_clear_bss_start>:
1a6: a3 39 cpi r26, 0x93 ; 147
1a8: b1 07 cpc r27, r17
1aa: e1 f7 brne .-8 ; 0x1a4 <.do_clear_bss_loop>
000001ac <__do_global_ctors>:
1ac: 11 e0 ldi r17, 0x01 ; 1
1ae: ca e7 ldi r28, 0x7A ; 122
1b0: d1 e0 ldi r29, 0x01 ; 1
1b2: 04 c0 rjmp .+8 ; 0x1bc <.do_global_ctors_start>
000001b4 <.do_global_ctors_loop>:
1b4: 22 97 sbiw r28, 0x02 ; 2
1b6: fe 01 movw r30, r28
1b8: 0e 94 b3 05 call 0xb66 ; 0xb66 <__tablejump__>
000001bc <.do_global_ctors_start>:
1bc: c8 37 cpi r28, 0x78 ; 120
1be: d1 07 cpc r29, r17
1c0: c9 f7 brne .-14 ; 0x1b4 <.do_global_ctors_loop>
1c2: 0e 94 55 05 call 0xaaa ; 0xaaa <main>
1c6: 0c 94 b7 05 jmp 0xb6e ; 0xb6e <_exit>
000001ca <__bad_interrupt>:
1ca: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
000001ce <loop>:
1ce: 08 95 ret
000001d0 <_Z10writeMorsePc>:
1d0: cf 93 push r28
1d2: df 93 push r29
1d4: ec 01 movw r28, r24
1d6: 88 81 ld r24, Y
1d8: 88 23 and r24, r24
1da: f1 f1 breq .+124 ; 0x258 <_Z10writeMorsePc+0x88>
1dc: 8e 32 cpi r24, 0x2E ; 46
1de: 51 f4 brne .+20 ; 0x1f4 <_Z10writeMorsePc+0x24>
1e0: 80 91 ce 01 lds r24, 0x01CE
1e4: 61 e0 ldi r22, 0x01 ; 1
1e6: 0e 94 f1 02 call 0x5e2 ; 0x5e2 <digitalWrite>
1ea: 64 e6 ldi r22, 0x64 ; 100
1ec: 70 e0 ldi r23, 0x00 ; 0
1ee: 80 e0 ldi r24, 0x00 ; 0
1f0: 90 e0 ldi r25, 0x00 ; 0
1f2: 0b c0 rjmp .+22 ; 0x20a <_Z10writeMorsePc+0x3a>
1f4: 8d 32 cpi r24, 0x2D ; 45
1f6: a9 f4 brne .+42 ; 0x222 <_Z10writeMorsePc+0x52>
1f8: 80 91 ce 01 lds r24, 0x01CE
1fc: 61 e0 ldi r22, 0x01 ; 1
1fe: 0e 94 f1 02 call 0x5e2 ; 0x5e2 <digitalWrite>
202: 68 ec ldi r22, 0xC8 ; 200
204: 70 e0 ldi r23, 0x00 ; 0
206: 80 e0 ldi r24, 0x00 ; 0
208: 90 e0 ldi r25, 0x00 ; 0
20a: 0e 94 4a 02 call 0x494 ; 0x494 <delay>
20e: 80 91 ce 01 lds r24, 0x01CE
212: 60 e0 ldi r22, 0x00 ; 0
214: 0e 94 f1 02 call 0x5e2 ; 0x5e2 <digitalWrite>
218: 64 e6 ldi r22, 0x64 ; 100
21a: 70 e0 ldi r23, 0x00 ; 0
21c: 80 e0 ldi r24, 0x00 ; 0
21e: 90 e0 ldi r25, 0x00 ; 0
220: 17 c0 rjmp .+46 ; 0x250 <_Z10writeMorsePc+0x80>
222: 80 32 cpi r24, 0x20 ; 32
224: 51 f4 brne .+20 ; 0x23a <_Z10writeMorsePc+0x6a>
226: 80 91 ce 01 lds r24, 0x01CE
22a: 60 e0 ldi r22, 0x00 ; 0
22c: 0e 94 f1 02 call 0x5e2 ; 0x5e2 <digitalWrite>
230: 68 ec ldi r22, 0xC8 ; 200
232: 70 e0 ldi r23, 0x00 ; 0
234: 80 e0 ldi r24, 0x00 ; 0
236: 90 e0 ldi r25, 0x00 ; 0
238: 0b c0 rjmp .+22 ; 0x250 <_Z10writeMorsePc+0x80>
23a: 8f 32 cpi r24, 0x2F ; 47
23c: 59 f4 brne .+22 ; 0x254 <_Z10writeMorsePc+0x84>
23e: 80 91 ce 01 lds r24, 0x01CE
242: 60 e0 ldi r22, 0x00 ; 0
244: 0e 94 f1 02 call 0x5e2 ; 0x5e2 <digitalWrite>
248: 6c eb ldi r22, 0xBC ; 188
24a: 72 e0 ldi r23, 0x02 ; 2
24c: 80 e0 ldi r24, 0x00 ; 0
24e: 90 e0 ldi r25, 0x00 ; 0
250: 0e 94 4a 02 call 0x494 ; 0x494 <delay>
254: 21 96 adiw r28, 0x01 ; 1
256: bf cf rjmp .-130 ; 0x1d6 <_Z10writeMorsePc+0x6>
258: df 91 pop r29
25a: cf 91 pop r28
25c: 08 95 ret
0000025e <_Z11serialEventv>:
25e: 81 e7 ldi r24, 0x71 ; 113
260: 92 e0 ldi r25, 0x02 ; 2
262: 0e 94 86 04 call 0x90c ; 0x90c <_ZN14HardwareSerial4readEv>
266: 99 27 eor r25, r25
268: 87 fd sbrc r24, 7
26a: 90 95 com r25
26c: a9 2f mov r26, r25
26e: b9 2f mov r27, r25
270: fc 01 movw r30, r24
272: b0 97 sbiw r30, 0x20 ; 32
274: eb 35 cpi r30, 0x5B ; 91
276: f1 05 cpc r31, r1
278: 08 f0 brcs .+2 ; 0x27c <_Z11serialEventv+0x1e>
27a: 7a c0 rjmp .+244 ; 0x370 <_Z11serialEventv+0x112>
27c: ec 5c subi r30, 0xCC ; 204
27e: ff 4f sbci r31, 0xFF ; 255
280: ee 0f add r30, r30
282: ff 1f adc r31, r31
284: 05 90 lpm r0, Z+
286: f4 91 lpm r31, Z+
288: e0 2d mov r30, r0
28a: 09 94 ijmp
28c: 80 e0 ldi r24, 0x00 ; 0
28e: 91 e0 ldi r25, 0x01 ; 1
290: 68 c0 rjmp .+208 ; 0x362 <_Z11serialEventv+0x104>
292: 84 e0 ldi r24, 0x04 ; 4
294: 91 e0 ldi r25, 0x01 ; 1
296: 65 c0 rjmp .+202 ; 0x362 <_Z11serialEventv+0x104>
298: 8a e0 ldi r24, 0x0A ; 10
29a: 91 e0 ldi r25, 0x01 ; 1
29c: 62 c0 rjmp .+196 ; 0x362 <_Z11serialEventv+0x104>
29e: 80 e1 ldi r24, 0x10 ; 16
2a0: 91 e0 ldi r25, 0x01 ; 1
2a2: 5f c0 rjmp .+190 ; 0x362 <_Z11serialEventv+0x104>
2a4: 85 e1 ldi r24, 0x15 ; 21
2a6: 91 e0 ldi r25, 0x01 ; 1
2a8: 5c c0 rjmp .+184 ; 0x362 <_Z11serialEventv+0x104>
2aa: 88 e1 ldi r24, 0x18 ; 24
2ac: 91 e0 ldi r25, 0x01 ; 1
2ae: 59 c0 rjmp .+178 ; 0x362 <_Z11serialEventv+0x104>
2b0: 8e e1 ldi r24, 0x1E ; 30
2b2: 91 e0 ldi r25, 0x01 ; 1
2b4: 56 c0 rjmp .+172 ; 0x362 <_Z11serialEventv+0x104>
2b6: 83 e2 ldi r24, 0x23 ; 35
2b8: 91 e0 ldi r25, 0x01 ; 1
2ba: 53 c0 rjmp .+166 ; 0x362 <_Z11serialEventv+0x104>
2bc: 89 e2 ldi r24, 0x29 ; 41
2be: 91 e0 ldi r25, 0x01 ; 1
2c0: 50 c0 rjmp .+160 ; 0x362 <_Z11serialEventv+0x104>
2c2: 8d e2 ldi r24, 0x2D ; 45
2c4: 91 e0 ldi r25, 0x01 ; 1
2c6: 4d c0 rjmp .+154 ; 0x362 <_Z11serialEventv+0x104>
2c8: 83 e3 ldi r24, 0x33 ; 51
2ca: 91 e0 ldi r25, 0x01 ; 1
2cc: 4a c0 rjmp .+148 ; 0x362 <_Z11serialEventv+0x104>
2ce: 88 e3 ldi r24, 0x38 ; 56
2d0: 91 e0 ldi r25, 0x01 ; 1
2d2: 47 c0 rjmp .+142 ; 0x362 <_Z11serialEventv+0x104>
2d4: 8e e3 ldi r24, 0x3E ; 62
2d6: 91 e0 ldi r25, 0x01 ; 1
2d8: 44 c0 rjmp .+136 ; 0x362 <_Z11serialEventv+0x104>
2da: 82 e4 ldi r24, 0x42 ; 66
2dc: 91 e0 ldi r25, 0x01 ; 1
2de: 41 c0 rjmp .+130 ; 0x362 <_Z11serialEventv+0x104>
2e0: 86 e4 ldi r24, 0x46 ; 70
2e2: 91 e0 ldi r25, 0x01 ; 1
2e4: 3e c0 rjmp .+124 ; 0x362 <_Z11serialEventv+0x104>
2e6: 8b e4 ldi r24, 0x4B ; 75
2e8: 91 e0 ldi r25, 0x01 ; 1
2ea: 3b c0 rjmp .+118 ; 0x362 <_Z11serialEventv+0x104>
2ec: 81 e5 ldi r24, 0x51 ; 81
2ee: 91 e0 ldi r25, 0x01 ; 1
2f0: 38 c0 rjmp .+112 ; 0x362 <_Z11serialEventv+0x104>
2f2: 87 e5 ldi r24, 0x57 ; 87
2f4: 91 e0 ldi r25, 0x01 ; 1
2f6: 35 c0 rjmp .+106 ; 0x362 <_Z11serialEventv+0x104>
2f8: 8c e5 ldi r24, 0x5C ; 92
2fa: 91 e0 ldi r25, 0x01 ; 1
2fc: 32 c0 rjmp .+100 ; 0x362 <_Z11serialEventv+0x104>
2fe: 81 e6 ldi r24, 0x61 ; 97
300: 91 e0 ldi r25, 0x01 ; 1
302: 2f c0 rjmp .+94 ; 0x362 <_Z11serialEventv+0x104>
304: 84 e6 ldi r24, 0x64 ; 100
306: 91 e0 ldi r25, 0x01 ; 1
308: 2c c0 rjmp .+88 ; 0x362 <_Z11serialEventv+0x104>
30a: 89 e6 ldi r24, 0x69 ; 105
30c: 91 e0 ldi r25, 0x01 ; 1
30e: 29 c0 rjmp .+82 ; 0x362 <_Z11serialEventv+0x104>
310: 8f e6 ldi r24, 0x6F ; 111
312: 91 e0 ldi r25, 0x01 ; 1
314: 26 c0 rjmp .+76 ; 0x362 <_Z11serialEventv+0x104>
316: 84 e7 ldi r24, 0x74 ; 116
318: 91 e0 ldi r25, 0x01 ; 1
31a: 23 c0 rjmp .+70 ; 0x362 <_Z11serialEventv+0x104>
31c: 8a e7 ldi r24, 0x7A ; 122
31e: 91 e0 ldi r25, 0x01 ; 1
320: 20 c0 rjmp .+64 ; 0x362 <_Z11serialEventv+0x104>
322: 80 e8 ldi r24, 0x80 ; 128
324: 91 e0 ldi r25, 0x01 ; 1
326: 1d c0 rjmp .+58 ; 0x362 <_Z11serialEventv+0x104>
328: 86 e8 ldi r24, 0x86 ; 134
32a: 91 e0 ldi r25, 0x01 ; 1
32c: 1a c0 rjmp .+52 ; 0x362 <_Z11serialEventv+0x104>
32e: 88 e8 ldi r24, 0x88 ; 136
330: 91 e0 ldi r25, 0x01 ; 1
332: 17 c0 rjmp .+46 ; 0x362 <_Z11serialEventv+0x104>
334: 8f e8 ldi r24, 0x8F ; 143
336: 91 e0 ldi r25, 0x01 ; 1
338: 14 c0 rjmp .+40 ; 0x362 <_Z11serialEventv+0x104>
33a: 86 e9 ldi r24, 0x96 ; 150
33c: 91 e0 ldi r25, 0x01 ; 1
33e: 11 c0 rjmp .+34 ; 0x362 <_Z11serialEventv+0x104>
340: 8d e9 ldi r24, 0x9D ; 157
342: 91 e0 ldi r25, 0x01 ; 1
344: 0e c0 rjmp .+28 ; 0x362 <_Z11serialEventv+0x104>
346: 84 ea ldi r24, 0xA4 ; 164
348: 91 e0 ldi r25, 0x01 ; 1
34a: 0b c0 rjmp .+22 ; 0x362 <_Z11serialEventv+0x104>
34c: 8b ea ldi r24, 0xAB ; 171
34e: 91 e0 ldi r25, 0x01 ; 1
350: 08 c0 rjmp .+16 ; 0x362 <_Z11serialEventv+0x104>
352: 82 eb ldi r24, 0xB2 ; 178
354: 91 e0 ldi r25, 0x01 ; 1
356: 05 c0 rjmp .+10 ; 0x362 <_Z11serialEventv+0x104>
358: 89 eb ldi r24, 0xB9 ; 185
35a: 91 e0 ldi r25, 0x01 ; 1
35c: 02 c0 rjmp .+4 ; 0x362 <_Z11serialEventv+0x104>
35e: 80 ec ldi r24, 0xC0 ; 192
360: 91 e0 ldi r25, 0x01 ; 1
362: 0e 94 e8 00 call 0x1d0 ; 0x1d0 <_Z10writeMorsePc>
366: 08 95 ret
368: 87 ec ldi r24, 0xC7 ; 199
36a: 91 e0 ldi r25, 0x01 ; 1
36c: 0e 94 e8 00 call 0x1d0 ; 0x1d0 <_Z10writeMorsePc>
370: 08 95 ret
00000372 <setup>:
372: 80 91 ce 01 lds r24, 0x01CE
376: 61 e0 ldi r22, 0x01 ; 1
378: 0e 94 b2 02 call 0x564 ; 0x564 <pinMode>
37c: 81 e7 ldi r24, 0x71 ; 113
37e: 92 e0 ldi r25, 0x02 ; 2
380: 40 e8 ldi r20, 0x80 ; 128
382: 55 e2 ldi r21, 0x25 ; 37
384: 60 e0 ldi r22, 0x00 ; 0
386: 70 e0 ldi r23, 0x00 ; 0
388: 0e 94 ce 03 call 0x79c ; 0x79c <_ZN14HardwareSerial5beginEm>
38c: 08 95 ret
0000038e <__vector_16>:
#if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__)
SIGNAL(TIM0_OVF_vect)
#else
SIGNAL(TIMER0_OVF_vect)
#endif
{
38e: 1f 92 push r1
390: 0f 92 push r0
392: 0f b6 in r0, 0x3f ; 63
394: 0f 92 push r0
396: 11 24 eor r1, r1
398: 2f 93 push r18
39a: 3f 93 push r19
39c: 8f 93 push r24
39e: 9f 93 push r25
3a0: af 93 push r26
3a2: bf 93 push r27
// copy these to local variables so they can be stored in registers
// (volatile variables must be read from memory on every access)
unsigned long m = timer0_millis;
3a4: 80 91 e4 01 lds r24, 0x01E4
3a8: 90 91 e5 01 lds r25, 0x01E5
3ac: a0 91 e6 01 lds r26, 0x01E6
3b0: b0 91 e7 01 lds r27, 0x01E7
unsigned char f = timer0_fract;
3b4: 30 91 e8 01 lds r19, 0x01E8
m += MILLIS_INC;
3b8: 01 96 adiw r24, 0x01 ; 1
3ba: a1 1d adc r26, r1
3bc: b1 1d adc r27, r1
f += FRACT_INC;
3be: 23 2f mov r18, r19
3c0: 2d 5f subi r18, 0xFD ; 253
if (f >= FRACT_MAX) {
3c2: 2d 37 cpi r18, 0x7D ; 125
3c4: 20 f0 brcs .+8 ; 0x3ce <__vector_16+0x40>
f -= FRACT_MAX;
3c6: 2d 57 subi r18, 0x7D ; 125
m += 1;
3c8: 01 96 adiw r24, 0x01 ; 1
3ca: a1 1d adc r26, r1
3cc: b1 1d adc r27, r1
}
timer0_fract = f;
3ce: 20 93 e8 01 sts 0x01E8, r18
timer0_millis = m;
3d2: 80 93 e4 01 sts 0x01E4, r24
3d6: 90 93 e5 01 sts 0x01E5, r25
3da: a0 93 e6 01 sts 0x01E6, r26
3de: b0 93 e7 01 sts 0x01E7, r27
timer0_overflow_count++;
3e2: 80 91 e0 01 lds r24, 0x01E0
3e6: 90 91 e1 01 lds r25, 0x01E1
3ea: a0 91 e2 01 lds r26, 0x01E2
3ee: b0 91 e3 01 lds r27, 0x01E3
3f2: 01 96 adiw r24, 0x01 ; 1
3f4: a1 1d adc r26, r1
3f6: b1 1d adc r27, r1
3f8: 80 93 e0 01 sts 0x01E0, r24
3fc: 90 93 e1 01 sts 0x01E1, r25
400: a0 93 e2 01 sts 0x01E2, r26
404: b0 93 e3 01 sts 0x01E3, r27
}
408: bf 91 pop r27
40a: af 91 pop r26
40c: 9f 91 pop r25
40e: 8f 91 pop r24
410: 3f 91 pop r19
412: 2f 91 pop r18
414: 0f 90 pop r0
416: 0f be out 0x3f, r0 ; 63
418: 0f 90 pop r0
41a: 1f 90 pop r1
41c: 18 95 reti
0000041e <init>:
void init()
{
// this needs to be called before setup() or some functions won't
// work there
sei();
41e: 78 94 sei
// on the ATmega168, timer 0 is also used for fast hardware pwm
// (using phase-correct PWM would mean that timer 0 overflowed half as often
// resulting in different millis() behavior on the ATmega8 and ATmega168)
#if defined(TCCR0A) && defined(WGM01)
sbi(TCCR0A, WGM01);
420: 84 b5 in r24, 0x24 ; 36
422: 82 60 ori r24, 0x02 ; 2
424: 84 bd out 0x24, r24 ; 36
sbi(TCCR0A, WGM00);
426: 84 b5 in r24, 0x24 ; 36
428: 81 60 ori r24, 0x01 ; 1
42a: 84 bd out 0x24, r24 ; 36
// this combination is for the standard atmega8
sbi(TCCR0, CS01);
sbi(TCCR0, CS00);
#elif defined(TCCR0B) && defined(CS01) && defined(CS00)
// this combination is for the standard 168/328/1280/2560
sbi(TCCR0B, CS01);
42c: 85 b5 in r24, 0x25 ; 37
42e: 82 60 ori r24, 0x02 ; 2
430: 85 bd out 0x25, r24 ; 37
sbi(TCCR0B, CS00);
432: 85 b5 in r24, 0x25 ; 37
434: 81 60 ori r24, 0x01 ; 1
436: 85 bd out 0x25, r24 ; 37
// enable timer 0 overflow interrupt
#if defined(TIMSK) && defined(TOIE0)
sbi(TIMSK, TOIE0);
#elif defined(TIMSK0) && defined(TOIE0)
sbi(TIMSK0, TOIE0);
438: ee e6 ldi r30, 0x6E ; 110
43a: f0 e0 ldi r31, 0x00 ; 0
43c: 80 81 ld r24, Z
43e: 81 60 ori r24, 0x01 ; 1
440: 80 83 st Z, r24
// this is better for motors as it ensures an even waveform
// note, however, that fast pwm mode can achieve a frequency of up
// 8 MHz (with a 16 MHz clock) at 50% duty cycle
#if defined(TCCR1B) && defined(CS11) && defined(CS10)
TCCR1B = 0;
442: e1 e8 ldi r30, 0x81 ; 129
444: f0 e0 ldi r31, 0x00 ; 0
446: 10 82 st Z, r1
// set timer 1 prescale factor to 64
sbi(TCCR1B, CS11);
448: 80 81 ld r24, Z
44a: 82 60 ori r24, 0x02 ; 2
44c: 80 83 st Z, r24
#if F_CPU >= 8000000L
sbi(TCCR1B, CS10);
44e: 80 81 ld r24, Z
450: 81 60 ori r24, 0x01 ; 1
452: 80 83 st Z, r24
sbi(TCCR1, CS10);
#endif
#endif
// put timer 1 in 8-bit phase correct pwm mode
#if defined(TCCR1A) && defined(WGM10)
sbi(TCCR1A, WGM10);
454: e0 e8 ldi r30, 0x80 ; 128
456: f0 e0 ldi r31, 0x00 ; 0
458: 80 81 ld r24, Z
45a: 81 60 ori r24, 0x01 ; 1
45c: 80 83 st Z, r24
// set timer 2 prescale factor to 64
#if defined(TCCR2) && defined(CS22)
sbi(TCCR2, CS22);
#elif defined(TCCR2B) && defined(CS22)
sbi(TCCR2B, CS22);
45e: e1 eb ldi r30, 0xB1 ; 177
460: f0 e0 ldi r31, 0x00 ; 0
462: 80 81 ld r24, Z
464: 84 60 ori r24, 0x04 ; 4
466: 80 83 st Z, r24
// configure timer 2 for phase correct pwm (8-bit)
#if defined(TCCR2) && defined(WGM20)
sbi(TCCR2, WGM20);
#elif defined(TCCR2A) && defined(WGM20)
sbi(TCCR2A, WGM20);
468: e0 eb ldi r30, 0xB0 ; 176
46a: f0 e0 ldi r31, 0x00 ; 0
46c: 80 81 ld r24, Z
46e: 81 60 ori r24, 0x01 ; 1
470: 80 83 st Z, r24
#if defined(ADCSRA)
// set a2d prescale factor to 128
// 16 MHz / 128 = 125 KHz, inside the desired 50-200 KHz range.
// XXX: this will not work properly for other clock speeds, and
// this code should use F_CPU to determine the prescale factor.
sbi(ADCSRA, ADPS2);
472: ea e7 ldi r30, 0x7A ; 122
474: f0 e0 ldi r31, 0x00 ; 0
476: 80 81 ld r24, Z
478: 84 60 ori r24, 0x04 ; 4
47a: 80 83 st Z, r24
sbi(ADCSRA, ADPS1);
47c: 80 81 ld r24, Z
47e: 82 60 ori r24, 0x02 ; 2
480: 80 83 st Z, r24
sbi(ADCSRA, ADPS0);
482: 80 81 ld r24, Z
484: 81 60 ori r24, 0x01 ; 1
486: 80 83 st Z, r24
// enable a2d conversions
sbi(ADCSRA, ADEN);
488: 80 81 ld r24, Z
48a: 80 68 ori r24, 0x80 ; 128
48c: 80 83 st Z, r24
// here so they can be used as normal digital i/o; they will be
// reconnected in Serial.begin()
#if defined(UCSRB)
UCSRB = 0;
#elif defined(UCSR0B)
UCSR0B = 0;
48e: 10 92 c1 00 sts 0x00C1, r1
#endif
}
492: 08 95 ret
00000494 <delay>:
return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
}
void delay(unsigned long ms)
{
494: ef 92 push r14
496: ff 92 push r15
498: 0f 93 push r16
49a: 1f 93 push r17
49c: cf 93 push r28
49e: df 93 push r29
4a0: 7b 01 movw r14, r22
4a2: 8c 01 movw r16, r24
return m;
}
unsigned long micros() {
unsigned long m;
uint8_t oldSREG = SREG, t;
4a4: 3f b7 in r19, 0x3f ; 63
cli();
4a6: f8 94 cli
m = timer0_overflow_count;
4a8: 80 91 e0 01 lds r24, 0x01E0
4ac: 90 91 e1 01 lds r25, 0x01E1
4b0: a0 91 e2 01 lds r26, 0x01E2
4b4: b0 91 e3 01 lds r27, 0x01E3
#if defined(TCNT0)
t = TCNT0;
4b8: 26 b5 in r18, 0x26 ; 38
#error TIMER 0 not defined
#endif
#ifdef TIFR0
if ((TIFR0 & _BV(TOV0)) && (t < 255))
4ba: a8 9b sbis 0x15, 0 ; 21
4bc: 05 c0 rjmp .+10 ; 0x4c8 <delay+0x34>
4be: 2f 3f cpi r18, 0xFF ; 255
4c0: 19 f0 breq .+6 ; 0x4c8 <delay+0x34>
m++;
4c2: 01 96 adiw r24, 0x01 ; 1
4c4: a1 1d adc r26, r1
4c6: b1 1d adc r27, r1
#else
if ((TIFR & _BV(TOV0)) && (t < 255))
m++;
#endif
SREG = oldSREG;
4c8: 3f bf out 0x3f, r19 ; 63
return ((m << 8) + t) * (64 / clockCyclesPerMicrosecond());
}
void delay(unsigned long ms)
{
uint16_t start = (uint16_t)micros();
4ca: ba 2f mov r27, r26
4cc: a9 2f mov r26, r25
4ce: 98 2f mov r25, r24
4d0: 88 27 eor r24, r24
4d2: 82 0f add r24, r18
4d4: 91 1d adc r25, r1
4d6: a1 1d adc r26, r1
4d8: b1 1d adc r27, r1
4da: 52 e0 ldi r21, 0x02 ; 2
4dc: 88 0f add r24, r24
4de: 99 1f adc r25, r25
4e0: aa 1f adc r26, r26
4e2: bb 1f adc r27, r27
4e4: 5a 95 dec r21
4e6: d1 f7 brne .-12 ; 0x4dc <delay+0x48>
4e8: ec 01 movw r28, r24
4ea: 30 c0 rjmp .+96 ; 0x54c <delay+0xb8>
while (ms > 0) {
yield();
4ec: 0e 94 8e 05 call 0xb1c ; 0xb1c <yield>
return m;
}
unsigned long micros() {
unsigned long m;
uint8_t oldSREG = SREG, t;
4f0: 3f b7 in r19, 0x3f ; 63
cli();
4f2: f8 94 cli
m = timer0_overflow_count;
4f4: 80 91 e0 01 lds r24, 0x01E0
4f8: 90 91 e1 01 lds r25, 0x01E1
4fc: a0 91 e2 01 lds r26, 0x01E2
500: b0 91 e3 01 lds r27, 0x01E3
#if defined(TCNT0)
t = TCNT0;
504: 26 b5 in r18, 0x26 ; 38
#error TIMER 0 not defined
#endif
#ifdef TIFR0
if ((TIFR0 & _BV(TOV0)) && (t < 255))
506: a8 9b sbis 0x15, 0 ; 21
508: 05 c0 rjmp .+10 ; 0x514 <delay+0x80>
50a: 2f 3f cpi r18, 0xFF ; 255
50c: 19 f0 breq .+6 ; 0x514 <delay+0x80>
m++;
50e: 01 96 adiw r24, 0x01 ; 1
510: a1 1d adc r26, r1
512: b1 1d adc r27, r1
#else
if ((TIFR & _BV(TOV0)) && (t < 255))
m++;
#endif
SREG = oldSREG;
514: 3f bf out 0x3f, r19 ; 63
{
uint16_t start = (uint16_t)micros();
while (ms > 0) {
yield();
if (((uint16_t)micros() - start) >= 1000) {
516: ba 2f mov r27, r26
518: a9 2f mov r26, r25
51a: 98 2f mov r25, r24
51c: 88 27 eor r24, r24
51e: 82 0f add r24, r18
520: 91 1d adc r25, r1
522: a1 1d adc r26, r1
524: b1 1d adc r27, r1
526: 32 e0 ldi r19, 0x02 ; 2
528: 88 0f add r24, r24
52a: 99 1f adc r25, r25
52c: aa 1f adc r26, r26
52e: bb 1f adc r27, r27
530: 3a 95 dec r19
532: d1 f7 brne .-12 ; 0x528 <delay+0x94>
534: 8c 1b sub r24, r28
536: 9d 0b sbc r25, r29
538: 88 5e subi r24, 0xE8 ; 232
53a: 93 40 sbci r25, 0x03 ; 3
53c: b8 f2 brcs .-82 ; 0x4ec <delay+0x58>
ms--;
53e: 08 94 sec
540: e1 08 sbc r14, r1
542: f1 08 sbc r15, r1
544: 01 09 sbc r16, r1
546: 11 09 sbc r17, r1
start += 1000;
548: c8 51 subi r28, 0x18 ; 24
54a: dc 4f sbci r29, 0xFC ; 252
void delay(unsigned long ms)
{
uint16_t start = (uint16_t)micros();
while (ms > 0) {
54c: e1 14 cp r14, r1
54e: f1 04 cpc r15, r1
550: 01 05 cpc r16, r1
552: 11 05 cpc r17, r1
554: 59 f6 brne .-106 ; 0x4ec <delay+0x58>
if (((uint16_t)micros() - start) >= 1000) {
ms--;
start += 1000;
}
}
}
556: df 91 pop r29
558: cf 91 pop r28
55a: 1f 91 pop r17
55c: 0f 91 pop r16
55e: ff 90 pop r15
560: ef 90 pop r14
562: 08 95 ret
00000564 <pinMode>:
#define ARDUINO_MAIN
#include "wiring_private.h"
#include "pins_arduino.h"
void pinMode(uint8_t pin, uint8_t mode)
{
564: cf 93 push r28
566: df 93 push r29
uint8_t bit = digitalPinToBitMask(pin);
568: 48 2f mov r20, r24
56a: 50 e0 ldi r21, 0x00 ; 0
56c: ca 01 movw r24, r20
56e: 80 5b subi r24, 0xB0 ; 176
570: 9e 4f sbci r25, 0xFE ; 254
572: fc 01 movw r30, r24
574: 34 91 lpm r19, Z+
uint8_t port = digitalPinToPort(pin);
576: 44 5c subi r20, 0xC4 ; 196
578: 5e 4f sbci r21, 0xFE ; 254
57a: fa 01 movw r30, r20
57c: 84 91 lpm r24, Z+
volatile uint8_t *reg, *out;
if (port == NOT_A_PIN) return;
57e: 88 23 and r24, r24
580: 69 f1 breq .+90 ; 0x5dc <pinMode+0x78>
// JWS: can I let the optimizer do this?
reg = portModeRegister(port);
582: 90 e0 ldi r25, 0x00 ; 0
584: 88 0f add r24, r24
586: 99 1f adc r25, r25
588: fc 01 movw r30, r24
58a: e2 5e subi r30, 0xE2 ; 226
58c: fe 4f sbci r31, 0xFE ; 254
58e: a5 91 lpm r26, Z+
590: b4 91 lpm r27, Z+
out = portOutputRegister(port);
592: fc 01 movw r30, r24
594: e8 5d subi r30, 0xD8 ; 216
596: fe 4f sbci r31, 0xFE ; 254
598: c5 91 lpm r28, Z+
59a: d4 91 lpm r29, Z+
if (mode == INPUT) {
59c: 66 23 and r22, r22
59e: 51 f4 brne .+20 ; 0x5b4 <pinMode+0x50>
uint8_t oldSREG = SREG;
5a0: 2f b7 in r18, 0x3f ; 63
cli();
5a2: f8 94 cli
*reg &= ~bit;
5a4: 8c 91 ld r24, X
5a6: 93 2f mov r25, r19
5a8: 90 95 com r25
5aa: 89 23 and r24, r25
5ac: 8c 93 st X, r24
*out &= ~bit;
5ae: 88 81 ld r24, Y
5b0: 89 23 and r24, r25
5b2: 0b c0 rjmp .+22 ; 0x5ca <pinMode+0x66>
SREG = oldSREG;
} else if (mode == INPUT_PULLUP) {
5b4: 62 30 cpi r22, 0x02 ; 2
5b6: 61 f4 brne .+24 ; 0x5d0 <pinMode+0x6c>
uint8_t oldSREG = SREG;
5b8: 2f b7 in r18, 0x3f ; 63
cli();
5ba: f8 94 cli
*reg &= ~bit;
5bc: 8c 91 ld r24, X
5be: 93 2f mov r25, r19
5c0: 90 95 com r25
5c2: 89 23 and r24, r25
5c4: 8c 93 st X, r24
*out |= bit;
5c6: 88 81 ld r24, Y
5c8: 83 2b or r24, r19
5ca: 88 83 st Y, r24
SREG = oldSREG;
5cc: 2f bf out 0x3f, r18 ; 63
5ce: 06 c0 rjmp .+12 ; 0x5dc <pinMode+0x78>
} else {
uint8_t oldSREG = SREG;
5d0: 9f b7 in r25, 0x3f ; 63
cli();
5d2: f8 94 cli
*reg |= bit;
5d4: 8c 91 ld r24, X
5d6: 83 2b or r24, r19
5d8: 8c 93 st X, r24
SREG = oldSREG;
5da: 9f bf out 0x3f, r25 ; 63
}
}
5dc: df 91 pop r29
5de: cf 91 pop r28
5e0: 08 95 ret
000005e2 <digitalWrite>:
}
}
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
5e2: 48 2f mov r20, r24
5e4: 50 e0 ldi r21, 0x00 ; 0
5e6: ca 01 movw r24, r20
5e8: 8c 59 subi r24, 0x9C ; 156
5ea: 9e 4f sbci r25, 0xFE ; 254
5ec: fc 01 movw r30, r24
5ee: 24 91 lpm r18, Z+
uint8_t bit = digitalPinToBitMask(pin);
5f0: ca 01 movw r24, r20
5f2: 80 5b subi r24, 0xB0 ; 176
5f4: 9e 4f sbci r25, 0xFE ; 254
5f6: fc 01 movw r30, r24
5f8: 94 91 lpm r25, Z+
uint8_t port = digitalPinToPort(pin);
5fa: 44 5c subi r20, 0xC4 ; 196
5fc: 5e 4f sbci r21, 0xFE ; 254
5fe: fa 01 movw r30, r20
600: 34 91 lpm r19, Z+
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
602: 33 23 and r19, r19
604: 09 f4 brne .+2 ; 0x608 <digitalWrite+0x26>
606: 40 c0 rjmp .+128 ; 0x688 <digitalWrite+0xa6>
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
608: 22 23 and r18, r18
60a: 51 f1 breq .+84 ; 0x660 <digitalWrite+0x7e>
//
//static inline void turnOffPWM(uint8_t timer) __attribute__ ((always_inline));
//static inline void turnOffPWM(uint8_t timer)
static void turnOffPWM(uint8_t timer)
{
switch (timer)
60c: 23 30 cpi r18, 0x03 ; 3
60e: 71 f0 breq .+28 ; 0x62c <digitalWrite+0x4a>
610: 24 30 cpi r18, 0x04 ; 4
612: 28 f4 brcc .+10 ; 0x61e <digitalWrite+0x3c>
614: 21 30 cpi r18, 0x01 ; 1
616: a1 f0 breq .+40 ; 0x640 <digitalWrite+0x5e>
618: 22 30 cpi r18, 0x02 ; 2
61a: 11 f5 brne .+68 ; 0x660 <digitalWrite+0x7e>
61c: 14 c0 rjmp .+40 ; 0x646 <digitalWrite+0x64>
61e: 26 30 cpi r18, 0x06 ; 6
620: b1 f0 breq .+44 ; 0x64e <digitalWrite+0x6c>
622: 27 30 cpi r18, 0x07 ; 7
624: c1 f0 breq .+48 ; 0x656 <digitalWrite+0x74>
626: 24 30 cpi r18, 0x04 ; 4
628: d9 f4 brne .+54 ; 0x660 <digitalWrite+0x7e>
62a: 04 c0 rjmp .+8 ; 0x634 <digitalWrite+0x52>
{
#if defined(TCCR1A) && defined(COM1A1)
case TIMER1A: cbi(TCCR1A, COM1A1); break;
62c: 80 91 80 00 lds r24, 0x0080
630: 8f 77 andi r24, 0x7F ; 127
632: 03 c0 rjmp .+6 ; 0x63a <digitalWrite+0x58>
#endif
#if defined(TCCR1A) && defined(COM1B1)
case TIMER1B: cbi(TCCR1A, COM1B1); break;
634: 80 91 80 00 lds r24, 0x0080
638: 8f 7d andi r24, 0xDF ; 223
63a: 80 93 80 00 sts 0x0080, r24
63e: 10 c0 rjmp .+32 ; 0x660 <digitalWrite+0x7e>
#if defined(TCCR2) && defined(COM21)
case TIMER2: cbi(TCCR2, COM21); break;
#endif
#if defined(TCCR0A) && defined(COM0A1)
case TIMER0A: cbi(TCCR0A, COM0A1); break;
640: 84 b5 in r24, 0x24 ; 36
642: 8f 77 andi r24, 0x7F ; 127
644: 02 c0 rjmp .+4 ; 0x64a <digitalWrite+0x68>
#endif
#if defined(TIMER0B) && defined(COM0B1)
case TIMER0B: cbi(TCCR0A, COM0B1); break;
646: 84 b5 in r24, 0x24 ; 36
648: 8f 7d andi r24, 0xDF ; 223
64a: 84 bd out 0x24, r24 ; 36
64c: 09 c0 rjmp .+18 ; 0x660 <digitalWrite+0x7e>
#endif
#if defined(TCCR2A) && defined(COM2A1)
case TIMER2A: cbi(TCCR2A, COM2A1); break;
64e: 80 91 b0 00 lds r24, 0x00B0
652: 8f 77 andi r24, 0x7F ; 127
654: 03 c0 rjmp .+6 ; 0x65c <digitalWrite+0x7a>
#endif
#if defined(TCCR2A) && defined(COM2B1)
case TIMER2B: cbi(TCCR2A, COM2B1); break;
656: 80 91 b0 00 lds r24, 0x00B0
65a: 8f 7d andi r24, 0xDF ; 223
65c: 80 93 b0 00 sts 0x00B0, r24
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
660: e3 2f mov r30, r19
662: f0 e0 ldi r31, 0x00 ; 0
664: ee 0f add r30, r30
666: ff 1f adc r31, r31
668: e8 5d subi r30, 0xD8 ; 216
66a: fe 4f sbci r31, 0xFE ; 254
66c: a5 91 lpm r26, Z+
66e: b4 91 lpm r27, Z+
uint8_t oldSREG = SREG;
670: 2f b7 in r18, 0x3f ; 63
cli();
672: f8 94 cli
if (val == LOW) {
674: 66 23 and r22, r22
676: 21 f4 brne .+8 ; 0x680 <digitalWrite+0x9e>
*out &= ~bit;
678: 8c 91 ld r24, X
67a: 90 95 com r25
67c: 89 23 and r24, r25
67e: 02 c0 rjmp .+4 ; 0x684 <digitalWrite+0xa2>
} else {
*out |= bit;
680: 8c 91 ld r24, X
682: 89 2b or r24, r25
684: 8c 93 st X, r24
}
SREG = oldSREG;
686: 2f bf out 0x3f, r18 ; 63
688: 08 95 ret
0000068a <__vector_18>:
#define serialEvent_implemented
#if defined(USART_RX_vect)
SIGNAL(USART_RX_vect)
68a: 1f 92 push r1
68c: 0f 92 push r0
68e: 0f b6 in r0, 0x3f ; 63
690: 0f 92 push r0
692: 11 24 eor r1, r1
694: 2f 93 push r18
696: 3f 93 push r19
698: 4f 93 push r20
69a: 8f 93 push r24
69c: 9f 93 push r25
69e: ef 93 push r30
6a0: ff 93 push r31
#elif defined(SIG_UART_RECV)
SIGNAL(SIG_UART_RECV)
#endif
{
#if defined(UDR0)
if (bit_is_clear(UCSR0A, UPE0)) {
6a2: 80 91 c0 00 lds r24, 0x00C0
6a6: 82 fd sbrc r24, 2
6a8: 1d c0 rjmp .+58 ; 0x6e4 <__vector_18+0x5a>
unsigned char c = UDR0;
6aa: 40 91 c6 00 lds r20, 0x00C6
ring_buffer tx_buffer3 = { { 0 }, 0, 0 };
#endif
inline void store_char(unsigned char c, ring_buffer *buffer)
{
int i = (unsigned int)(buffer->head + 1) % SERIAL_BUFFER_SIZE;
6ae: 20 91 29 02 lds r18, 0x0229
6b2: 30 91 2a 02 lds r19, 0x022A
// if we should be storing the received character into the location
// just before the tail (meaning that the head would advance to the
// current location of the tail), we're about to overflow the buffer
// and so we don't write the character or advance the head.
if (i != buffer->tail) {
6b6: 2f 5f subi r18, 0xFF ; 255
6b8: 3f 4f sbci r19, 0xFF ; 255
6ba: 2f 73 andi r18, 0x3F ; 63
6bc: 30 70 andi r19, 0x00 ; 0
6be: 80 91 2b 02 lds r24, 0x022B
6c2: 90 91 2c 02 lds r25, 0x022C
6c6: 28 17 cp r18, r24
6c8: 39 07 cpc r19, r25
6ca: 71 f0 breq .+28 ; 0x6e8 <__vector_18+0x5e>
buffer->buffer[buffer->head] = c;
6cc: e0 91 29 02 lds r30, 0x0229
6d0: f0 91 2a 02 lds r31, 0x022A
6d4: e7 51 subi r30, 0x17 ; 23
6d6: fe 4f sbci r31, 0xFE ; 254
6d8: 40 83 st Z, r20
buffer->head = i;
6da: 30 93 2a 02 sts 0x022A, r19
6de: 20 93 29 02 sts 0x0229, r18
6e2: 02 c0 rjmp .+4 ; 0x6e8 <__vector_18+0x5e>
#if defined(UDR0)
if (bit_is_clear(UCSR0A, UPE0)) {
unsigned char c = UDR0;
store_char(c, &rx_buffer);
} else {
unsigned char c = UDR0;
6e4: 80 91 c6 00 lds r24, 0x00C6
unsigned char c = UDR;
};
#else
#error UDR not defined
#endif
}
6e8: ff 91 pop r31
6ea: ef 91 pop r30
6ec: 9f 91 pop r25
6ee: 8f 91 pop r24
6f0: 4f 91 pop r20
6f2: 3f 91 pop r19
6f4: 2f 91 pop r18
6f6: 0f 90 pop r0
6f8: 0f be out 0x3f, r0 ; 63
6fa: 0f 90 pop r0
6fc: 1f 90 pop r1
6fe: 18 95 reti
00000700 <_Z14serialEventRunv>:
_rx_buffer->head = _rx_buffer->tail;
}
int HardwareSerial::available(void)
{
return (unsigned int)(SERIAL_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % SERIAL_BUFFER_SIZE;
700: e0 91 7d 02 lds r30, 0x027D
704: f0 91 7e 02 lds r31, 0x027E
708: e0 5c subi r30, 0xC0 ; 192
70a: ff 4f sbci r31, 0xFF ; 255
70c: 81 91 ld r24, Z+
70e: 91 91 ld r25, Z+
710: 20 81 ld r18, Z
712: 31 81 ldd r19, Z+1 ; 0x01
#endif
void serialEventRun(void)
{
#ifdef serialEvent_implemented
if (Serial.available()) serialEvent();
714: 82 1b sub r24, r18
716: 93 0b sbc r25, r19
718: 8f 73 andi r24, 0x3F ; 63
71a: 90 70 andi r25, 0x00 ; 0
71c: 89 2b or r24, r25
71e: 11 f0 breq .+4 ; 0x724 <_Z14serialEventRunv+0x24>
720: 0e 94 2f 01 call 0x25e ; 0x25e <_Z11serialEventv>
724: 08 95 ret
00000726 <__vector_19>:
#elif defined(UART_UDRE_vect)
ISR(UART_UDRE_vect)
#elif defined(USART0_UDRE_vect)
ISR(USART0_UDRE_vect)
#elif defined(USART_UDRE_vect)
ISR(USART_UDRE_vect)
726: 1f 92 push r1
728: 0f 92 push r0
72a: 0f b6 in r0, 0x3f ; 63
72c: 0f 92 push r0
72e: 11 24 eor r1, r1
730: 2f 93 push r18
732: 3f 93 push r19
734: 8f 93 push r24
736: 9f 93 push r25
738: ef 93 push r30
73a: ff 93 push r31
#endif
{
if (tx_buffer.head == tx_buffer.tail) {
73c: 20 91 6d 02 lds r18, 0x026D
740: 30 91 6e 02 lds r19, 0x026E
744: 80 91 6f 02 lds r24, 0x026F
748: 90 91 70 02 lds r25, 0x0270
74c: 28 17 cp r18, r24
74e: 39 07 cpc r19, r25
750: 31 f4 brne .+12 ; 0x75e <__vector_19+0x38>
// Buffer empty, so disable interrupts
#if defined(UCSR0B)
cbi(UCSR0B, UDRIE0);
752: 80 91 c1 00 lds r24, 0x00C1
756: 8f 7d andi r24, 0xDF ; 223
758: 80 93 c1 00 sts 0x00C1, r24
75c: 14 c0 rjmp .+40 ; 0x786 <__vector_19+0x60>
cbi(UCSRB, UDRIE);
#endif
}
else {
// There is more data in the output buffer. Send the next byte
unsigned char c = tx_buffer.buffer[tx_buffer.tail];
75e: e0 91 6f 02 lds r30, 0x026F
762: f0 91 70 02 lds r31, 0x0270
766: e3 5d subi r30, 0xD3 ; 211
768: fd 4f sbci r31, 0xFD ; 253
76a: 20 81 ld r18, Z
tx_buffer.tail = (tx_buffer.tail + 1) % SERIAL_BUFFER_SIZE;
76c: 80 91 6f 02 lds r24, 0x026F
770: 90 91 70 02 lds r25, 0x0270
774: 01 96 adiw r24, 0x01 ; 1
776: 8f 73 andi r24, 0x3F ; 63
778: 90 70 andi r25, 0x00 ; 0
77a: 90 93 70 02 sts 0x0270, r25
77e: 80 93 6f 02 sts 0x026F, r24
#if defined(UDR0)
UDR0 = c;
782: 20 93 c6 00 sts 0x00C6, r18
UDR = c;
#else
#error UDR not defined
#endif
}
}
786: ff 91 pop r31
788: ef 91 pop r30
78a: 9f 91 pop r25
78c: 8f 91 pop r24
78e: 3f 91 pop r19
790: 2f 91 pop r18
792: 0f 90 pop r0
794: 0f be out 0x3f, r0 ; 63
796: 0f 90 pop r0
798: 1f 90 pop r1
79a: 18 95 reti
0000079c <_ZN14HardwareSerial5beginEm>:
_u2x = u2x;
}
// Public Methods //////////////////////////////////////////////////////////////
void HardwareSerial::begin(unsigned long baud)
79c: af 92 push r10
79e: bf 92 push r11
7a0: df 92 push r13
7a2: ef 92 push r14
7a4: ff 92 push r15
7a6: 0f 93 push r16
7a8: 1f 93 push r17
7aa: cf 93 push r28
7ac: df 93 push r29
7ae: ec 01 movw r28, r24
7b0: 7a 01 movw r14, r20
7b2: 8b 01 movw r16, r22
7b4: dd 24 eor r13, r13
7b6: 40 30 cpi r20, 0x00 ; 0
7b8: 81 ee ldi r24, 0xE1 ; 225
7ba: 58 07 cpc r21, r24
7bc: 80 e0 ldi r24, 0x00 ; 0
7be: 68 07 cpc r22, r24
7c0: 80 e0 ldi r24, 0x00 ; 0
7c2: 78 07 cpc r23, r24
7c4: 11 f0 breq .+4 ; 0x7ca <_ZN14HardwareSerial5beginEm+0x2e>
7c6: dd 24 eor r13, r13
7c8: d3 94 inc r13
#endif
try_again:
if (use_u2x) {
*_ucsra = 1 << _u2x;
7ca: 91 e0 ldi r25, 0x01 ; 1
7cc: a9 2e mov r10, r25
7ce: b1 2c mov r11, r1
7d0: ec 89 ldd r30, Y+20 ; 0x14
7d2: fd 89 ldd r31, Y+21 ; 0x15
}
#endif
try_again:
if (use_u2x) {
7d4: dd 20 and r13, r13
7d6: 69 f0 breq .+26 ; 0x7f2 <_ZN14HardwareSerial5beginEm+0x56>
*_ucsra = 1 << _u2x;
7d8: c5 01 movw r24, r10
7da: 08 a0 ldd r0, Y+32 ; 0x20
7dc: 02 c0 rjmp .+4 ; 0x7e2 <_ZN14HardwareSerial5beginEm+0x46>
7de: 88 0f add r24, r24
7e0: 99 1f adc r25, r25
7e2: 0a 94 dec r0
7e4: e2 f7 brpl .-8 ; 0x7de <_ZN14HardwareSerial5beginEm+0x42>
7e6: 80 83 st Z, r24
baud_setting = (F_CPU / 4 / baud - 1) / 2;
7e8: 60 e0 ldi r22, 0x00 ; 0
7ea: 79 e0 ldi r23, 0x09 ; 9
7ec: 8d e3 ldi r24, 0x3D ; 61
7ee: 90 e0 ldi r25, 0x00 ; 0
7f0: 05 c0 rjmp .+10 ; 0x7fc <_ZN14HardwareSerial5beginEm+0x60>
} else {
*_ucsra = 0;
7f2: 10 82 st Z, r1
baud_setting = (F_CPU / 8 / baud - 1) / 2;
7f4: 60 e8 ldi r22, 0x80 ; 128
7f6: 74 e8 ldi r23, 0x84 ; 132
7f8: 8e e1 ldi r24, 0x1E ; 30
7fa: 90 e0 ldi r25, 0x00 ; 0
7fc: a8 01 movw r20, r16
7fe: 97 01 movw r18, r14
800: 0e 94 8f 05 call 0xb1e ; 0xb1e <__udivmodsi4>
804: 21 50 subi r18, 0x01 ; 1
806: 30 40 sbci r19, 0x00 ; 0
808: 40 40 sbci r20, 0x00 ; 0
80a: 50 40 sbci r21, 0x00 ; 0
80c: 56 95 lsr r21
80e: 47 95 ror r20
810: 37 95 ror r19
812: 27 95 ror r18
}
if ((baud_setting > 4095) && use_u2x)
814: 80 e1 ldi r24, 0x10 ; 16
816: 20 30 cpi r18, 0x00 ; 0
818: 38 07 cpc r19, r24
81a: 20 f0 brcs .+8 ; 0x824 <_ZN14HardwareSerial5beginEm+0x88>
81c: dd 20 and r13, r13
81e: 11 f0 breq .+4 ; 0x824 <_ZN14HardwareSerial5beginEm+0x88>
820: dd 24 eor r13, r13
822: d6 cf rjmp .-84 ; 0x7d0 <_ZN14HardwareSerial5beginEm+0x34>
use_u2x = false;
goto try_again;
}
// assign the baud_setting, a.k.a. ubbr (USART Baud Rate Register)
*_ubrrh = baud_setting >> 8;
824: e8 89 ldd r30, Y+16 ; 0x10
826: f9 89 ldd r31, Y+17 ; 0x11
828: 30 83 st Z, r19
*_ubrrl = baud_setting;
82a: ea 89 ldd r30, Y+18 ; 0x12
82c: fb 89 ldd r31, Y+19 ; 0x13
82e: 20 83 st Z, r18
transmitting = false;
830: 19 a2 std Y+33, r1 ; 0x21
sbi(*_ucsrb, _rxen);
832: ee 89 ldd r30, Y+22 ; 0x16
834: ff 89 ldd r31, Y+23 ; 0x17
836: 40 81 ld r20, Z
838: 21 e0 ldi r18, 0x01 ; 1
83a: 30 e0 ldi r19, 0x00 ; 0
83c: c9 01 movw r24, r18
83e: 0c 8c ldd r0, Y+28 ; 0x1c
840: 02 c0 rjmp .+4 ; 0x846 <_ZN14HardwareSerial5beginEm+0xaa>
842: 88 0f add r24, r24
844: 99 1f adc r25, r25
846: 0a 94 dec r0
848: e2 f7 brpl .-8 ; 0x842 <_ZN14HardwareSerial5beginEm+0xa6>
84a: 48 2b or r20, r24
84c: 40 83 st Z, r20
sbi(*_ucsrb, _txen);
84e: ee 89 ldd r30, Y+22 ; 0x16
850: ff 89 ldd r31, Y+23 ; 0x17
852: 40 81 ld r20, Z
854: c9 01 movw r24, r18
856: 0d 8c ldd r0, Y+29 ; 0x1d
858: 02 c0 rjmp .+4 ; 0x85e <_ZN14HardwareSerial5beginEm+0xc2>
85a: 88 0f add r24, r24
85c: 99 1f adc r25, r25
85e: 0a 94 dec r0
860: e2 f7 brpl .-8 ; 0x85a <_ZN14HardwareSerial5beginEm+0xbe>
862: 48 2b or r20, r24
864: 40 83 st Z, r20
sbi(*_ucsrb, _rxcie);
866: ee 89 ldd r30, Y+22 ; 0x16
868: ff 89 ldd r31, Y+23 ; 0x17
86a: 40 81 ld r20, Z
86c: c9 01 movw r24, r18
86e: 0e 8c ldd r0, Y+30 ; 0x1e
870: 02 c0 rjmp .+4 ; 0x876 <_ZN14HardwareSerial5beginEm+0xda>
872: 88 0f add r24, r24
874: 99 1f adc r25, r25
876: 0a 94 dec r0
878: e2 f7 brpl .-8 ; 0x872 <_ZN14HardwareSerial5beginEm+0xd6>
87a: 48 2b or r20, r24
87c: 40 83 st Z, r20
cbi(*_ucsrb, _udrie);
87e: ee 89 ldd r30, Y+22 ; 0x16
880: ff 89 ldd r31, Y+23 ; 0x17
882: 80 81 ld r24, Z
884: 0f 8c ldd r0, Y+31 ; 0x1f
886: 02 c0 rjmp .+4 ; 0x88c <_ZN14HardwareSerial5beginEm+0xf0>
888: 22 0f add r18, r18
88a: 33 1f adc r19, r19
88c: 0a 94 dec r0
88e: e2 f7 brpl .-8 ; 0x888 <_ZN14HardwareSerial5beginEm+0xec>
890: 20 95 com r18
892: 28 23 and r18, r24
894: 20 83 st Z, r18
}
896: df 91 pop r29
898: cf 91 pop r28
89a: 1f 91 pop r17
89c: 0f 91 pop r16
89e: ff 90 pop r15
8a0: ef 90 pop r14
8a2: df 90 pop r13
8a4: bf 90 pop r11
8a6: af 90 pop r10
8a8: 08 95 ret
000008aa <_ZN14HardwareSerial9availableEv>:
_rx_buffer->head = _rx_buffer->tail;
}
int HardwareSerial::available(void)
{
return (unsigned int)(SERIAL_BUFFER_SIZE + _rx_buffer->head - _rx_buffer->tail) % SERIAL_BUFFER_SIZE;
8aa: dc 01 movw r26, r24
8ac: 1c 96 adiw r26, 0x0c ; 12
8ae: ed 91 ld r30, X+
8b0: fc 91 ld r31, X
8b2: 1d 97 sbiw r26, 0x0d ; 13
8b4: e0 5c subi r30, 0xC0 ; 192
8b6: ff 4f sbci r31, 0xFF ; 255
8b8: 21 91 ld r18, Z+
8ba: 31 91 ld r19, Z+
8bc: 80 81 ld r24, Z
8be: 91 81 ldd r25, Z+1 ; 0x01
8c0: 28 1b sub r18, r24
8c2: 39 0b sbc r19, r25
8c4: 2f 73 andi r18, 0x3F ; 63
8c6: 30 70 andi r19, 0x00 ; 0
}
8c8: c9 01 movw r24, r18
8ca: 08 95 ret
000008cc <_ZN14HardwareSerial4peekEv>:
int HardwareSerial::peek(void)
{
if (_rx_buffer->head == _rx_buffer->tail) {
8cc: dc 01 movw r26, r24
8ce: 1c 96 adiw r26, 0x0c ; 12
8d0: ed 91 ld r30, X+
8d2: fc 91 ld r31, X
8d4: 1d 97 sbiw r26, 0x0d ; 13
8d6: e0 5c subi r30, 0xC0 ; 192
8d8: ff 4f sbci r31, 0xFF ; 255
8da: 20 81 ld r18, Z
8dc: 31 81 ldd r19, Z+1 ; 0x01
8de: e0 54 subi r30, 0x40 ; 64
8e0: f0 40 sbci r31, 0x00 ; 0
8e2: df 01 movw r26, r30
8e4: ae 5b subi r26, 0xBE ; 190
8e6: bf 4f sbci r27, 0xFF ; 255
8e8: 8d 91 ld r24, X+
8ea: 9c 91 ld r25, X
8ec: 11 97 sbiw r26, 0x01 ; 1
8ee: 28 17 cp r18, r24
8f0: 39 07 cpc r19, r25
8f2: 19 f4 brne .+6 ; 0x8fa <_ZN14HardwareSerial4peekEv+0x2e>
8f4: 2f ef ldi r18, 0xFF ; 255
8f6: 3f ef ldi r19, 0xFF ; 255
8f8: 07 c0 rjmp .+14 ; 0x908 <__stack+0x9>
return -1;
} else {
return _rx_buffer->buffer[_rx_buffer->tail];
8fa: 8d 91 ld r24, X+
8fc: 9c 91 ld r25, X
8fe: e8 0f add r30, r24
900: f9 1f adc r31, r25
902: 80 81 ld r24, Z
904: 28 2f mov r18, r24
906: 30 e0 ldi r19, 0x00 ; 0
}
}
908: c9 01 movw r24, r18
90a: 08 95 ret
0000090c <_ZN14HardwareSerial4readEv>:
int HardwareSerial::read(void)
{
// if the head isn't ahead of the tail, we don't have any characters
if (_rx_buffer->head == _rx_buffer->tail) {
90c: dc 01 movw r26, r24
90e: 1c 96 adiw r26, 0x0c ; 12
910: ed 91 ld r30, X+
912: fc 91 ld r31, X
914: 1d 97 sbiw r26, 0x0d ; 13
916: e0 5c subi r30, 0xC0 ; 192
918: ff 4f sbci r31, 0xFF ; 255
91a: 20 81 ld r18, Z
91c: 31 81 ldd r19, Z+1 ; 0x01
91e: e0 54 subi r30, 0x40 ; 64
920: f0 40 sbci r31, 0x00 ; 0
922: df 01 movw r26, r30
924: ae 5b subi r26, 0xBE ; 190
926: bf 4f sbci r27, 0xFF ; 255
928: 8d 91 ld r24, X+
92a: 9c 91 ld r25, X
92c: 11 97 sbiw r26, 0x01 ; 1
92e: 28 17 cp r18, r24
930: 39 07 cpc r19, r25
932: 19 f4 brne .+6 ; 0x93a <_ZN14HardwareSerial4readEv+0x2e>
934: 2f ef ldi r18, 0xFF ; 255
936: 3f ef ldi r19, 0xFF ; 255
938: 10 c0 rjmp .+32 ; 0x95a <_ZN14HardwareSerial4readEv+0x4e>
return -1;
} else {
unsigned char c = _rx_buffer->buffer[_rx_buffer->tail];
93a: 8d 91 ld r24, X+
93c: 9c 91 ld r25, X
93e: 11 97 sbiw r26, 0x01 ; 1
940: e8 0f add r30, r24
942: f9 1f adc r31, r25
944: 20 81 ld r18, Z
_rx_buffer->tail = (unsigned int)(_rx_buffer->tail + 1) % SERIAL_BUFFER_SIZE;
946: 8d 91 ld r24, X+
948: 9c 91 ld r25, X
94a: 11 97 sbiw r26, 0x01 ; 1
94c: 01 96 adiw r24, 0x01 ; 1
94e: 8f 73 andi r24, 0x3F ; 63
950: 90 70 andi r25, 0x00 ; 0
952: 11 96 adiw r26, 0x01 ; 1
954: 9c 93 st X, r25
956: 8e 93 st -X, r24
return c;
958: 30 e0 ldi r19, 0x00 ; 0
}
}
95a: c9 01 movw r24, r18
95c: 08 95 ret
0000095e <_ZN14HardwareSerial5flushEv>:
void HardwareSerial::flush()
95e: dc 01 movw r26, r24
{
// UDR is kept full while the buffer is not empty, so TXC triggers when EMPTY && SENT
while (transmitting && ! (*_ucsra & _BV(TXC0)));
960: 91 96 adiw r26, 0x21 ; 33
962: 8c 91 ld r24, X
964: 91 97 sbiw r26, 0x21 ; 33
966: 88 23 and r24, r24
968: 39 f0 breq .+14 ; 0x978 <_ZN14HardwareSerial5flushEv+0x1a>
96a: 54 96 adiw r26, 0x14 ; 20
96c: ed 91 ld r30, X+
96e: fc 91 ld r31, X
970: 55 97 sbiw r26, 0x15 ; 21
972: 80 81 ld r24, Z
974: 86 ff sbrs r24, 6
976: f9 cf rjmp .-14 ; 0x96a <_ZN14HardwareSerial5flushEv+0xc>
transmitting = false;
978: 91 96 adiw r26, 0x21 ; 33
97a: 1c 92 st X, r1
}
97c: 08 95 ret
0000097e <_ZN14HardwareSerial5writeEh>:
size_t HardwareSerial::write(uint8_t c)
97e: cf 93 push r28
980: df 93 push r29
982: ec 01 movw r28, r24
{
int i = (_tx_buffer->head + 1) % SERIAL_BUFFER_SIZE;
984: ee 85 ldd r30, Y+14 ; 0x0e
986: ff 85 ldd r31, Y+15 ; 0x0f
988: e0 5c subi r30, 0xC0 ; 192
98a: ff 4f sbci r31, 0xFF ; 255
98c: 20 81 ld r18, Z
98e: 31 81 ldd r19, Z+1 ; 0x01
990: e0 54 subi r30, 0x40 ; 64
992: f0 40 sbci r31, 0x00 ; 0
994: 2f 5f subi r18, 0xFF ; 255
996: 3f 4f sbci r19, 0xFF ; 255
998: 2f 73 andi r18, 0x3F ; 63
99a: 30 70 andi r19, 0x00 ; 0
// If the output buffer is full, there's nothing for it other than to
// wait for the interrupt handler to empty it a bit
// ???: return 0 here instead?
while (i == _tx_buffer->tail)
99c: df 01 movw r26, r30
99e: ae 5b subi r26, 0xBE ; 190
9a0: bf 4f sbci r27, 0xFF ; 255
9a2: 8d 91 ld r24, X+
9a4: 9c 91 ld r25, X
9a6: 11 97 sbiw r26, 0x01 ; 1
9a8: 28 17 cp r18, r24
9aa: 39 07 cpc r19, r25
9ac: d1 f3 breq .-12 ; 0x9a2 <_ZN14HardwareSerial5writeEh+0x24>
;
_tx_buffer->buffer[_tx_buffer->head] = c;
9ae: e0 5c subi r30, 0xC0 ; 192
9b0: ff 4f sbci r31, 0xFF ; 255
9b2: 80 81 ld r24, Z
9b4: 91 81 ldd r25, Z+1 ; 0x01
9b6: e0 54 subi r30, 0x40 ; 64
9b8: f0 40 sbci r31, 0x00 ; 0
9ba: e8 0f add r30, r24
9bc: f9 1f adc r31, r25
9be: 60 83 st Z, r22
_tx_buffer->head = i;
9c0: ee 85 ldd r30, Y+14 ; 0x0e
9c2: ff 85 ldd r31, Y+15 ; 0x0f
9c4: e0 5c subi r30, 0xC0 ; 192
9c6: ff 4f sbci r31, 0xFF ; 255
9c8: 31 83 std Z+1, r19 ; 0x01
9ca: 20 83 st Z, r18
sbi(*_ucsrb, _udrie);
9cc: ee 89 ldd r30, Y+22 ; 0x16
9ce: ff 89 ldd r31, Y+23 ; 0x17
9d0: 20 81 ld r18, Z
9d2: 81 e0 ldi r24, 0x01 ; 1
9d4: 90 e0 ldi r25, 0x00 ; 0
9d6: 0f 8c ldd r0, Y+31 ; 0x1f
9d8: 02 c0 rjmp .+4 ; 0x9de <_ZN14HardwareSerial5writeEh+0x60>
9da: 88 0f add r24, r24
9dc: 99 1f adc r25, r25
9de: 0a 94 dec r0
9e0: e2 f7 brpl .-8 ; 0x9da <_ZN14HardwareSerial5writeEh+0x5c>
9e2: 28 2b or r18, r24
9e4: 20 83 st Z, r18
// clear the TXC bit -- "can be cleared by writing a one to its bit location"
transmitting = true;
9e6: 81 e0 ldi r24, 0x01 ; 1
9e8: 89 a3 std Y+33, r24 ; 0x21
sbi(*_ucsra, TXC0);
9ea: ec 89 ldd r30, Y+20 ; 0x14
9ec: fd 89 ldd r31, Y+21 ; 0x15
9ee: 80 81 ld r24, Z
9f0: 80 64 ori r24, 0x40 ; 64
9f2: 80 83 st Z, r24
return 1;
}
9f4: 81 e0 ldi r24, 0x01 ; 1
9f6: 90 e0 ldi r25, 0x00 ; 0
9f8: df 91 pop r29
9fa: cf 91 pop r28
9fc: 08 95 ret
000009fe <_GLOBAL__I_rx_buffer>:
size_t printNumber(unsigned long, uint8_t);
size_t printFloat(double, uint8_t);
protected:
void setWriteError(int err = 1) { write_error = err; }
public:
Print() : write_error(0) {}
9fe: 10 92 74 02 sts 0x0274, r1
a02: 10 92 73 02 sts 0x0273, r1
virtual int available() = 0;
virtual int read() = 0;
virtual int peek() = 0;
virtual void flush() = 0;
Stream() {_timeout=1000;}
a06: 88 ee ldi r24, 0xE8 ; 232
a08: 93 e0 ldi r25, 0x03 ; 3
a0a: a0 e0 ldi r26, 0x00 ; 0
a0c: b0 e0 ldi r27, 0x00 ; 0
a0e: 80 93 75 02 sts 0x0275, r24
a12: 90 93 76 02 sts 0x0276, r25
a16: a0 93 77 02 sts 0x0277, r26
a1a: b0 93 78 02 sts 0x0278, r27
HardwareSerial::HardwareSerial(ring_buffer *rx_buffer, ring_buffer *tx_buffer,
volatile uint8_t *ubrrh, volatile uint8_t *ubrrl,
volatile uint8_t *ucsra, volatile uint8_t *ucsrb,
volatile uint8_t *ucsrc, volatile uint8_t *udr,
uint8_t rxen, uint8_t txen, uint8_t rxcie, uint8_t udrie, uint8_t u2x)
a1e: 84 ed ldi r24, 0xD4 ; 212
a20: 91 e0 ldi r25, 0x01 ; 1
a22: 90 93 72 02 sts 0x0272, r25
a26: 80 93 71 02 sts 0x0271, r24
{
_rx_buffer = rx_buffer;
a2a: 89 ee ldi r24, 0xE9 ; 233
a2c: 91 e0 ldi r25, 0x01 ; 1
a2e: 90 93 7e 02 sts 0x027E, r25
a32: 80 93 7d 02 sts 0x027D, r24
_tx_buffer = tx_buffer;
a36: 8d e2 ldi r24, 0x2D ; 45
a38: 92 e0 ldi r25, 0x02 ; 2
a3a: 90 93 80 02 sts 0x0280, r25
a3e: 80 93 7f 02 sts 0x027F, r24
_ubrrh = ubrrh;
a42: 85 ec ldi r24, 0xC5 ; 197
a44: 90 e0 ldi r25, 0x00 ; 0
a46: 90 93 82 02 sts 0x0282, r25
a4a: 80 93 81 02 sts 0x0281, r24
_ubrrl = ubrrl;
a4e: 84 ec ldi r24, 0xC4 ; 196
a50: 90 e0 ldi r25, 0x00 ; 0
a52: 90 93 84 02 sts 0x0284, r25
a56: 80 93 83 02 sts 0x0283, r24
_ucsra = ucsra;
a5a: 80 ec ldi r24, 0xC0 ; 192
a5c: 90 e0 ldi r25, 0x00 ; 0
a5e: 90 93 86 02 sts 0x0286, r25
a62: 80 93 85 02 sts 0x0285, r24
_ucsrb = ucsrb;
a66: 81 ec ldi r24, 0xC1 ; 193
a68: 90 e0 ldi r25, 0x00 ; 0
a6a: 90 93 88 02 sts 0x0288, r25
a6e: 80 93 87 02 sts 0x0287, r24
_ucsrc = ucsrc;
a72: 82 ec ldi r24, 0xC2 ; 194
a74: 90 e0 ldi r25, 0x00 ; 0
a76: 90 93 8a 02 sts 0x028A, r25
a7a: 80 93 89 02 sts 0x0289, r24
_udr = udr;
a7e: 86 ec ldi r24, 0xC6 ; 198
a80: 90 e0 ldi r25, 0x00 ; 0
a82: 90 93 8c 02 sts 0x028C, r25
a86: 80 93 8b 02 sts 0x028B, r24
_rxen = rxen;
a8a: 84 e0 ldi r24, 0x04 ; 4
a8c: 80 93 8d 02 sts 0x028D, r24
_txen = txen;
a90: 83 e0 ldi r24, 0x03 ; 3
a92: 80 93 8e 02 sts 0x028E, r24
_rxcie = rxcie;
a96: 87 e0 ldi r24, 0x07 ; 7
a98: 80 93 8f 02 sts 0x028F, r24
_udrie = udrie;
a9c: 85 e0 ldi r24, 0x05 ; 5
a9e: 80 93 90 02 sts 0x0290, r24
_u2x = u2x;
aa2: 81 e0 ldi r24, 0x01 ; 1
aa4: 80 93 91 02 sts 0x0291, r24
// Preinstantiate Objects //////////////////////////////////////////////////////
#if defined(UBRRH) && defined(UBRRL)
HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRRH, &UBRRL, &UCSRA, &UCSRB, &UCSRC, &UDR, RXEN, TXEN, RXCIE, UDRIE, U2X);
#elif defined(UBRR0H) && defined(UBRR0L)
HardwareSerial Serial(&rx_buffer, &tx_buffer, &UBRR0H, &UBRR0L, &UCSR0A, &UCSR0B, &UCSR0C, &UDR0, RXEN0, TXEN0, RXCIE0, UDRIE0, U2X0);
aa8: 08 95 ret
00000aaa <main>:
#include <Arduino.h>
int main(void)
aaa: cf 93 push r28
aac: df 93 push r29
{
init();
aae: 0e 94 0f 02 call 0x41e ; 0x41e <init>
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
ab2: 0e 94 b9 01 call 0x372 ; 0x372 <setup>
for (;;) {
loop();
if (serialEventRun) serialEventRun();
ab6: c0 e8 ldi r28, 0x80 ; 128
ab8: d3 e0 ldi r29, 0x03 ; 3
#endif
setup();
for (;;) {
loop();
aba: 0e 94 e7 00 call 0x1ce ; 0x1ce <loop>
if (serialEventRun) serialEventRun();
abe: 20 97 sbiw r28, 0x00 ; 0
ac0: e1 f3 breq .-8 ; 0xaba <main+0x10>
ac2: 0e 94 80 03 call 0x700 ; 0x700 <_Z14serialEventRunv>
ac6: f9 cf rjmp .-14 ; 0xaba <main+0x10>
00000ac8 <_ZN5Print5writeEPKhj>:
#include "Print.h"
// Public Methods //////////////////////////////////////////////////////////////
/* default implementation: may be overridden */
size_t Print::write(const uint8_t *buffer, size_t size)
ac8: cf 92 push r12
aca: df 92 push r13
acc: ef 92 push r14
ace: ff 92 push r15
ad0: 0f 93 push r16
ad2: 1f 93 push r17
ad4: cf 93 push r28
ad6: df 93 push r29
ad8: 7c 01 movw r14, r24
ada: 6b 01 movw r12, r22
adc: 8a 01 movw r16, r20
ade: c0 e0 ldi r28, 0x00 ; 0
ae0: d0 e0 ldi r29, 0x00 ; 0
ae2: 0f c0 rjmp .+30 ; 0xb02 <_ZN5Print5writeEPKhj+0x3a>
{
size_t n = 0;
while (size--) {
n += write(*buffer++);
ae4: d6 01 movw r26, r12
ae6: 6d 91 ld r22, X+
ae8: 6d 01 movw r12, r26
aea: d7 01 movw r26, r14
aec: ed 91 ld r30, X+
aee: fc 91 ld r31, X
af0: 01 90 ld r0, Z+
af2: f0 81 ld r31, Z
af4: e0 2d mov r30, r0
af6: c7 01 movw r24, r14
af8: 09 95 icall
afa: c8 0f add r28, r24
afc: d9 1f adc r29, r25
afe: 01 50 subi r16, 0x01 ; 1
b00: 10 40 sbci r17, 0x00 ; 0
/* default implementation: may be overridden */
size_t Print::write(const uint8_t *buffer, size_t size)
{
size_t n = 0;
while (size--) {
b02: 01 15 cp r16, r1
b04: 11 05 cpc r17, r1
b06: 71 f7 brne .-36 ; 0xae4 <_ZN5Print5writeEPKhj+0x1c>
n += write(*buffer++);
}
return n;
}
b08: ce 01 movw r24, r28
b0a: df 91 pop r29
b0c: cf 91 pop r28
b0e: 1f 91 pop r17
b10: 0f 91 pop r16
b12: ff 90 pop r15
b14: ef 90 pop r14
b16: df 90 pop r13
b18: cf 90 pop r12
b1a: 08 95 ret
00000b1c <yield>:
* Its defined as a weak symbol and it can be redefined to implement a
* real cooperative scheduler.
*/
static void __empty() {
// Empty
}
b1c: 08 95 ret
00000b1e <__udivmodsi4>:
b1e: a1 e2 ldi r26, 0x21 ; 33
b20: 1a 2e mov r1, r26
b22: aa 1b sub r26, r26
b24: bb 1b sub r27, r27
b26: fd 01 movw r30, r26
b28: 0d c0 rjmp .+26 ; 0xb44 <__udivmodsi4_ep>
00000b2a <__udivmodsi4_loop>:
b2a: aa 1f adc r26, r26
b2c: bb 1f adc r27, r27
b2e: ee 1f adc r30, r30
b30: ff 1f adc r31, r31
b32: a2 17 cp r26, r18
b34: b3 07 cpc r27, r19
b36: e4 07 cpc r30, r20
b38: f5 07 cpc r31, r21
b3a: 20 f0 brcs .+8 ; 0xb44 <__udivmodsi4_ep>
b3c: a2 1b sub r26, r18
b3e: b3 0b sbc r27, r19
b40: e4 0b sbc r30, r20
b42: f5 0b sbc r31, r21
00000b44 <__udivmodsi4_ep>:
b44: 66 1f adc r22, r22
b46: 77 1f adc r23, r23
b48: 88 1f adc r24, r24
b4a: 99 1f adc r25, r25
b4c: 1a 94 dec r1
b4e: 69 f7 brne .-38 ; 0xb2a <__udivmodsi4_loop>
b50: 60 95 com r22
b52: 70 95 com r23
b54: 80 95 com r24
b56: 90 95 com r25
b58: 9b 01 movw r18, r22
b5a: ac 01 movw r20, r24
b5c: bd 01 movw r22, r26
b5e: cf 01 movw r24, r30
b60: 08 95 ret
00000b62 <__tablejump2__>:
b62: ee 0f add r30, r30
b64: ff 1f adc r31, r31
00000b66 <__tablejump__>:
b66: 05 90 lpm r0, Z+
b68: f4 91 lpm r31, Z+
b6a: e0 2d mov r30, r0
b6c: 09 94 ijmp
00000b6e <_exit>:
b6e: f8 94 cli
00000b70 <__stop_program>:
b70: ff cf rjmp .-2 ; 0xb70 <__stop_program>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment