/tmp/arduino_build_507726/timer_poll_compare_ll_flag.ino.ino.elf: file format elf32-avr Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 52 00 jmp 0xa4 ; 0xa4 <__ctors_end> 4: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 8: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> c: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 10: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 14: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 18: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 1c: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 20: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 24: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 28: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 2c: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 30: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 34: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 38: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 3c: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 40: 0c 94 85 00 jmp 0x10a ; 0x10a <__vector_16> 44: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 48: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 4c: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 50: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 54: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 58: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 5c: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 60: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 64: 0c 94 64 00 jmp 0xc8 ; 0xc8 <__bad_interrupt> 00000068 <__trampolines_end>: 68: 00 00 nop 6a: 00 00 nop 6c: 25 00 .word 0x0025 ; ???? 6e: 28 00 .word 0x0028 ; ???? 70: 2b 00 .word 0x002b ; ???? 00000072 : 72: 00 00 00 00 24 00 27 00 2a 00 ....$.'.*. 0000007c : 7c: 04 04 04 04 04 04 04 04 02 02 02 02 02 02 03 03 ................ 8c: 03 03 03 03 .... 00000090 : 90: 01 02 04 08 10 20 40 80 01 02 04 08 10 20 01 02 ..... @...... .. a0: 04 08 10 20 ... 000000a4 <__ctors_end>: a4: 11 24 eor r1, r1 a6: 1f be out 0x3f, r1 ; 63 a8: cf ef ldi r28, 0xFF ; 255 aa: d8 e0 ldi r29, 0x08 ; 8 ac: de bf out 0x3e, r29 ; 62 ae: cd bf out 0x3d, r28 ; 61 000000b0 <__do_clear_bss>: b0: 21 e0 ldi r18, 0x01 ; 1 b2: a0 e0 ldi r26, 0x00 ; 0 b4: b1 e0 ldi r27, 0x01 ; 1 b6: 01 c0 rjmp .+2 ; 0xba <.do_clear_bss_start> 000000b8 <.do_clear_bss_loop>: b8: 1d 92 st X+, r1 000000ba <.do_clear_bss_start>: ba: a9 30 cpi r26, 0x09 ; 9 bc: b2 07 cpc r27, r18 be: e1 f7 brne .-8 ; 0xb8 <.do_clear_bss_loop> c0: 0e 94 cf 00 call 0x19e ; 0x19e
c4: 0c 94 32 01 jmp 0x264 ; 0x264 <_exit> 000000c8 <__bad_interrupt>: c8: 0c 94 00 00 jmp 0 ; 0x0 <__vectors> 000000cc : #include "wiring_private.h" #include "pins_arduino.h" void pinMode(uint8_t pin, uint8_t mode) { uint8_t bit = digitalPinToBitMask(pin); cc: 90 e0 ldi r25, 0x00 ; 0 ce: fc 01 movw r30, r24 d0: e0 57 subi r30, 0x70 ; 112 d2: ff 4f sbci r31, 0xFF ; 255 d4: 24 91 lpm r18, Z uint8_t port = digitalPinToPort(pin); d6: fc 01 movw r30, r24 d8: e4 58 subi r30, 0x84 ; 132 da: ff 4f sbci r31, 0xFF ; 255 dc: 84 91 lpm r24, Z volatile uint8_t *reg, *out; if (port == NOT_A_PIN) return; de: 88 23 and r24, r24 e0: 99 f0 breq .+38 ; 0x108 // JWS: can I let the optimizer do this? reg = portModeRegister(port); e2: 90 e0 ldi r25, 0x00 ; 0 e4: 88 0f add r24, r24 e6: 99 1f adc r25, r25 e8: fc 01 movw r30, r24 ea: ee 58 subi r30, 0x8E ; 142 ec: ff 4f sbci r31, 0xFF ; 255 ee: a5 91 lpm r26, Z+ f0: b4 91 lpm r27, Z out = portOutputRegister(port); f2: fc 01 movw r30, r24 f4: e8 59 subi r30, 0x98 ; 152 f6: ff 4f sbci r31, 0xFF ; 255 f8: 85 91 lpm r24, Z+ fa: 94 91 lpm r25, Z cli(); *reg &= ~bit; *out |= bit; SREG = oldSREG; } else { uint8_t oldSREG = SREG; fc: 8f b7 in r24, 0x3f ; 63 cli(); fe: f8 94 cli *reg |= bit; 100: ec 91 ld r30, X 102: e2 2b or r30, r18 104: ec 93 st X, r30 SREG = oldSREG; 106: 8f bf out 0x3f, r24 ; 63 108: 08 95 ret 0000010a <__vector_16>: #if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ISR(TIM0_OVF_vect) #else ISR(TIMER0_OVF_vect) #endif { 10a: 1f 92 push r1 10c: 0f 92 push r0 10e: 0f b6 in r0, 0x3f ; 63 110: 0f 92 push r0 112: 11 24 eor r1, r1 114: 2f 93 push r18 116: 3f 93 push r19 118: 8f 93 push r24 11a: 9f 93 push r25 11c: af 93 push r26 11e: 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; 120: 80 91 05 01 lds r24, 0x0105 124: 90 91 06 01 lds r25, 0x0106 128: a0 91 07 01 lds r26, 0x0107 12c: b0 91 08 01 lds r27, 0x0108 unsigned char f = timer0_fract; 130: 30 91 04 01 lds r19, 0x0104 m += MILLIS_INC; f += FRACT_INC; 134: 23 e0 ldi r18, 0x03 ; 3 136: 23 0f add r18, r19 if (f >= FRACT_MAX) { 138: 2d 37 cpi r18, 0x7D ; 125 13a: 20 f4 brcc .+8 ; 0x144 <__vector_16+0x3a> // 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; unsigned char f = timer0_fract; m += MILLIS_INC; 13c: 01 96 adiw r24, 0x01 ; 1 13e: a1 1d adc r26, r1 140: b1 1d adc r27, r1 142: 05 c0 rjmp .+10 ; 0x14e <__vector_16+0x44> f += FRACT_INC; if (f >= FRACT_MAX) { f -= FRACT_MAX; 144: 26 e8 ldi r18, 0x86 ; 134 146: 23 0f add r18, r19 m += 1; 148: 02 96 adiw r24, 0x02 ; 2 14a: a1 1d adc r26, r1 14c: b1 1d adc r27, r1 } timer0_fract = f; 14e: 20 93 04 01 sts 0x0104, r18 timer0_millis = m; 152: 80 93 05 01 sts 0x0105, r24 156: 90 93 06 01 sts 0x0106, r25 15a: a0 93 07 01 sts 0x0107, r26 15e: b0 93 08 01 sts 0x0108, r27 timer0_overflow_count++; 162: 80 91 00 01 lds r24, 0x0100 166: 90 91 01 01 lds r25, 0x0101 16a: a0 91 02 01 lds r26, 0x0102 16e: b0 91 03 01 lds r27, 0x0103 172: 01 96 adiw r24, 0x01 ; 1 174: a1 1d adc r26, r1 176: b1 1d adc r27, r1 178: 80 93 00 01 sts 0x0100, r24 17c: 90 93 01 01 sts 0x0101, r25 180: a0 93 02 01 sts 0x0102, r26 184: b0 93 03 01 sts 0x0103, r27 } 188: bf 91 pop r27 18a: af 91 pop r26 18c: 9f 91 pop r25 18e: 8f 91 pop r24 190: 3f 91 pop r19 192: 2f 91 pop r18 194: 0f 90 pop r0 196: 0f be out 0x3f, r0 ; 63 198: 0f 90 pop r0 19a: 1f 90 pop r1 19c: 18 95 reti 0000019e
: void init() { // this needs to be called before setup() or some functions won't // work there sei(); 19e: 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); 1a0: 84 b5 in r24, 0x24 ; 36 1a2: 82 60 ori r24, 0x02 ; 2 1a4: 84 bd out 0x24, r24 ; 36 sbi(TCCR0A, WGM00); 1a6: 84 b5 in r24, 0x24 ; 36 1a8: 81 60 ori r24, 0x01 ; 1 1aa: 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); 1ac: 85 b5 in r24, 0x25 ; 37 1ae: 82 60 ori r24, 0x02 ; 2 1b0: 85 bd out 0x25, r24 ; 37 sbi(TCCR0B, CS00); 1b2: 85 b5 in r24, 0x25 ; 37 1b4: 81 60 ori r24, 0x01 ; 1 1b6: 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); 1b8: 80 91 6e 00 lds r24, 0x006E 1bc: 81 60 ori r24, 0x01 ; 1 1be: 80 93 6e 00 sts 0x006E, 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; 1c2: 10 92 81 00 sts 0x0081, r1 // set timer 1 prescale factor to 64 sbi(TCCR1B, CS11); 1c6: 80 91 81 00 lds r24, 0x0081 1ca: 82 60 ori r24, 0x02 ; 2 1cc: 80 93 81 00 sts 0x0081, r24 #if F_CPU >= 8000000L sbi(TCCR1B, CS10); 1d0: 80 91 81 00 lds r24, 0x0081 1d4: 81 60 ori r24, 0x01 ; 1 1d6: 80 93 81 00 sts 0x0081, r24 sbi(TCCR1, CS10); #endif #endif // put timer 1 in 8-bit phase correct pwm mode #if defined(TCCR1A) && defined(WGM10) sbi(TCCR1A, WGM10); 1da: 80 91 80 00 lds r24, 0x0080 1de: 81 60 ori r24, 0x01 ; 1 1e0: 80 93 80 00 sts 0x0080, r24 // set timer 2 prescale factor to 64 #if defined(TCCR2) && defined(CS22) sbi(TCCR2, CS22); #elif defined(TCCR2B) && defined(CS22) sbi(TCCR2B, CS22); 1e4: 80 91 b1 00 lds r24, 0x00B1 1e8: 84 60 ori r24, 0x04 ; 4 1ea: 80 93 b1 00 sts 0x00B1, 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); 1ee: 80 91 b0 00 lds r24, 0x00B0 1f2: 81 60 ori r24, 0x01 ; 1 1f4: 80 93 b0 00 sts 0x00B0, r24 #endif #if defined(ADCSRA) // set a2d prescaler so we are inside the desired 50-200 KHz range. #if F_CPU >= 16000000 // 16 MHz / 128 = 125 KHz sbi(ADCSRA, ADPS2); 1f8: 80 91 7a 00 lds r24, 0x007A 1fc: 84 60 ori r24, 0x04 ; 4 1fe: 80 93 7a 00 sts 0x007A, r24 sbi(ADCSRA, ADPS1); 202: 80 91 7a 00 lds r24, 0x007A 206: 82 60 ori r24, 0x02 ; 2 208: 80 93 7a 00 sts 0x007A, r24 sbi(ADCSRA, ADPS0); 20c: 80 91 7a 00 lds r24, 0x007A 210: 81 60 ori r24, 0x01 ; 1 212: 80 93 7a 00 sts 0x007A, r24 cbi(ADCSRA, ADPS2); cbi(ADCSRA, ADPS1); sbi(ADCSRA, ADPS0); #endif // enable a2d conversions sbi(ADCSRA, ADEN); 216: 80 91 7a 00 lds r24, 0x007A 21a: 80 68 ori r24, 0x80 ; 128 21c: 80 93 7a 00 sts 0x007A, 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; 220: 10 92 c1 00 sts 0x00C1, r1 const byte CLOCKOUT = 9; // Uno, Duemilanove, etc. //OC1A is PB1/UNO 9 //OC1B is PB2/UNO 10 void setup () { pinMode (LED_PIN, OUTPUT); 224: 8d e0 ldi r24, 0x0D ; 13 226: 0e 94 66 00 call 0xcc ; 0xcc // set up 8 MHz timer on CLOCKOUT (OC1A) pinMode (CLOCKOUT, OUTPUT); 22a: 89 e0 ldi r24, 0x09 ; 9 22c: 0e 94 66 00 call 0xcc ; 0xcc // set up Timer 1 TCCR1A = 0b00000000; 230: 10 92 80 00 sts 0x0080, r1 TCCR1B = bit (WGM12) | bit (CS12) | bit (CS10); // CTC, clk/1024 234: 8d e0 ldi r24, 0x0D ; 13 236: 80 93 81 00 sts 0x0081, r24 OCR1A = 65535; // output every 65536th cycle 23a: 8f ef ldi r24, 0xFF ; 255 23c: 9f ef ldi r25, 0xFF ; 255 23e: 90 93 89 00 sts 0x0089, r25 242: 80 93 88 00 sts 0x0088, r24 void loop () { if ((TIFR1 & (1 << OCF1A)) == 0) { return; //The flag is not set, so return } else { PORTB ^= B00100000; 246: c0 e2 ldi r28, 0x20 ; 32 setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); 248: 00 e0 ldi r16, 0x00 ; 0 24a: 10 e0 ldi r17, 0x00 ; 0 OCR1A = 65535; // output every 65536th cycle } // end of setup void loop () { if ((TIFR1 & (1 << OCF1A)) == 0) { 24c: b1 9b sbis 0x16, 1 ; 22 24e: 04 c0 rjmp .+8 ; 0x258 return; //The flag is not set, so return } else { PORTB ^= B00100000; 250: 85 b1 in r24, 0x05 ; 5 252: 8c 27 eor r24, r28 254: 85 b9 out 0x05, r24 ; 5 //digitalWrite(LED_PIN,!digitalRead(LED_PIN)); TIFR1 |= 1 << OCF1A ; //clear match bit 256: b1 9a sbi 0x16, 1 ; 22 258: 01 15 cp r16, r1 25a: 11 05 cpc r17, r1 25c: b9 f3 breq .-18 ; 0x24c 25e: 0e 94 00 00 call 0 ; 0x0 <__vectors> 262: f4 cf rjmp .-24 ; 0x24c 00000264 <_exit>: 264: f8 94 cli 00000266 <__stop_program>: 266: ff cf rjmp .-2 ; 0x266 <__stop_program>