1 .file "main.c" 2 .arch atmega16 3 __SREG__ = 0x3f 4 __SP_H__ = 0x3e 5 __SP_L__ = 0x3d 6 __tmp_reg__ = 0 7 __zero_reg__ = 1 8 .global __do_copy_data 9 .global __do_clear_bss 11 .text 12 .Ltext0: 77 .global __vector_8 79 __vector_8: 1:main.c **** #include 2:main.c **** #include 3:main.c **** #include 4:main.c **** #include 5:main.c **** #include "timer.h" 6:main.c **** #include "serial_coms.h" 7:main.c **** #include "gyro.h" 8:main.c **** #include "encoder.h" 9:main.c **** #include "data_packet.h" 10:main.c **** #include "globals.h" 11:main.c **** 12:main.c **** // Flag that is set in an overflow timer. The ISR is then 13:main.c **** // executed in the main loop and flag reset. 14:main.c **** unsigned char run_timer1_isr; 15:main.c **** 16:main.c **** /******************************************************************************* 17:main.c **** * 18:main.c **** * FUNCTION: SIGNAL(SIG_INTERRUPT0) 19:main.c **** * 20:main.c **** * PURPOSE: This is the interrupt service routine (ISR) for external 21:main.c **** * interrupt 0 (left encoder, rising edge.) 22:main.c **** * 23:main.c **** * CALLED FROM: Rising edge of INT0 24:main.c **** * 25:main.c **** * PARAMETERS: Nothing. 26:main.c **** * 27:main.c **** * RETURNS: Nothing. 28:main.c **** * 29:main.c **** * COMMENTS: Nothing. 30:main.c **** * 31:main.c **** *******************************************************************************/ 32:main.c **** ISR(SIG_INTERRUPT0) 33:main.c **** { 34:main.c **** // Run the ISR that determines direction and updates 35:main.c **** // the correct variable 36:main.c **** Left_Encoder_ISR(); 37:main.c **** } 38:main.c **** 39:main.c **** /******************************************************************************* 40:main.c **** * 41:main.c **** * FUNCTION: SIGNAL(SIG_INTERRUPT1) 42:main.c **** * 43:main.c **** * PURPOSE: This is the interrupt service routine (ISR) for external 44:main.c **** * interrupt 1 (right encoder, rising edge.) 45:main.c **** * 46:main.c **** * CALLED FROM: Rising edge of INT1 47:main.c **** * 48:main.c **** * PARAMETERS: Nothing. 49:main.c **** * 50:main.c **** * RETURNS: Nothing. 51:main.c **** * 52:main.c **** * COMMENTS: Nothing. 53:main.c **** * 54:main.c **** *******************************************************************************/ 55:main.c **** ISR(SIG_INTERRUPT1) 56:main.c **** { 57:main.c **** // Run the ISR that determines direction and updates 58:main.c **** // the correct variable 59:main.c **** Right_Encoder_ISR(); 60:main.c **** } 61:main.c **** 62:main.c **** 63:main.c **** /******************************************************************************* 64:main.c **** * 65:main.c **** * FUNCTION: SIGNAL(SIG_OVERFLOW1) 66:main.c **** * 67:main.c **** * PURPOSE: This is the interrupt service routine (ISR) for timer1 68:main.c **** * overflow. It is run at approximately 120MHz thanks to 69:main.c **** * a prescaler and register loading. 70:main.c **** * 71:main.c **** * CALLED FROM: Timer1 overflow 72:main.c **** * 73:main.c **** * PARAMETERS: Nothing. 74:main.c **** * 75:main.c **** * RETURNS: Nothing. 76:main.c **** * 77:main.c **** * COMMENTS: Nothing. 78:main.c **** * 79:main.c **** *******************************************************************************/ 80:main.c **** ISR(SIG_OVERFLOW1) 81:main.c **** { 81 .LM0: 82 /* prologue: frame size=0 */ 83 0000 1F92 push __zero_reg__ 84 0002 0F92 push __tmp_reg__ 85 0004 0FB6 in __tmp_reg__,__SREG__ 86 0006 0F92 push __tmp_reg__ 87 0008 1124 clr __zero_reg__ 88 000a 8F93 push r24 89 /* prologue end (size=6) */ 82:main.c **** // Set a flag saying that the timer has overflowed 83:main.c **** // and we need to run the ISR 84:main.c **** run_timer1_isr = TRUE; 91 .LM1: 92 000c 81E0 ldi r24,lo8(1) 93 000e 8093 0000 sts run_timer1_isr,r24 94 /* epilogue: frame size=0 */ 95 0012 8F91 pop r24 96 0014 0F90 pop __tmp_reg__ 97 0016 0FBE out __SREG__,__tmp_reg__ 98 0018 0F90 pop __tmp_reg__ 99 001a 1F90 pop __zero_reg__ 100 001c 1895 reti 101 /* epilogue end (size=6) */ 102 /* function __vector_8 size 15 (3) */ 104 .Lscope0: 105 .data 106 .LC0: 107 0000 4156 5220 .string "AVR board initialized...\r\n" 107 626F 6172 107 6420 696E 107 6974 6961 107 6C69 7A65 108 .text 110 .global main 112 main: 85:main.c **** } 86:main.c **** 87:main.c **** /******************************************************************************* 88:main.c **** * 89:main.c **** * FUNCTION: main() 90:main.c **** * 91:main.c **** * PURPOSE: This is the main function through which all other functions 92:main.c **** * run. This is run once and then the while(1) is run until 93:main.c **** * power is removed from the controller. 94:main.c **** * 95:main.c **** * CALLED FROM: Nothing. 96:main.c **** * 97:main.c **** * PARAMETERS: Nothing. 98:main.c **** * 99:main.c **** * RETURNS: Nothing. 100:main.c **** * 101:main.c **** * COMMENTS: Nothing. 102:main.c **** * 103:main.c **** *******************************************************************************/ 104:main.c **** int main(void) 105:main.c **** { 114 .LM2: 115 /* prologue: frame size=0 */ 116 001e C0E0 ldi r28,lo8(__stack - 0) 117 0020 D0E0 ldi r29,hi8(__stack - 0) 118 0022 DEBF out __SP_H__,r29 119 0024 CDBF out __SP_L__,r28 120 /* prologue end (size=4) */ 106:main.c **** 107:main.c **** // Initialize the serial port 108:main.c **** USART_Init(); 122 .LM3: 123 0026 0E94 0000 call USART_Init 109:main.c **** 110:main.c **** // Initialize encoder data 111:main.c **** Encoders_Init(); 125 .LM4: 126 002a 0E94 0000 call Encoders_Init 112:main.c **** 113:main.c **** // Initialize gyros 114:main.c **** Gyro_Init(); 128 .LM5: 129 002e 0E94 0000 call Gyro_Init 115:main.c **** 116:main.c **** // Initialize timers 117:main.c **** Timer_Init(); 131 .LM6: 132 0032 0E94 0000 call Timer_Init 118:main.c **** 119:main.c **** // Enable global interrupts, sets l bit of SREG [334] 120:main.c **** sei(); 134 .LM7: 135 /* #APP */ 136 0036 7894 sei 121:main.c **** 122:main.c **** // Write Data Direction Register A a logical 0 to set 123:main.c **** // it as input. This is used for the switches that 124:main.c **** // toggle debug mode on/off as well as the ADC 125:main.c **** // for the gyro. [51] 126:main.c **** DDRA = 0x00; 138 .LM8: 139 /* #NOAPP */ 140 0038 1ABA out 58-0x20,__zero_reg__ 127:main.c **** 128:main.c **** // Write Data Direction Register B a logical 1 to set 129:main.c **** // it as output. This port drives the LEDs that 130:main.c **** // indicate whether debug mode is on or off. [51] 131:main.c **** DDRB = 0xFF; 142 .LM9: 143 003a 8FEF ldi r24,lo8(-1) 144 003c 87BB out 55-0x20,r24 132:main.c **** 133:main.c **** // By default have the LEDs off 134:main.c **** PORTB = 0xFF; 146 .LM10: 147 003e 88BB out 56-0x20,r24 135:main.c **** 136:main.c **** // Initialization message 137:main.c **** print("AVR board initialized...\r\n"); 149 .LM11: 150 0040 80E0 ldi r24,lo8(.LC0) 151 0042 90E0 ldi r25,hi8(.LC0) 152 0044 0E94 0000 call print 153 0048 01C0 rjmp .L4 154 .L5: 156 .LM12: 157 004a 102F mov r17,r16 158 .L4: 159 .LBB2: 138:main.c **** 139:main.c **** // Endless loop 140:main.c **** while(1) 141:main.c **** { 142:main.c **** 143:main.c **** // These values hold the values of the button and 144:main.c **** // the flag thats set when it's decided that it is 145:main.c **** // a valid fresh hit and not the user just holding 146:main.c **** // down the button. 147:main.c **** char button_value, button_push_valid, debug_sw_prev; 148:main.c **** 149:main.c **** button_value = (PINA & 0b00000001) == 0; 161 .LM13: 162 004c 89B3 in r24,57-0x20 163 004e 8095 com r24 150:main.c **** 151:main.c **** // Make sure that the user isn't just holding down 152:main.c **** // the button 153:main.c **** button_push_valid = button_value && !debug_sw_prev; 165 .LM14: 166 0050 082F mov r16,r24 167 0052 0170 andi r16,lo8(1) 168 0054 80FF sbrs r24,0 169 0056 0FC0 rjmp .L6 170 0058 1123 tst r17 171 005a 69F4 brne .L6 154:main.c **** 155:main.c **** // Set the previous value to the current value, to 156:main.c **** // be used in the next loop. 157:main.c **** debug_sw_prev = button_value; 158:main.c **** 159:main.c **** // If this is a valid (not noise/held down) push 160:main.c **** if(button_push_valid) 161:main.c **** { 162:main.c **** // Flip flop modes 163:main.c **** if(debug_mode == TRUE) 173 .LM15: 174 005c 8091 0000 lds r24,debug_mode 175 0060 8130 cpi r24,lo8(1) 176 0062 29F4 brne .L9 164:main.c **** { 165:main.c **** // Lights off = debug mode off 166:main.c **** debug_mode = FALSE; 178 .LM16: 179 0064 1092 0000 sts debug_mode,__zero_reg__ 167:main.c **** PORTB = 0xFF; 181 .LM17: 182 0068 8FEF ldi r24,lo8(-1) 183 006a 88BB out 56-0x20,r24 184 006c 04C0 rjmp .L6 185 .L9: 168:main.c **** } 169:main.c **** else 170:main.c **** { 171:main.c **** // Lights on = debug mode on 172:main.c **** debug_mode = TRUE; 187 .LM18: 188 006e 81E0 ldi r24,lo8(1) 189 0070 8093 0000 sts debug_mode,r24 173:main.c **** PORTB = 0x00; 191 .LM19: 192 0074 18BA out 56-0x20,__zero_reg__ 193 .L6: 174:main.c **** } 175:main.c **** 176:main.c **** } 177:main.c **** 178:main.c **** // If the interrupt tripped, run the ISR. 179:main.c **** // We run it in the main loop as to not 180:main.c **** // miss as many encoder ticks. 181:main.c **** if(run_timer1_isr == TRUE) 195 .LM20: 196 0076 8091 0000 lds r24,run_timer1_isr 197 007a 8130 cpi r24,lo8(1) 198 007c 31F7 brne .L5 182:main.c **** { 183:main.c **** USART_Transmit(0x00); 200 .LM21: 201 007e 80E0 ldi r24,lo8(0) 202 0080 0E94 0000 call USART_Transmit 184:main.c **** // We sample the gyro every time 185:main.c **** // (120Hz) 186:main.c **** Sample_Gyro(); 204 .LM22: 205 0084 0E94 0000 call Sample_Gyro 187:main.c **** 188:main.c **** // Send a data packet every 3 times 189:main.c **** // (40Hz) 190:main.c **** if(packet_limiter >= 3) 207 .LM23: 208 0088 8091 0000 lds r24,packet_limiter 209 008c 8330 cpi r24,lo8(3) 210 008e 58F0 brlo .L12 191:main.c **** { 192:main.c **** // If we are currently in debug mode, send a 193:main.c **** // packet that is easier for humans to read. 194:main.c **** // Else send the normal, RC optimized, packet. 195:main.c **** if(debug_mode == TRUE) 212 .LM24: 213 0090 8091 0000 lds r24,debug_mode 214 0094 8130 cpi r24,lo8(1) 215 0096 19F4 brne .L14 196:main.c **** { 197:main.c **** Send_Debug_Packet(); 217 .LM25: 218 0098 0E94 0000 call Send_Debug_Packet 219 009c 02C0 rjmp .L16 220 .L14: 198:main.c **** } 199:main.c **** else 200:main.c **** { 201:main.c **** Send_RC_Packet(); 222 .LM26: 223 009e 0E94 0000 call Send_RC_Packet 224 .L16: 202:main.c **** } 203:main.c **** 204:main.c **** // Reset the packet limiter 205:main.c **** packet_limiter = 0; 226 .LM27: 227 00a2 1092 0000 sts packet_limiter,__zero_reg__ 228 .L12: 206:main.c **** } 207:main.c **** 208:main.c **** // Reload the timer value so we can 209:main.c **** // control the interrupt frequency 210:main.c **** TCNT1 = T1_LOAD; 230 .LM28: 231 00a6 83E7 ldi r24,lo8(-8333) 232 00a8 9FED ldi r25,hi8(-8333) 233 00aa 9DBD out (76)+1-0x20,r25 234 00ac 8CBD out 76-0x20,r24 211:main.c **** 212:main.c **** // Increment the limiter 213:main.c **** packet_limiter++; 236 .LM29: 237 00ae 8091 0000 lds r24,packet_limiter 238 00b2 8F5F subi r24,lo8(-(1)) 239 00b4 8093 0000 sts packet_limiter,r24 240 00b8 C8CF rjmp .L5 241 .LBE2: 242 /* epilogue: frame size=0 */ 243 /* epilogue: noreturn */ 244 /* epilogue end (size=0) */ 245 /* function main size 79 (75) */ 251 .Lscope1: 253 .global __vector_2 255 __vector_2: 257 .LM30: 258 /* prologue: frame size=0 */ 259 00ba 1F92 push __zero_reg__ 260 00bc 0F92 push __tmp_reg__ 261 00be 0FB6 in __tmp_reg__,__SREG__ 262 00c0 0F92 push __tmp_reg__ 263 00c2 1124 clr __zero_reg__ 264 00c4 2F93 push r18 265 00c6 3F93 push r19 266 00c8 4F93 push r20 267 00ca 5F93 push r21 268 00cc 6F93 push r22 269 00ce 7F93 push r23 270 00d0 8F93 push r24 271 00d2 9F93 push r25 272 00d4 AF93 push r26 273 00d6 BF93 push r27 274 00d8 EF93 push r30 275 00da FF93 push r31 276 /* prologue end (size=17) */ 278 .LM31: 279 00dc 0E94 0000 call Right_Encoder_ISR 280 /* epilogue: frame size=0 */ 281 00e0 FF91 pop r31 282 00e2 EF91 pop r30 283 00e4 BF91 pop r27 284 00e6 AF91 pop r26 285 00e8 9F91 pop r25 286 00ea 8F91 pop r24 287 00ec 7F91 pop r23 288 00ee 6F91 pop r22 289 00f0 5F91 pop r21 290 00f2 4F91 pop r20 291 00f4 3F91 pop r19 292 00f6 2F91 pop r18 293 00f8 0F90 pop __tmp_reg__ 294 00fa 0FBE out __SREG__,__tmp_reg__ 295 00fc 0F90 pop __tmp_reg__ 296 00fe 1F90 pop __zero_reg__ 297 0100 1895 reti 298 /* epilogue end (size=17) */ 299 /* function __vector_2 size 36 (2) */ 301 .Lscope2: 303 .global __vector_1 305 __vector_1: 307 .LM32: 308 /* prologue: frame size=0 */ 309 0102 1F92 push __zero_reg__ 310 0104 0F92 push __tmp_reg__ 311 0106 0FB6 in __tmp_reg__,__SREG__ 312 0108 0F92 push __tmp_reg__ 313 010a 1124 clr __zero_reg__ 314 010c 2F93 push r18 315 010e 3F93 push r19 316 0110 4F93 push r20 317 0112 5F93 push r21 318 0114 6F93 push r22 319 0116 7F93 push r23 320 0118 8F93 push r24 321 011a 9F93 push r25 322 011c AF93 push r26 323 011e BF93 push r27 324 0120 EF93 push r30 325 0122 FF93 push r31 326 /* prologue end (size=17) */ 328 .LM33: 329 0124 0E94 0000 call Left_Encoder_ISR 330 /* epilogue: frame size=0 */ 331 0128 FF91 pop r31 332 012a EF91 pop r30 333 012c BF91 pop r27 334 012e AF91 pop r26 335 0130 9F91 pop r25 336 0132 8F91 pop r24 337 0134 7F91 pop r23 338 0136 6F91 pop r22 339 0138 5F91 pop r21 340 013a 4F91 pop r20 341 013c 3F91 pop r19 342 013e 2F91 pop r18 343 0140 0F90 pop __tmp_reg__ 344 0142 0FBE out __SREG__,__tmp_reg__ 345 0144 0F90 pop __tmp_reg__ 346 0146 1F90 pop __zero_reg__ 347 0148 1895 reti 348 /* epilogue end (size=17) */ 349 /* function __vector_1 size 36 (2) */ 351 .Lscope3: 352 .lcomm debug_mode,1 353 .lcomm packet_limiter,1 354 .comm temp,20,1 355 .comm run_timer1_isr,1,1 361 .Letext0: 362 /* File "main.c": code 166 = 0x00a6 ( 82), prologues 44, epilogues 40 */ DEFINED SYMBOLS *ABS*:00000000 main.c /tmp/ccDlIpWb.s:3 *ABS*:0000003f __SREG__ /tmp/ccDlIpWb.s:4 *ABS*:0000003e __SP_H__ /tmp/ccDlIpWb.s:5 *ABS*:0000003d __SP_L__ /tmp/ccDlIpWb.s:6 *ABS*:00000000 __tmp_reg__ /tmp/ccDlIpWb.s:7 *ABS*:00000001 __zero_reg__ /tmp/ccDlIpWb.s:79 .text:00000000 __vector_8 *COM*:00000001 run_timer1_isr /tmp/ccDlIpWb.s:112 .text:0000001e main .bss:00000000 debug_mode /tmp/ccDlIpWb.s:352 .bss:00000001 packet_limiter /tmp/ccDlIpWb.s:255 .text:000000ba __vector_2 /tmp/ccDlIpWb.s:305 .text:00000102 __vector_1 *COM*:00000014 temp UNDEFINED SYMBOLS __do_copy_data __do_clear_bss __stack USART_Init Encoders_Init Gyro_Init Timer_Init print USART_Transmit Sample_Gyro Send_Debug_Packet Send_RC_Packet Right_Encoder_ISR Left_Encoder_ISR