2 serial_lcd.elf: file format elf32-avr
5 Idx Name Size VMA LMA File off Algn
6 0 .text 000002aa 00000000 00000000 00000074 2**1
7 CONTENTS, ALLOC, LOAD, READONLY, CODE
8 1 .noinit 00000030 00800060 00800060 0000031e 2**0
10 2 .stab 0000069c 00000000 00000000 00000320 2**2
11 CONTENTS, READONLY, DEBUGGING
12 3 .stabstr 00000082 00000000 00000000 000009bc 2**0
13 CONTENTS, READONLY, DEBUGGING
14 4 .debug_aranges 00000050 00000000 00000000 00000a3e 2**0
15 CONTENTS, READONLY, DEBUGGING
16 5 .debug_pubnames 0000003a 00000000 00000000 00000a8e 2**0
17 CONTENTS, READONLY, DEBUGGING
18 6 .debug_info 00000765 00000000 00000000 00000ac8 2**0
19 CONTENTS, READONLY, DEBUGGING
20 7 .debug_abbrev 0000026d 00000000 00000000 0000122d 2**0
21 CONTENTS, READONLY, DEBUGGING
22 8 .debug_line 0000068a 00000000 00000000 0000149a 2**0
23 CONTENTS, READONLY, DEBUGGING
24 9 .debug_frame 00000080 00000000 00000000 00001b24 2**2
25 CONTENTS, READONLY, DEBUGGING
26 10 .debug_str 00000298 00000000 00000000 00001ba4 2**0
27 CONTENTS, READONLY, DEBUGGING
28 11 .debug_loc 000001cd 00000000 00000000 00001e3c 2**0
29 CONTENTS, READONLY, DEBUGGING
30 12 .debug_ranges 000000a8 00000000 00000000 00002009 2**0
31 CONTENTS, READONLY, DEBUGGING
33 Disassembly of section .text:
36 0: 18 c0 rjmp .+48 ; 0x32 <__ctors_end>
37 2: 1d c0 rjmp .+58 ; 0x3e <__bad_interrupt>
38 4: 1c c0 rjmp .+56 ; 0x3e <__bad_interrupt>
39 6: 1b c0 rjmp .+54 ; 0x3e <__bad_interrupt>
40 8: 1a c0 rjmp .+52 ; 0x3e <__bad_interrupt>
41 a: 19 c0 rjmp .+50 ; 0x3e <__bad_interrupt>
42 c: 18 c0 rjmp .+48 ; 0x3e <__bad_interrupt>
43 e: 42 c0 rjmp .+132 ; 0x94 <__vector_7>
44 10: 16 c0 rjmp .+44 ; 0x3e <__bad_interrupt>
45 12: 15 c0 rjmp .+42 ; 0x3e <__bad_interrupt>
46 14: 14 c0 rjmp .+40 ; 0x3e <__bad_interrupt>
47 16: 13 c0 rjmp .+38 ; 0x3e <__bad_interrupt>
48 18: 12 c0 rjmp .+36 ; 0x3e <__bad_interrupt>
49 1a: 18 c1 rjmp .+560 ; 0x24c <__vector_13>
50 1c: 10 c0 rjmp .+32 ; 0x3e <__bad_interrupt>
51 1e: 0f c0 rjmp .+30 ; 0x3e <__bad_interrupt>
52 20: 0e c0 rjmp .+28 ; 0x3e <__bad_interrupt>
53 22: 0d c0 rjmp .+26 ; 0x3e <__bad_interrupt>
54 24: 0c c0 rjmp .+24 ; 0x3e <__bad_interrupt>
56 00000026 <BaudLookupTable>:
59 0000002a <ledPwmPatterns>:
60 2a: 10 11 4a 55 5d ee 7f ff ..JU]...
62 00000032 <__ctors_end>:
64 34: 1f be out 0x3f, r1 ; 63
65 36: cf ed ldi r28, 0xDF ; 223
66 38: cd bf out 0x3d, r28 ; 61
67 3a: 5c d0 rcall .+184 ; 0xf4 <main>
68 3c: 34 c1 rjmp .+616 ; 0x2a6 <_exit>
70 0000003e <__bad_interrupt>:
71 3e: e0 cf rjmp .-64 ; 0x0 <__vectors>
73 00000040 <LcdBusyWait>:
74 LCD_CONTROL_PORT &= ~(1<<LCD_E);
77 unsigned char LcdBusyWait (void) {
78 unsigned char LCDStatus;
79 LCD_DATA_DIR = 0x00; // Set LCD data port to inputs
80 40: 17 ba out 0x17, r1 ; 23
81 LCD_CONTROL_PORT &= ~(1<<LCD_RS); // Set display to "Register mode"
82 42: 95 98 cbi 0x12, 5 ; 18
83 LCD_CONTROL_PORT |= (1<<LCD_RW); // Put the display in the read mode
84 44: 94 9a sbi 0x12, 4 ; 18
90 LCD_CONTROL_PORT |= (1<<LCD_E);
91 4a: 96 9a sbi 0x12, 6 ; 18
93 #define ENABLE_WAIT() __delay_cycles(4);
95 #elif defined(__GNUC__)
96 static __inline__ void _NOP1 (void) { __asm__ volatile ( "nop " "\n\t" ); }
97 static __inline__ void _NOP2 (void) { __asm__ volatile ( "rjmp 1f" "\n\t" "1:" "\n\t" ); }
98 4c: 00 c0 rjmp .+0 ; 0x4e <LcdBusyWait+0xe>
100 LCDStatus = LCD_DATA_PIN_REG;
101 4e: 00 c0 rjmp .+0 ; 0x50 <LcdBusyWait+0x10>
102 50: 96 b3 in r25, 0x16 ; 22
103 LCD_CONTROL_PORT &= ~(1<<LCD_E);
104 52: 96 98 cbi 0x12, 6 ; 18
105 } while (LCDStatus & (1<<LCD_BUSY));
106 54: 97 fd sbrc r25, 7
107 56: f8 cf rjmp .-16 ; 0x48 <LcdBusyWait+0x8>
108 LCD_CONTROL_PORT &= ~(1<<LCD_RW); // Put display in write mode
109 58: 94 98 cbi 0x12, 4 ; 18
110 LCD_DATA_DIR = 0xFF; // Set LCD data port to outputs
111 5a: 8f ef ldi r24, 0xFF ; 255
112 5c: 87 bb out 0x17, r24 ; 23
115 5e: 89 2f mov r24, r25
118 00000062 <LcdWriteData>:
119 LCD_CONTROL_PORT &= ~(1<<LCD_E);
121 LCD_CONTROL_PORT |= (1<<LCD_RS); // Set display to "Character mode"
124 void LcdWriteData (unsigned char c) {
126 64: 18 2f mov r17, r24
128 66: ec df rcall .-40 ; 0x40 <LcdBusyWait>
129 LCD_CONTROL_PORT |= (1<<LCD_RS); // Set display to "Character Mode"
130 68: 95 9a sbi 0x12, 5 ; 18
132 6a: 18 bb out 0x18, r17 ; 24
135 LCD_CONTROL_PORT |= (1<<LCD_E);
136 6e: 96 9a sbi 0x12, 6 ; 18
137 70: 00 c0 rjmp .+0 ; 0x72 <LcdWriteData+0x10>
139 LCD_CONTROL_PORT &= ~(1<<LCD_E);
140 72: 00 c0 rjmp .+0 ; 0x74 <LcdWriteData+0x12>
141 74: 96 98 cbi 0x12, 6 ; 18
146 0000007a <LcdWriteCmd>:
152 void LcdWriteCmd (unsigned char Cmd) {
154 7c: 18 2f mov r17, r24
156 7e: e0 df rcall .-64 ; 0x40 <LcdBusyWait>
157 LCD_DATA_PORT = Cmd; // BusyWait leaves RS low in "Register mode"
158 80: 18 bb out 0x18, r17 ; 24
161 LCD_CONTROL_PORT |= (1<<LCD_E);
162 84: 96 9a sbi 0x12, 6 ; 18
163 86: 00 c0 rjmp .+0 ; 0x88 <LcdWriteCmd+0xe>
165 LCD_CONTROL_PORT &= ~(1<<LCD_E);
166 88: 00 c0 rjmp .+0 ; 0x8a <LcdWriteCmd+0x10>
167 8a: 96 98 cbi 0x12, 6 ; 18
170 LCD_CONTROL_PORT |= (1<<LCD_RS); // Set display to "Character mode"
171 8e: 95 9a sbi 0x12, 5 ; 18
176 00000094 <__vector_7>:
177 #pragma interrupt_handler usart_rx_handler:iv_USART0_RXC
178 void usart_rx_handler(void)
185 98: 0f b6 in r0, 0x3f ; 63
192 a4: 8c b1 in r24, 0x0c ; 12
194 INLINE_FUNC_DECLARE(static void UartStoreRx (uint8_t rx));
195 static inline void UartStoreRx (uint8_t rx) {
196 unsigned char tmphead;
198 if (UCSRA & (1<<FE)) {
199 a6: 5c 99 sbic 0x0b, 4 ; 11
200 a8: 0d c0 rjmp .+26 ; 0xc4 <__vector_7+0x30>
201 // some applications may benefit from addind error notification for serial port data overruns
205 // Calculate next buffer position.
206 tmphead = sUartRxHead;
207 aa: e5 2d mov r30, r5
208 if (tmphead == UART_RX_BUFFER_SIZE-1)
209 ac: ef 32 cpi r30, 0x2F ; 47
210 ae: 11 f4 brne .+4 ; 0xb4 <__vector_7+0x20>
211 b0: e0 e0 ldi r30, 0x00 ; 0
212 b2: 01 c0 rjmp .+2 ; 0xb6 <__vector_7+0x22>
216 b4: ef 5f subi r30, 0xFF ; 255
217 // store in buffer if there is room
218 if (tmphead != sUartRxTail) {
220 b8: 29 f0 breq .+10 ; 0xc4 <__vector_7+0x30>
221 sUartRxHead = tmphead; // Store new index.
222 ba: 5e 2e mov r5, r30
223 sUartRxBuf[tmphead] = rx;
224 bc: f0 e0 ldi r31, 0x00 ; 0
225 be: e0 5a subi r30, 0xA0 ; 160
226 c0: ff 4f sbci r31, 0xFF ; 255
238 cc: 0f be out 0x3f, r0 ; 63
243 000000d4 <WaitRxChar>:
245 static unsigned char WaitRxChar (void) {
246 // waits for next RX character, then return it
249 tail = sUartRxTail; // explicitly set order of volatile variable access
250 d4: 86 2d mov r24, r6
252 } while (sUartRxHead == tail); // while buffer is empty
253 d6: 95 2d mov r25, r5
254 static unsigned char WaitRxChar (void) {
255 // waits for next RX character, then return it
258 tail = sUartRxTail; // explicitly set order of volatile variable access
261 } while (sUartRxHead == tail); // while buffer is empty
262 da: 98 17 cp r25, r24
263 dc: e9 f3 breq .-6 ; 0xd8 <WaitRxChar+0x4>
264 // CTS inactive if byte fills buffer after we remove current byte
268 // increment tail position
269 if (tail == UART_RX_BUFFER_SIZE-1)
270 de: 8f 32 cpi r24, 0x2F ; 47
271 e0: 11 f4 brne .+4 ; 0xe6 <__stack+0x7>
274 e4: 01 c0 rjmp .+2 ; 0xe8 <__stack+0x9>
279 CTS_PORT |= (1<<CTS_PIN); // Ensure CTS is active since just removed a byte
280 sei(); // Allow UART ISR to read character and change potentially change CTS
283 return sUartRxBuf[sUartRxTail];
284 e8: e6 2d mov r30, r6
285 ea: f0 e0 ldi r31, 0x00 ; 0
286 ec: e0 5a subi r30, 0xA0 ; 160
287 ee: ff 4f sbci r31, 0xFF ; 255
293 LcdWriteCmd (LCD_ON); // Power up the display
294 LcdWriteCmd (LCD_CLR); // Power up the display
298 MCUSR = 0; // clear all reset flags
299 f4: 14 be out 0x34, r1 ; 52
303 #if defined(__CODEVISIONAVR__)
306 WDTCSR |= (1<<WDCE)|(1<<WDE); // start timed sequence (keep old prescaler)
307 f8: 81 b5 in r24, 0x21 ; 33
308 fa: 88 61 ori r24, 0x18 ; 24
309 fc: 81 bd out 0x21, r24 ; 33
310 WDTCSR = (1<<WDE)|(1<<WDP3)|(1<<WDP0); // 1024K cycles, 8.0sec
311 fe: 89 e2 ldi r24, 0x29 ; 41
312 100: 81 bd out 0x21, r24 ; 33
313 #if defined(__CODEVISIONAVR__) && defined(_OPTIMIZE_SIZE_)
316 MCUCR &= ~((1<<SM1)|(1<<SM0)); // use idle sleep mode
317 102: 85 b7 in r24, 0x35 ; 53
318 104: 8f 7a andi r24, 0xAF ; 175
319 106: 85 bf out 0x35, r24 ; 53
321 INLINE_FUNC_DECLARE(static void LedPwmInit (void));
322 static inline void LedPwmInit (void) {
323 // setup PWM to run at 1.25ms per interrupt.
324 // This allows 8 levels of brightness at minimum of 100Hz flicker rate.
325 TCCR0A = (1<<WGM01); // CTC mode
326 108: 82 e0 ldi r24, 0x02 ; 2
327 10a: 80 bf out 0x30, r24 ; 48
328 TCCR0B = 0; // timer off
329 10c: 13 be out 0x33, r1 ; 51
330 OCR0A = 72; // 1.25ms with CLK/256 prescaler @ 14.7456MHz
331 10e: 88 e4 ldi r24, 0x48 ; 72
332 110: 86 bf out 0x36, r24 ; 54
333 TIMSK = (1<<OCIE0A); // Turn on timer0 COMPA intr (all other timer intr off)
334 112: 81 e0 ldi r24, 0x01 ; 1
335 114: 89 bf out 0x39, r24 ; 57
336 LED_PORT &= ~(1<<LED_PIN); // Ensure LED is off during initialization
337 116: 91 98 cbi 0x12, 1 ; 18
338 LED_DIR |= (1<<LED_PIN); // Ensure LED is output direction
339 118: 89 9a sbi 0x11, 1 ; 17
340 BACKLIGHT_OFF(); // note that LED is off
341 11a: a0 98 cbi 0x14, 0 ; 20
342 ledPwmPattern = 0xFF; // maximum brightness
343 11c: 9f ef ldi r25, 0xFF ; 255
344 11e: 93 bb out 0x13, r25 ; 19
347 INLINE_FUNC_DECLARE(static void LcdInit (void));
348 static inline void LcdInit (void) {
349 // Set BAUD_J2:BAUD_J1 PULL-UPS active
350 LCD_CONTROL_PORT = (1<<BAUD_J2) | (1<<BAUD_J1);
351 120: 8c e0 ldi r24, 0x0C ; 12
352 122: 82 bb out 0x12, r24 ; 18
353 // Set LCD_control BAUD_J2:BAUD_J1 to inputs
354 LCD_CONTROL_DIR = 0xF2;
355 124: 82 ef ldi r24, 0xF2 ; 242
356 126: 81 bb out 0x11, r24 ; 17
357 milliseconds can be achieved.
360 _delay_loop_2(uint16_t __count)
363 128: e0 e0 ldi r30, 0x00 ; 0
364 12a: f8 ed ldi r31, 0xD8 ; 216
365 12c: 31 97 sbiw r30, 0x01 ; 1
366 12e: f1 f7 brne .-4 ; 0x12c <main+0x38>
369 LCD_CONTROL_PORT |= (1<<LCD_RS); // Set LCD_RS HIGH
370 130: 95 9a sbi 0x12, 5 ; 18
372 // Initialize the LCD Data AVR I/O
373 LCD_DATA_DIR = 0xFF; // Set LCD_DATA_PORT as all outputs
374 132: 97 bb out 0x17, r25 ; 23
375 LCD_DATA_PORT = 0x00; // Set LCD_DATA_PORT to logic low
376 134: 18 ba out 0x18, r1 ; 24
378 // Initialize the LCD controller
379 LCD_CONTROL_PORT &= ~(1<<LCD_RS);
380 136: 95 98 cbi 0x12, 5 ; 18
381 LcdWriteData (DATA_8);
382 138: 80 e3 ldi r24, 0x30 ; 48
383 13a: 93 df rcall .-218 ; 0x62 <LcdWriteData>
384 13c: 8a e0 ldi r24, 0x0A ; 10
385 13e: 9b e3 ldi r25, 0x3B ; 59
386 140: 01 97 sbiw r24, 0x01 ; 1
387 142: f1 f7 brne .-4 ; 0x140 <main+0x4c>
390 LcdWriteData (DATA_8);
391 144: 80 e3 ldi r24, 0x30 ; 48
392 146: 8d df rcall .-230 ; 0x62 <LcdWriteData>
393 148: 80 e7 ldi r24, 0x70 ; 112
394 14a: 91 e0 ldi r25, 0x01 ; 1
395 14c: 01 97 sbiw r24, 0x01 ; 1
396 14e: f1 f7 brne .-4 ; 0x14c <main+0x58>
399 LcdWriteData (DATA_8);
400 150: 80 e3 ldi r24, 0x30 ; 48
401 152: 87 df rcall .-242 ; 0x62 <LcdWriteData>
402 LCD_CONTROL_PORT |= (1<<LCD_RS);
403 154: 95 9a sbi 0x12, 5 ; 18
405 // The display will be out into 8 bit data mode here
406 LcdWriteCmd (LCD_8_Bit | LCD_4_Line); // Set 8 bit data, 4 display lines
407 156: 88 e3 ldi r24, 0x38 ; 56
408 158: 90 df rcall .-224 ; 0x7a <LcdWriteCmd>
409 LcdWriteCmd (LCD_ON); // Power up the display
410 15a: 8c e0 ldi r24, 0x0C ; 12
411 15c: 8e df rcall .-228 ; 0x7a <LcdWriteCmd>
412 LcdWriteCmd (LCD_CLR); // Power up the display
413 15e: 81 e0 ldi r24, 0x01 ; 1
414 160: 8c df rcall .-232 ; 0x7a <LcdWriteCmd>
417 INLINE_FUNC_DECLARE(static void UsartInit (void));
418 static inline void UsartInit(void) {
420 UCSRB = 0; // Disable while setting baud rate
421 162: 1a b8 out 0x0a, r1 ; 10
423 164: 1b b8 out 0x0b, r1 ; 11
424 UCSRC = (1<<UCSZ1) | (1<<UCSZ0); // 8 bit data
425 166: 86 e0 ldi r24, 0x06 ; 6
426 168: 83 b9 out 0x03, r24 ; 3
427 = {BAUD_115200, BAUD_38400, BAUD_19200, BAUD_9600};
429 INLINE_FUNC_DECLARE(static unsigned char GetUsartBaud (void));
430 static inline unsigned char GetUsartBaud (void) {
431 // Get BAUD rate jumper settings
432 unsigned char BaudSelectJumpersValue = BAUD_PIN_REG;
433 16a: e0 b3 in r30, 0x10 ; 16
434 // Mask off unwanted bits
435 BaudSelectJumpersValue &= (1<<BAUD_J2) | (1<<BAUD_J1);
436 16c: ec 70 andi r30, 0x0C ; 12
437 // This is two bits too far to the left and the array index will
438 // increment by 4, instead of 1.
439 // Shift BAUD_J2 & BAUD_J1 right by two bit positions for proper array indexing
440 BaudSelectJumpersValue = (BaudSelectJumpersValue >> BAUD_J1);
442 return PGM_READ_BYTE (&BaudLookupTable[BaudSelectJumpersValue]);
445 172: f0 e0 ldi r31, 0x00 ; 0
446 174: ea 5d subi r30, 0xDA ; 218
447 176: ff 4f sbci r31, 0xFF ; 255
448 178: e4 91 lpm r30, Z+
449 static inline void UsartInit(void) {
451 UCSRB = 0; // Disable while setting baud rate
453 UCSRC = (1<<UCSZ1) | (1<<UCSZ0); // 8 bit data
454 UBRRL = GetUsartBaud (); // Set baud rate
455 17a: e9 b9 out 0x09, r30 ; 9
456 UBRRH = 0; // Set baud rate hi
457 17c: 12 b8 out 0x02, r1 ; 2
458 UCSRB = (1<<RXEN)|(1<<RXCIE); // RXEN = Enable
459 17e: 80 e9 ldi r24, 0x90 ; 144
460 180: 8a b9 out 0x0a, r24 ; 10
461 sUartRxHead = 0; // register variable, need to explicitly zero
462 182: 55 24 eor r5, r5
463 sUartRxTail = 0; // register variable, need to explicitly zero
464 184: 66 24 eor r6, r6
467 // Initialize the AVR USART
475 INLINE_FUNC_DECLARE(static void LedTimerStart (void));
476 static inline void LedTimerStart (void) {
477 TCCR0B = (1<<CS02); // Start with 256 prescaler
478 188: 14 e0 ldi r17, 0x04 ; 4
483 unsigned char tail = sUartRxTail; // explicitly set order of volatile access
484 if (tail != sUartRxHead) { // Check if UART RX buffer has a character
486 18c: 09 f4 brne .+2 ; 0x190 <main+0x9c>
487 18e: 41 c0 rjmp .+130 ; 0x212 <main+0x11e>
488 unsigned char rx_byte = WaitRxChar();
489 190: a1 df rcall .-190 ; 0xd4 <WaitRxChar>
491 // avoid use of switch statement as ImageCraft and GCC produce signifcantly
492 // more code for a switch statement than a sequence of if/else if
493 if (rx_byte == LED_SW_OFF) {
494 192: 8d 3f cpi r24, 0xFD ; 253
495 194: 21 f4 brne .+8 ; 0x19e <main+0xaa>
499 INLINE_FUNC_DECLARE(static void LedPwmSwitchOff (void));
500 static inline void LedPwmSwitchOff (void) {
501 LED_PORT &= ~(1<<LED_PIN);
502 196: 91 98 cbi 0x12, 1 ; 18
504 198: a0 98 cbi 0x14, 0 ; 20
507 // Using a platform that has proper inline functions
508 INLINE_FUNC_DECLARE(static void LedTimerStop (void));
509 static inline void LedTimerStop (void) {
511 19a: 13 be out 0x33, r1 ; 51
512 19c: f6 cf rjmp .-20 ; 0x18a <main+0x96>
514 // avoid use of switch statement as ImageCraft and GCC produce signifcantly
515 // more code for a switch statement than a sequence of if/else if
516 if (rx_byte == LED_SW_OFF) {
518 } else if (rx_byte == LED_SW_ON) {
519 19e: 8c 3f cpi r24, 0xFC ; 252
520 1a0: 29 f4 brne .+10 ; 0x1ac <main+0xb8>
524 INLINE_FUNC_DECLARE(static void LedPwmSwitchOn (void));
525 static inline void LedPwmSwitchOn (void) {
527 1a2: a0 9a sbi 0x14, 0 ; 20
528 if (ledPwmPattern == 0xFF) { // maximum brightness, no need for PWM
529 1a4: 83 b3 in r24, 0x13 ; 19
530 1a6: 8f 3f cpi r24, 0xFF ; 255
531 1a8: 59 f5 brne .+86 ; 0x200 <main+0x10c>
532 1aa: 25 c0 rjmp .+74 ; 0x1f6 <main+0x102>
533 // more code for a switch statement than a sequence of if/else if
534 if (rx_byte == LED_SW_OFF) {
536 } else if (rx_byte == LED_SW_ON) {
538 } else if (rx_byte == LED_SET_BRIGHTNESS) {
539 1ac: 8b 3f cpi r24, 0xFB ; 251
540 1ae: 51 f5 brne .+84 ; 0x204 <main+0x110>
541 rx_byte = WaitRxChar(); // read next byte which will be brightness
542 1b0: 91 df rcall .-222 ; 0xd4 <WaitRxChar>
544 INLINE_FUNC_DECLARE(static void LedPwmSetBrightness (unsigned char brightness));
545 static inline void LedPwmSetBrightness (unsigned char brightness) {
546 unsigned char ledPwmPos;
548 if (brightness == 0) { // turn backlight off for 0 brightness
549 1b2: 88 23 and r24, r24
550 1b4: 39 f4 brne .+14 ; 0x1c4 <main+0xd0>
551 if (IS_BACKLIGHT_ON()) {
552 1b6: a0 9b sbis 0x14, 0 ; 20
553 1b8: e8 cf rjmp .-48 ; 0x18a <main+0x96>
556 // Using a platform that has proper inline functions
557 INLINE_FUNC_DECLARE(static void LedTimerStop (void));
558 static inline void LedTimerStop (void) {
560 1ba: 13 be out 0x33, r1 ; 51
561 unsigned char ledPwmPos;
563 if (brightness == 0) { // turn backlight off for 0 brightness
564 if (IS_BACKLIGHT_ON()) {
567 1bc: 13 ba out 0x13, r1 ; 19
569 1be: 77 24 eor r7, r7
570 LED_PORT &= ~(1<<LED_PIN);
571 1c0: 91 98 cbi 0x12, 1 ; 18
572 1c2: e3 cf rjmp .-58 ; 0x18a <main+0x96>
577 ledPwmPos = (brightness * (LED_BRIGHTNESS_LEVELS-1) + (unsigned int) 127) >> 8;
578 1c4: 90 e0 ldi r25, 0x00 ; 0
579 1c6: 67 e0 ldi r22, 0x07 ; 7
580 1c8: 70 e0 ldi r23, 0x00 ; 0
581 1ca: 5b d0 rcall .+182 ; 0x282 <__mulhi3>
582 1cc: 81 58 subi r24, 0x81 ; 129
583 1ce: 9f 4f sbci r25, 0xFF ; 255
584 1d0: 89 2f mov r24, r25
585 1d2: 99 27 eor r25, r25
586 1d4: 98 2f mov r25, r24
587 1d6: 88 30 cpi r24, 0x08 ; 8
588 1d8: 08 f0 brcs .+2 ; 0x1dc <main+0xe8>
589 1da: 97 e0 ldi r25, 0x07 ; 7
590 // Below is probably not required, but ensures we don't exceed array
591 if (ledPwmPos > LED_BRIGHTNESS_LEVELS - 1)
592 ledPwmPos = LED_BRIGHTNESS_LEVELS - 1;
594 ledPwmPattern = PGM_READ_BYTE (&ledPwmPatterns[ledPwmPos]);
595 1dc: e9 2f mov r30, r25
596 1de: f0 e0 ldi r31, 0x00 ; 0
597 1e0: e6 5d subi r30, 0xD6 ; 214
598 1e2: ff 4f sbci r31, 0xFF ; 255
599 1e4: e4 91 lpm r30, Z+
600 1e6: e3 bb out 0x13, r30 ; 19
602 1e8: 44 24 eor r4, r4
603 ledPwmCycling = ledPwmPattern;
604 1ea: 83 b3 in r24, 0x13 ; 19
605 1ec: 78 2e mov r7, r24
606 if (ledPwmPos >= LED_BRIGHTNESS_LEVELS-1) { // maximum brightness
607 1ee: 97 30 cpi r25, 0x07 ; 7
608 1f0: 29 f4 brne .+10 ; 0x1fc <main+0x108>
609 // don't need PWM for continuously on
610 if (IS_BACKLIGHT_ON()) {
611 1f2: a0 9b sbis 0x14, 0 ; 20
612 1f4: ca cf rjmp .-108 ; 0x18a <main+0x96>
615 // Using a platform that has proper inline functions
616 INLINE_FUNC_DECLARE(static void LedTimerStop (void));
617 static inline void LedTimerStop (void) {
619 1f6: 13 be out 0x33, r1 ; 51
620 ledPwmCycling = ledPwmPattern;
621 if (ledPwmPos >= LED_BRIGHTNESS_LEVELS-1) { // maximum brightness
622 // don't need PWM for continuously on
623 if (IS_BACKLIGHT_ON()) {
625 LED_PORT |= (1<<LED_PIN);
626 1f8: 91 9a sbi 0x12, 1 ; 18
627 1fa: c7 cf rjmp .-114 ; 0x18a <main+0x96>
630 if (IS_BACKLIGHT_ON()) {
631 1fc: a0 9b sbis 0x14, 0 ; 20
632 1fe: c5 cf rjmp .-118 ; 0x18a <main+0x96>
636 INLINE_FUNC_DECLARE(static void LedTimerStart (void));
637 static inline void LedTimerStart (void) {
638 TCCR0B = (1<<CS02); // Start with 256 prescaler
639 200: 13 bf out 0x33, r17 ; 51
640 202: c3 cf rjmp .-122 ; 0x18a <main+0x96>
641 } else if (rx_byte == LED_SW_ON) {
643 } else if (rx_byte == LED_SET_BRIGHTNESS) {
644 rx_byte = WaitRxChar(); // read next byte which will be brightness
645 LedPwmSetBrightness(rx_byte);
646 } else if (rx_byte == REG_MODE) {
647 204: 8e 3f cpi r24, 0xFE ; 254
648 206: 19 f4 brne .+6 ; 0x20e <main+0x11a>
649 LcdWriteCmd (WaitRxChar()); // Send LCD command character
650 208: 65 df rcall .-310 ; 0xd4 <WaitRxChar>
651 20a: 37 df rcall .-402 ; 0x7a <LcdWriteCmd>
652 20c: be cf rjmp .-132 ; 0x18a <main+0x96>
654 LcdWriteData (rx_byte); // Send LCD data character
655 20e: 29 df rcall .-430 ; 0x62 <LcdWriteData>
656 210: bc cf rjmp .-136 ; 0x18a <main+0x96>
659 // No characters waiting in RX buffer
665 MCUSR &= ~(1<<WDRF); // clear any watchdog interrupt flags
666 216: 84 b7 in r24, 0x34 ; 52
667 218: 87 7f andi r24, 0xF7 ; 247
668 21a: 84 bf out 0x34, r24 ; 52
670 #if defined(__CODEVISIONAVR__)
673 WDTCSR |= (1<<WDCE)|(1<<WDE); // start timed sequence (keep old prescaler)
674 21c: 81 b5 in r24, 0x21 ; 33
675 21e: 88 61 ori r24, 0x18 ; 24
676 220: 81 bd out 0x21, r24 ; 33
677 WDTCSR &= ~(1<<WDE); // watchdog timer off
678 222: 81 b5 in r24, 0x21 ; 33
679 224: 87 7f andi r24, 0xF7 ; 247
680 226: 81 bd out 0x21, r24 ; 33
681 #if defined(__CODEVISIONAVR__) && defined(_OPTIMIZE_SIZE_)
689 22a: 85 b7 in r24, 0x35 ; 53
690 22c: 80 62 ori r24, 0x20 ; 32
691 22e: 85 bf out 0x35, r24 ; 53
695 232: 85 b7 in r24, 0x35 ; 53
696 234: 8f 7d andi r24, 0xDF ; 223
697 236: 85 bf out 0x35, r24 ; 53
704 #if defined(__CODEVISIONAVR__)
707 WDTCSR |= (1<<WDCE)|(1<<WDE); // start timed sequence (keep old prescaler)
708 23c: 81 b5 in r24, 0x21 ; 33
709 23e: 88 61 ori r24, 0x18 ; 24
710 240: 81 bd out 0x21, r24 ; 33
711 WDTCSR &= ~(1<<WDCE);
712 242: 81 b5 in r24, 0x21 ; 33
713 244: 8f 7e andi r24, 0xEF ; 239
714 246: 81 bd out 0x21, r24 ; 33
715 #if defined(__CODEVISIONAVR__) && defined(_OPTIMIZE_SIZE_)
721 24a: 9f cf rjmp .-194 ; 0x18a <main+0x96>
723 0000024c <__vector_13>:
724 #pragma interrupt_handler timer0_compa_handler:iv_TIMER0_COMPA
725 void timer0_compa_handler(void)
727 ISR(TIMER0_COMPA_vect)
732 250: 0f b6 in r0, 0x3f ; 63
734 254: 11 24 eor r1, r1
736 sei(); // Okay to allow USART interrupts while controlling LED PWM
739 // Set current LED state based on cycling variable
740 if (ledPwmCycling & 0x01) {
741 25a: 70 fe sbrs r7, 0
742 25c: 02 c0 rjmp .+4 ; 0x262 <__vector_13+0x16>
743 LED_PORT |= (1<<LED_PIN);
744 25e: 91 9a sbi 0x12, 1 ; 18
745 260: 01 c0 rjmp .+2 ; 0x264 <__vector_13+0x18>
747 LED_PORT &= ~(1<<LED_PIN);
748 262: 91 98 cbi 0x12, 1 ; 18
751 // Update cycling variable for next interrupt
752 if (ledPwmCount >= LED_BRIGHTNESS_LEVELS-1) {
753 264: 86 e0 ldi r24, 0x06 ; 6
754 266: 84 15 cp r24, r4
755 268: 20 f4 brcc .+8 ; 0x272 <__vector_13+0x26>
757 26a: 44 24 eor r4, r4
758 ledPwmCycling = ledPwmPattern;
759 26c: 83 b3 in r24, 0x13 ; 19
760 26e: 78 2e mov r7, r24
761 270: 02 c0 rjmp .+4 ; 0x276 <__vector_13+0x2a>
771 27a: 0f be out 0x3f, r0 ; 63
777 282: 55 27 eor r21, r21
778 284: 00 24 eor r0, r0
780 00000286 <__mulhi3_loop>:
781 286: 80 ff sbrs r24, 0
782 288: 02 c0 rjmp .+4 ; 0x28e <__mulhi3_skip1>
783 28a: 06 0e add r0, r22
784 28c: 57 1f adc r21, r23
786 0000028e <__mulhi3_skip1>:
787 28e: 66 0f add r22, r22
788 290: 77 1f adc r23, r23
789 292: 61 15 cp r22, r1
790 294: 71 05 cpc r23, r1
791 296: 21 f0 breq .+8 ; 0x2a0 <__mulhi3_exit>
794 29c: 00 97 sbiw r24, 0x00 ; 0
795 29e: 99 f7 brne .-26 ; 0x286 <__mulhi3_loop>
797 000002a0 <__mulhi3_exit>:
798 2a0: 95 2f mov r25, r21
799 2a2: 80 2d mov r24, r0
805 000002a8 <__stop_program>:
806 2a8: ff cf rjmp .-2 ; 0x2a8 <__stop_program>