1 .file "HW_drivers.c" 2 .arch atmega128 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 12 .text 13 .Ltext0: 117 .section .progmem.data,"a",@progbits 120 gpd_lookup: 121 0000 FF .byte -1 122 0001 FF .byte -1 123 0002 FF .byte -1 124 0003 FF .byte -1 125 0004 FF .byte -1 126 0005 FF .byte -1 127 0006 FF .byte -1 128 0007 FF .byte -1 129 0008 FF .byte -1 130 0009 FF .byte -1 131 000a FF .byte -1 132 000b FF .byte -1 133 000c FF .byte -1 134 000d FF .byte -1 135 000e FF .byte -1 136 000f FF .byte -1 137 0010 FF .byte -1 138 0011 FF .byte -1 139 0012 FF .byte -1 140 0013 FF .byte -1 141 0014 FF .byte -1 142 0015 FF .byte -1 143 0016 FF .byte -1 144 0017 FF .byte -1 145 0018 FF .byte -1 146 0019 FF .byte -1 147 001a FF .byte -1 148 001b FF .byte -1 149 001c FF .byte -1 150 001d FF .byte -1 151 001e FF .byte -1 152 001f FF .byte -1 153 0020 FF .byte -1 154 0021 FF .byte -1 155 0022 FF .byte -1 156 0023 FF .byte -1 157 0024 FF .byte -1 158 0025 FF .byte -1 159 0026 FF .byte -1 160 0027 FF .byte -1 161 0028 FF .byte -1 162 0029 FF .byte -1 163 002a FF .byte -1 164 002b FF .byte -1 165 002c FF .byte -1 166 002d FF .byte -1 167 002e FF .byte -1 168 002f FF .byte -1 169 0030 3C .byte 60 170 0031 3A .byte 58 171 0032 39 .byte 57 172 0033 38 .byte 56 173 0034 37 .byte 55 174 0035 36 .byte 54 175 0036 35 .byte 53 176 0037 34 .byte 52 177 0038 33 .byte 51 178 0039 32 .byte 50 179 003a 31 .byte 49 180 003b 30 .byte 48 181 003c 2F .byte 47 182 003d 2E .byte 46 183 003e 2E .byte 46 184 003f 2D .byte 45 185 0040 2C .byte 44 186 0041 2B .byte 43 187 0042 2B .byte 43 188 0043 2A .byte 42 189 0044 29 .byte 41 190 0045 29 .byte 41 191 0046 28 .byte 40 192 0047 27 .byte 39 193 0048 27 .byte 39 194 0049 26 .byte 38 195 004a 26 .byte 38 196 004b 25 .byte 37 197 004c 25 .byte 37 198 004d 24 .byte 36 199 004e 24 .byte 36 200 004f 23 .byte 35 201 0050 23 .byte 35 202 0051 22 .byte 34 203 0052 22 .byte 34 204 0053 21 .byte 33 205 0054 21 .byte 33 206 0055 21 .byte 33 207 0056 20 .byte 32 208 0057 20 .byte 32 209 0058 1F .byte 31 210 0059 1F .byte 31 211 005a 1F .byte 31 212 005b 1E .byte 30 213 005c 1E .byte 30 214 005d 1E .byte 30 215 005e 1D .byte 29 216 005f 1D .byte 29 217 0060 1D .byte 29 218 0061 1C .byte 28 219 0062 1C .byte 28 220 0063 1C .byte 28 221 0064 1B .byte 27 222 0065 1B .byte 27 223 0066 1B .byte 27 224 0067 1B .byte 27 225 0068 1A .byte 26 226 0069 1A .byte 26 227 006a 1A .byte 26 228 006b 1A .byte 26 229 006c 19 .byte 25 230 006d 19 .byte 25 231 006e 19 .byte 25 232 006f 19 .byte 25 233 0070 18 .byte 24 234 0071 18 .byte 24 235 0072 18 .byte 24 236 0073 18 .byte 24 237 0074 17 .byte 23 238 0075 17 .byte 23 239 0076 17 .byte 23 240 0077 17 .byte 23 241 0078 17 .byte 23 242 0079 16 .byte 22 243 007a 16 .byte 22 244 007b 16 .byte 22 245 007c 16 .byte 22 246 007d 16 .byte 22 247 007e 15 .byte 21 248 007f 15 .byte 21 249 0080 15 .byte 21 250 0081 15 .byte 21 251 0082 15 .byte 21 252 0083 15 .byte 21 253 0084 14 .byte 20 254 0085 14 .byte 20 255 0086 14 .byte 20 256 0087 14 .byte 20 257 0088 14 .byte 20 258 0089 14 .byte 20 259 008a 13 .byte 19 260 008b 13 .byte 19 261 008c 13 .byte 19 262 008d 13 .byte 19 263 008e 13 .byte 19 264 008f 13 .byte 19 265 0090 13 .byte 19 266 0091 12 .byte 18 267 0092 12 .byte 18 268 0093 12 .byte 18 269 0094 12 .byte 18 270 0095 12 .byte 18 271 0096 12 .byte 18 272 0097 12 .byte 18 273 0098 12 .byte 18 274 0099 11 .byte 17 275 009a 11 .byte 17 276 009b 11 .byte 17 277 009c 11 .byte 17 278 009d 11 .byte 17 279 009e 11 .byte 17 280 009f 11 .byte 17 281 00a0 11 .byte 17 282 00a1 11 .byte 17 283 00a2 10 .byte 16 284 00a3 10 .byte 16 285 00a4 10 .byte 16 286 00a5 10 .byte 16 287 00a6 10 .byte 16 288 00a7 10 .byte 16 289 00a8 10 .byte 16 290 00a9 10 .byte 16 291 00aa 10 .byte 16 292 00ab 0F .byte 15 293 00ac 0F .byte 15 294 00ad 0F .byte 15 295 00ae 0F .byte 15 296 00af 0F .byte 15 297 00b0 0F .byte 15 298 00b1 0F .byte 15 299 00b2 0F .byte 15 300 00b3 0F .byte 15 301 00b4 0F .byte 15 302 00b5 0F .byte 15 303 00b6 0E .byte 14 304 00b7 0E .byte 14 305 00b8 0E .byte 14 306 00b9 0E .byte 14 307 00ba 0E .byte 14 308 00bb 0E .byte 14 309 00bc 0E .byte 14 310 00bd 0E .byte 14 311 00be 0E .byte 14 312 00bf 0E .byte 14 313 00c0 0E .byte 14 314 00c1 0E .byte 14 315 00c2 0E .byte 14 316 00c3 0D .byte 13 317 00c4 0D .byte 13 318 00c5 0D .byte 13 319 00c6 0D .byte 13 320 00c7 0D .byte 13 321 00c8 0D .byte 13 322 00c9 0D .byte 13 323 00ca 0D .byte 13 324 00cb 0D .byte 13 325 00cc 0D .byte 13 326 00cd 0D .byte 13 327 00ce 0D .byte 13 328 00cf 0D .byte 13 329 00d0 0D .byte 13 330 00d1 0C .byte 12 331 00d2 0C .byte 12 332 00d3 0C .byte 12 333 00d4 0C .byte 12 334 00d5 0C .byte 12 335 00d6 0C .byte 12 336 00d7 0C .byte 12 337 00d8 0C .byte 12 338 00d9 0C .byte 12 339 00da 0C .byte 12 340 00db 0C .byte 12 341 00dc 0C .byte 12 342 00dd 0C .byte 12 343 00de 0C .byte 12 344 00df 0C .byte 12 345 00e0 0C .byte 12 346 00e1 0B .byte 11 347 00e2 0B .byte 11 348 00e3 0B .byte 11 349 00e4 0B .byte 11 350 00e5 0B .byte 11 351 00e6 0B .byte 11 352 00e7 0B .byte 11 353 00e8 0B .byte 11 354 00e9 0B .byte 11 355 00ea 0B .byte 11 356 00eb 0B .byte 11 357 00ec 0B .byte 11 358 00ed 0B .byte 11 359 00ee 0B .byte 11 360 00ef 0B .byte 11 361 00f0 0B .byte 11 362 00f1 0B .byte 11 363 00f2 0B .byte 11 364 00f3 0B .byte 11 365 00f4 0B .byte 11 366 00f5 0A .byte 10 367 00f6 0A .byte 10 368 00f7 0A .byte 10 369 00f8 0A .byte 10 370 00f9 0A .byte 10 371 00fa 0A .byte 10 372 00fb 0A .byte 10 373 00fc 0A .byte 10 374 00fd 0A .byte 10 375 00fe 0A .byte 10 376 .text 378 .global InitADC 380 InitADC: 1:HW_drivers.c **** // 2:HW_drivers.c **** // HW_drivers.c 3:HW_drivers.c **** // 4:HW_drivers.c **** // Description: Contains the general hardware handler routines. 5:HW_drivers.c **** // 6:HW_drivers.c **** // History: 7:HW_drivers.c **** // 2002.08.25 - Stephane Gauthier - Ported from Xtreme Overkill. 8:HW_drivers.c **** // 2002.10.06 - Stephane Gauthier - Added adc_read(). 9:HW_drivers.c **** // 2003.01.02 - Stephane Gauthier - Moved gpd_lookup[] to FLASH. 10:HW_drivers.c **** // 11:HW_drivers.c **** 12:HW_drivers.c **** #include "AvrX.h" 13:HW_drivers.c **** #include 14:HW_drivers.c **** #include 15:HW_drivers.c **** #include "hardware.h" 16:HW_drivers.c **** #include "HW_drivers.h" 17:HW_drivers.c **** #include "serialio.h" 18:HW_drivers.c **** #include "generalio.h" 19:HW_drivers.c **** #include "math.h" 20:HW_drivers.c **** #include "I2C.h" 21:HW_drivers.c **** #include "SCM/scm_cmds.h" 22:HW_drivers.c **** 23:HW_drivers.c **** static AVRX_MUTEX(ADC_Mutex); 24:HW_drivers.c **** 25:HW_drivers.c **** //extern ConfigData R_ParameterTable; 26:HW_drivers.c **** 27:HW_drivers.c **** //static const unsigned char gpd_lookup[] FLASH = 28:HW_drivers.c **** static char gpd_lookup[] PROGMEM = 29:HW_drivers.c **** { 30:HW_drivers.c **** 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 31:HW_drivers.c **** 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 32:HW_drivers.c **** 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 33:HW_drivers.c **** 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 34:HW_drivers.c **** 255, 255, 255, 255, 255, 255, 255, 255, 60, 58, 35:HW_drivers.c **** 57, 56, 55, 54, 53, 52, 51, 50, 49, 48, 36:HW_drivers.c **** 47, 46, 46, 45, 44, 43, 43, 42, 41, 41, 37:HW_drivers.c **** 40, 39, 39, 38, 38, 37, 37, 36, 36, 35, 38:HW_drivers.c **** 35, 34, 34, 33, 33, 33, 32, 32, 31, 31, 39:HW_drivers.c **** 31, 30, 30, 30, 29, 29, 29, 28, 28, 28, 40:HW_drivers.c **** 27, 27, 27, 27, 26, 26, 26, 26, 25, 25, 41:HW_drivers.c **** 25, 25, 24, 24, 24, 24, 23, 23, 23, 23, 42:HW_drivers.c **** 23, 22, 22, 22, 22, 22, 21, 21, 21, 21, 43:HW_drivers.c **** 21, 21, 20, 20, 20, 20, 20, 20, 19, 19, 44:HW_drivers.c **** 19, 19, 19, 19, 19, 18, 18, 18, 18, 18, 45:HW_drivers.c **** 18, 18, 18, 17, 17, 17, 17, 17, 17, 17, 46:HW_drivers.c **** 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 47:HW_drivers.c **** 16, 15, 15, 15, 15, 15, 15, 15, 15, 15, 48:HW_drivers.c **** 15, 15, 14, 14, 14, 14, 14, 14, 14, 14, 49:HW_drivers.c **** 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 50:HW_drivers.c **** 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 51:HW_drivers.c **** 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 52:HW_drivers.c **** 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 53:HW_drivers.c **** 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 54:HW_drivers.c **** 11, 11, 11, 11, 11, 10, 10, 10, 10, 10, 55:HW_drivers.c **** 10, 10, 10, 10, 10}; 56:HW_drivers.c **** 57:HW_drivers.c **** 58:HW_drivers.c **** // Function Name: InitADC() 59:HW_drivers.c **** // 60:HW_drivers.c **** // Description: Initialize ADC hardware. (Port Direction bits are assumed to be configured else 61:HW_drivers.c **** // 62:HW_drivers.c **** // 63:HW_drivers.c **** void InitADC(void) 64:HW_drivers.c **** { 382 .LM1: 383 /* prologue: frame size=0 */ 384 /* prologue end (size=0) */ 65:HW_drivers.c **** /* Prime ADC mutex */ 66:HW_drivers.c **** AvrXSetSemaphore(&ADC_Mutex); 386 .LM2: 387 0000 80E0 ldi r24,lo8(ADC_Mutex) 388 0002 90E0 ldi r25,hi8(ADC_Mutex) 389 0004 0E94 0000 call AvrXSetSemaphore 67:HW_drivers.c **** 68:HW_drivers.c **** // configure ADC for left-adjusted results. 69:HW_drivers.c **** ADCSR = ADCSR_INIT; 391 .LM3: 392 0008 85E8 ldi r24,lo8(-123) 393 000a 86B9 out 38-0x20,r24 70:HW_drivers.c **** ADMUX = ADMUX_INIT; 395 .LM4: 396 000c 80E2 ldi r24,lo8(32) 397 000e 87B9 out 39-0x20,r24 71:HW_drivers.c **** SFIOR = SFIOR_INIT; 399 .LM5: 400 0010 80E1 ldi r24,lo8(16) 401 0012 80BD out 64-0x20,r24 72:HW_drivers.c **** 73:HW_drivers.c **** 74:HW_drivers.c **** } 403 .LM6: 404 /* epilogue: frame size=0 */ 405 0014 0895 ret 406 /* epilogue end (size=1) */ 407 /* function InitADC size 11 (10) */ 409 .Lscope0: 413 .global adc_read 415 adc_read: 75:HW_drivers.c **** 76:HW_drivers.c **** // Function: adc_read() 77:HW_drivers.c **** // 78:HW_drivers.c **** // Description: Start an ADC conversion on the specified channel and returns the result. 79:HW_drivers.c **** // 80:HW_drivers.c **** unsigned char adc_read(unsigned char channel) 81:HW_drivers.c **** { 417 .LM7: 418 /* prologue: frame size=0 */ 419 0016 1F93 push r17 420 /* prologue end (size=1) */ 421 0018 182F mov r17,r24 82:HW_drivers.c **** unsigned char s; 83:HW_drivers.c **** 84:HW_drivers.c **** AvrXWaitSemaphore(&ADC_Mutex); // To make function re-entrant. 423 .LM8: 424 .LBB2: 425 001a 80E0 ldi r24,lo8(ADC_Mutex) 426 001c 90E0 ldi r25,hi8(ADC_Mutex) 427 001e 0E94 0000 call AvrXWaitSemaphore 85:HW_drivers.c **** s = SREG; // Save processor status 429 .LM9: 430 0022 9FB7 in r25,95-0x20 86:HW_drivers.c **** BeginCritical(); 432 .LM10: 433 /* #APP */ 434 0024 F894 cli 435 87:HW_drivers.c **** 88:HW_drivers.c **** // Select channel to read 89:HW_drivers.c **** ADMUX = ADMUX & 0xE0; // Mask off select bits (5 bits) 437 .LM11: 438 /* #NOAPP */ 439 0026 87B1 in r24,39-0x20 440 0028 807E andi r24,lo8(-32) 441 002a 87B9 out 39-0x20,r24 90:HW_drivers.c **** ADMUX = ADMUX | (channel & 0x1F); // truncate channel and apply it. 443 .LM12: 444 002c 1F71 andi r17,lo8(31) 445 002e 87B1 in r24,39-0x20 446 0030 812B or r24,r17 447 0032 87B9 out 39-0x20,r24 91:HW_drivers.c **** 92:HW_drivers.c **** // Clear completion flag (precaution??) 93:HW_drivers.c **** sbi(ADCSR, ADIF); 449 .LM13: 450 0034 349A sbi 38-0x20,4 94:HW_drivers.c **** 95:HW_drivers.c **** // Start conversion 96:HW_drivers.c **** sbi(ADCSR, ADSC); 452 .LM14: 453 0036 369A sbi 38-0x20,6 97:HW_drivers.c **** 98:HW_drivers.c **** // Wait 'till conversion is done. (measured to be around 30us so won't bother with semaphore) 99:HW_drivers.c **** loop_until_bit_is_set(ADCSR, ADIF); 455 .LM15: 456 .L3: 457 0038 349B sbis 38-0x20,4 458 003a FECF rjmp .L3 100:HW_drivers.c **** 101:HW_drivers.c **** // EndCritical(); 102:HW_drivers.c **** SREG = s; // Restore processor status 460 .LM16: 461 003c 9FBF out 95-0x20,r25 103:HW_drivers.c **** 104:HW_drivers.c **** AvrXSetSemaphore(&ADC_Mutex); // Release to waiting tasks. 463 .LM17: 464 003e 80E0 ldi r24,lo8(ADC_Mutex) 465 0040 90E0 ldi r25,hi8(ADC_Mutex) 466 0042 0E94 0000 call AvrXSetSemaphore 105:HW_drivers.c **** 106:HW_drivers.c **** return (ADCH); 468 .LM18: 469 0046 85B1 in r24,37-0x20 470 0048 9927 clr r25 107:HW_drivers.c **** } 472 .LM19: 473 .LBE2: 474 /* epilogue: frame size=0 */ 475 004a 1F91 pop r17 476 004c 0895 ret 477 /* epilogue end (size=2) */ 478 /* function adc_read size 31 (28) */ 483 .Lscope1: 487 .global gpd_read 489 gpd_read: 108:HW_drivers.c **** 109:HW_drivers.c **** // Function: gpd_read() 110:HW_drivers.c **** // 111:HW_drivers.c **** // Description: Read the selected GP2D12 sensor and convert to centimeters. 112:HW_drivers.c **** // 113:HW_drivers.c **** unsigned char gpd_read(unsigned char sensor) 114:HW_drivers.c **** { 491 .LM20: 492 /* prologue: frame size=0 */ 493 004e 0F93 push r16 494 0050 1F93 push r17 495 0052 CF93 push r28 496 0054 DF93 push r29 497 /* prologue end (size=4) */ 498 0056 082F mov r16,r24 115:HW_drivers.c **** unsigned char reading; 116:HW_drivers.c **** unsigned char distance; 117:HW_drivers.c **** unsigned int average; 118:HW_drivers.c **** unsigned char i; 119:HW_drivers.c **** 120:HW_drivers.c **** average = 0; 500 .LM21: 501 .LBB3: 502 0058 C0E0 ldi r28,lo8(0) 503 005a D0E0 ldi r29,hi8(0) 121:HW_drivers.c **** 122:HW_drivers.c **** for (i = 0; i < GPD_SAMPLES ; i++) 505 .LM22: 506 005c 10E0 ldi r17,lo8(0) 507 .L12: 123:HW_drivers.c **** { 124:HW_drivers.c **** reading = adc_read(sensor); 509 .LM23: 510 005e 802F mov r24,r16 511 0060 0E94 0000 call adc_read 125:HW_drivers.c **** 126:HW_drivers.c **** // debug 127:HW_drivers.c **** //PutChar('('); 128:HW_drivers.c **** //PutDecWord(reading); 129:HW_drivers.c **** //PutChar(')'); 130:HW_drivers.c **** 131:HW_drivers.c **** // fetch conversion factor from lookup table (in FLASH) 132:HW_drivers.c **** average += PRG_RDB(&gpd_lookup[reading]); 513 .LM24: 514 .LBB4: 515 0064 E82F mov r30,r24 516 0066 FF27 clr r31 517 0068 E050 subi r30,lo8(-(gpd_lookup)) 518 006a F040 sbci r31,hi8(-(gpd_lookup)) 519 /* #APP */ 520 006c 8491 lpm r24, Z 521 /* #NOAPP */ 522 .LBE4: 523 006e C80F add r28,r24 524 0070 D11D adc r29,__zero_reg__ 526 .LM25: 527 0072 1F5F subi r17,lo8(-(1)) 528 0074 1230 cpi r17,lo8(2) 529 0076 98F3 brlo .L12 133:HW_drivers.c **** 134:HW_drivers.c **** } 135:HW_drivers.c **** distance = average/GPD_SAMPLES; 531 .LM26: 532 0078 D695 lsr r29 533 007a C795 ror r28 534 007c 8C2F mov r24,r28 136:HW_drivers.c **** 137:HW_drivers.c **** // Compensate for the 10cm offset. Return distance from outside robot shell, not from sensor! 138:HW_drivers.c **** if (distance == 255) 536 .LM27: 537 007e CF3F cpi r28,lo8(-1) 538 0080 19F4 brne .L13 139:HW_drivers.c **** return (255); 540 .LM28: 541 0082 8FEF ldi r24,lo8(255) 542 0084 90E0 ldi r25,hi8(255) 543 0086 02C0 rjmp .L7 544 .L13: 140:HW_drivers.c **** else 141:HW_drivers.c **** return (distance-10); 546 .LM29: 547 0088 8A50 subi r24,lo8(-(-10)) 548 008a 9927 clr r25 142:HW_drivers.c **** 143:HW_drivers.c **** } 550 .LM30: 551 .L7: 552 .LBE3: 553 /* epilogue: frame size=0 */ 554 008c DF91 pop r29 555 008e CF91 pop r28 556 0090 1F91 pop r17 557 0092 0F91 pop r16 558 0094 0895 ret 559 /* epilogue end (size=5) */ 560 /* function gpd_read size 37 (28) */ 571 .Lscope2: 574 .global SCM_Init 576 SCM_Init: 144:HW_drivers.c **** 145:HW_drivers.c **** // Function Name: SCM_Init() 146:HW_drivers.c **** // 147:HW_drivers.c **** // Description: Initialize The Smart Camera Module (SCM). 148:HW_drivers.c **** // 149:HW_drivers.c **** // 150:HW_drivers.c **** void SCM_Init(void) 151:HW_drivers.c **** { 578 .LM31: 579 /* prologue: frame size=0 */ 580 /* prologue end (size=0) */ 152:HW_drivers.c **** // Init Exposure 153:HW_drivers.c **** i2c_writebyte(SCM_I2C_ADDR, GB_C0, R_ParameterTable.scm_exposure_l); 582 .LM32: 583 0096 4091 0000 lds r20,R_ParameterTable+8 584 009a 64E1 ldi r22,lo8(20) 585 009c 80EB ldi r24,lo8(-80) 586 009e 0E94 0000 call i2c_writebyte 154:HW_drivers.c **** i2c_writebyte(SCM_I2C_ADDR, GB_C1, R_ParameterTable.scm_exposure_h); 588 .LM33: 589 00a2 4091 0000 lds r20,R_ParameterTable+7 590 00a6 65E1 ldi r22,lo8(21) 591 00a8 80EB ldi r24,lo8(-80) 592 00aa 0E94 0000 call i2c_writebyte 155:HW_drivers.c **** 156:HW_drivers.c **** // Init min size and threshold 157:HW_drivers.c **** i2c_writebyte(SCM_I2C_ADDR, SCM_TARGET_MIN_SIZE, R_ParameterTable.scm_min_size); 594 .LM34: 595 00ae 4091 0000 lds r20,R_ParameterTable+10 596 00b2 6CE0 ldi r22,lo8(12) 597 00b4 80EB ldi r24,lo8(-80) 598 00b6 0E94 0000 call i2c_writebyte 158:HW_drivers.c **** i2c_writebyte(SCM_I2C_ADDR, SCM_THRESHOLD, R_ParameterTable.scm_threshold); 600 .LM35: 601 00ba 4091 0000 lds r20,R_ParameterTable+9 602 00be 67E0 ldi r22,lo8(7) 603 00c0 80EB ldi r24,lo8(-80) 604 00c2 0E94 0000 call i2c_writebyte 159:HW_drivers.c **** 160:HW_drivers.c **** // Apply changes 161:HW_drivers.c **** i2c_writebyte(SCM_I2C_ADDR, SCM_UPDATE, 0x01); 606 .LM36: 607 00c6 41E0 ldi r20,lo8(1) 608 00c8 642F mov r22,r20 609 00ca 80EB ldi r24,lo8(-80) 610 00cc 0E94 0000 call i2c_writebyte 162:HW_drivers.c **** } 612 .LM37: 613 /* epilogue: frame size=0 */ 614 00d0 0895 ret 615 /* epilogue end (size=1) */ 616 /* function SCM_Init size 30 (29) */ 618 .Lscope3: 622 .global SCM_calibrate 624 SCM_calibrate: 163:HW_drivers.c **** 164:HW_drivers.c **** // Function Name: SCM_calibrate() 165:HW_drivers.c **** // 166:HW_drivers.c **** // Description: Have the SCM calibrate to the current light conditions and candle. 167:HW_drivers.c **** // Inputs: If save argument is TRUE, then save resulting exposure to EEPROM. 168:HW_drivers.c **** // 169:HW_drivers.c **** void SCM_calibrate(unsigned char save) 170:HW_drivers.c **** { 626 .LM38: 627 /* prologue: frame size=0 */ 628 00d2 CF93 push r28 629 /* prologue end (size=1) */ 630 00d4 C82F mov r28,r24 171:HW_drivers.c **** bit_set(LED0); //debug 632 .LM39: 633 00d6 C09A sbi 56-0x20,0 172:HW_drivers.c **** 173:HW_drivers.c **** i2c_writebyte(SCM_I2C_ADDR, SCM_AUTO_CALIBRATE, TRUE); 635 .LM40: 636 00d8 41E0 ldi r20,lo8(1) 637 00da 6DE0 ldi r22,lo8(13) 638 00dc 80EB ldi r24,lo8(-80) 639 00de 0E94 0000 call i2c_writebyte 174:HW_drivers.c **** 175:HW_drivers.c **** while (i2c_readbyte(SCM_I2C_ADDR, SCM_AUTO_CALIBRATE) != FALSE) 641 .LM41: 642 .L19: 643 00e2 6DE0 ldi r22,lo8(13) 644 00e4 80EB ldi r24,lo8(-80) 645 00e6 0E94 0000 call i2c_readbyte 646 00ea 8823 tst r24 647 00ec D1F7 brne .L19 176:HW_drivers.c **** ; 177:HW_drivers.c **** bit_clear(LED0); // debug 649 .LM42: 650 00ee C098 cbi 56-0x20,0 178:HW_drivers.c **** 179:HW_drivers.c **** // If result was positive, save to EEPROM 180:HW_drivers.c **** if (i2c_readbyte(SCM_I2C_ADDR, SCM_STATUS) == TRUE && save == TRUE) 652 .LM43: 653 00f0 62E0 ldi r22,lo8(2) 654 00f2 80EB ldi r24,lo8(-80) 655 00f4 0E94 0000 call i2c_readbyte 656 00f8 8130 cpi r24,lo8(1) 657 00fa A1F4 brne .L18 658 00fc C130 cpi r28,lo8(1) 659 00fe 91F4 brne .L18 181:HW_drivers.c **** { 182:HW_drivers.c **** eeprom_write_byte(&E_ParameterTable.scm_exposure_h, i2c_readbyte(SCM_I2C_ADDR, GB_C1)); 661 .LM44: 662 0100 65E1 ldi r22,lo8(21) 663 0102 80EB ldi r24,lo8(-80) 664 0104 0E94 0000 call i2c_readbyte 665 0108 682F mov r22,r24 666 010a 80E0 ldi r24,lo8(E_ParameterTable+7) 667 010c 90E0 ldi r25,hi8(E_ParameterTable+7) 668 010e 0E94 0000 call eeprom_write_byte 183:HW_drivers.c **** eeprom_write_byte(&E_ParameterTable.scm_exposure_l, i2c_readbyte(SCM_I2C_ADDR, GB_C0)); 670 .LM45: 671 0112 64E1 ldi r22,lo8(20) 672 0114 80EB ldi r24,lo8(-80) 673 0116 0E94 0000 call i2c_readbyte 674 011a 682F mov r22,r24 675 011c 80E0 ldi r24,lo8(E_ParameterTable+8) 676 011e 90E0 ldi r25,hi8(E_ParameterTable+8) 677 0120 0E94 0000 call eeprom_write_byte 184:HW_drivers.c **** } 185:HW_drivers.c **** } 679 .LM46: 680 .L18: 681 /* epilogue: frame size=0 */ 682 0124 CF91 pop r28 683 0126 0895 ret 684 /* epilogue end (size=2) */ 685 /* function SCM_calibrate size 43 (40) */ 687 .Lscope4: 691 .global Line_calibrate 693 Line_calibrate: 186:HW_drivers.c **** 187:HW_drivers.c **** // Function Name: Line_calibrate() 188:HW_drivers.c **** // 189:HW_drivers.c **** // Description: Sample the line sensors and calibrate. (Robot should be placed over a white lin 190:HW_drivers.c **** // Inputs: If save argument is TRUE, then save resulting exposure to EEPROM. 191:HW_drivers.c **** // 192:HW_drivers.c **** void Line_calibrate(unsigned char save) 193:HW_drivers.c **** { 695 .LM47: 696 /* prologue: frame size=0 */ 697 0128 AF92 push r10 698 012a BF92 push r11 699 012c CF92 push r12 700 012e DF92 push r13 701 0130 EF92 push r14 702 0132 FF92 push r15 703 0134 0F93 push r16 704 0136 1F93 push r17 705 0138 CF93 push r28 706 013a DF93 push r29 707 /* prologue end (size=10) */ 708 013c A82E mov r10,r24 194:HW_drivers.c **** unsigned int sample_l; 195:HW_drivers.c **** unsigned int sample_r; 196:HW_drivers.c **** unsigned char i; 197:HW_drivers.c **** 198:HW_drivers.c **** #define LINE_SAMPLES 3 199:HW_drivers.c **** 200:HW_drivers.c **** // 201:HW_drivers.c **** // Get Max reading for Both Line sensors 202:HW_drivers.c **** // 203:HW_drivers.c **** 204:HW_drivers.c **** sample_l = 0x0; // Setup 710 .LM48: 711 .LBB5: 712 013e EE24 clr r14 713 0140 FF24 clr r15 205:HW_drivers.c **** sample_r = 0x0; 715 .LM49: 716 0142 6701 movw r12,r14 206:HW_drivers.c **** 207:HW_drivers.c **** for (i = 0; i < LINE_CALIBRATE_SAMPLES; i++) 718 .LM50: 719 0144 BB24 clr r11 720 .L32: 208:HW_drivers.c **** { 209:HW_drivers.c **** // Keep highest samples 210:HW_drivers.c **** sample_l = MAX(adc_read(LINE_SENSOR_L), sample_l); 722 .LM51: 723 0146 86E0 ldi r24,lo8(6) 724 0148 0E94 0000 call adc_read 725 014c 9927 clr r25 726 014e C816 cp r12,r24 727 0150 D906 cpc r13,r25 728 0152 30F4 brsh .L28 729 0154 86E0 ldi r24,lo8(6) 730 0156 0E94 0000 call adc_read 731 015a 082F mov r16,r24 732 015c 1127 clr r17 733 015e 01C0 rjmp .L29 734 .L28: 735 0160 8601 movw r16,r12 736 .L29: 737 0162 6801 movw r12,r16 211:HW_drivers.c **** sample_r = MAX(adc_read(LINE_SENSOR_R), sample_r); 739 .LM52: 740 0164 87E0 ldi r24,lo8(7) 741 0166 0E94 0000 call adc_read 742 016a 9927 clr r25 743 016c E816 cp r14,r24 744 016e F906 cpc r15,r25 745 0170 30F4 brsh .L30 746 0172 87E0 ldi r24,lo8(7) 747 0174 0E94 0000 call adc_read 748 0178 C82F mov r28,r24 749 017a DD27 clr r29 750 017c 01C0 rjmp .L31 751 .L30: 752 017e E701 movw r28,r14 753 .L31: 754 0180 7E01 movw r14,r28 756 .LM53: 757 0182 B394 inc r11 758 0184 83E0 ldi r24,lo8(3) 759 0186 8B15 cp r24,r11 760 0188 F0F6 brsh .L32 212:HW_drivers.c **** } 213:HW_drivers.c **** 214:HW_drivers.c **** // Debug 215:HW_drivers.c **** PutDecWord(sample_l); 762 .LM54: 763 018a C801 movw r24,r16 764 018c 0E94 0000 call PutDecWord 216:HW_drivers.c **** PutChar('-'); 766 .LM55: 767 0190 8DE2 ldi r24,lo8(45) 768 0192 0E94 0000 call PutChar 217:HW_drivers.c **** PutDecWord(sample_r); 770 .LM56: 771 0196 CE01 movw r24,r28 772 0198 0E94 0000 call PutDecWord 218:HW_drivers.c **** 219:HW_drivers.c **** // Save results to RAM parameter table (temporary) 220:HW_drivers.c **** R_ParameterTable.line_threshold = MAX(sample_r, sample_l); 774 .LM57: 775 019c C801 movw r24,r16 776 019e 0C17 cp r16,r28 777 01a0 1D07 cpc r17,r29 778 01a2 08F4 brsh .L33 779 01a4 CE01 movw r24,r28 780 .L33: 781 01a6 8093 0000 sts R_ParameterTable+6,r24 221:HW_drivers.c **** 222:HW_drivers.c **** PutChar('='); 783 .LM58: 784 01aa 8DE3 ldi r24,lo8(61) 785 01ac 0E94 0000 call PutChar 223:HW_drivers.c **** PutDecWord(R_ParameterTable.line_threshold); 787 .LM59: 788 01b0 8091 0000 lds r24,R_ParameterTable+6 789 01b4 9927 clr r25 790 01b6 0E94 0000 call PutDecWord 224:HW_drivers.c **** 225:HW_drivers.c **** // Apply fudge factor and validify it. 226:HW_drivers.c **** R_ParameterTable.line_threshold += ((R_ParameterTable.line_threshold * LINE_CALIBRATE_FUDGE_FACTOR 227:HW_drivers.c **** 228:HW_drivers.c **** PutChar('='); 792 .LM60: 793 01ba 8DE3 ldi r24,lo8(61) 794 01bc 0E94 0000 call PutChar 229:HW_drivers.c **** PutDecWord(R_ParameterTable.line_threshold); 796 .LM61: 797 01c0 8091 0000 lds r24,R_ParameterTable+6 798 01c4 9927 clr r25 799 01c6 0E94 0000 call PutDecWord 230:HW_drivers.c **** 231:HW_drivers.c **** // Should we make those permanent? 232:HW_drivers.c **** if (save == TRUE) 801 .LM62: 802 01ca 81E0 ldi r24,lo8(1) 803 01cc A816 cp r10,r24 804 01ce 31F4 brne .L23 233:HW_drivers.c **** { 234:HW_drivers.c **** eeprom_write_byte(&E_ParameterTable.line_threshold, R_ParameterTable.line_threshold); 806 .LM63: 807 01d0 6091 0000 lds r22,R_ParameterTable+6 808 01d4 80E0 ldi r24,lo8(E_ParameterTable+6) 809 01d6 90E0 ldi r25,hi8(E_ParameterTable+6) 810 01d8 0E94 0000 call eeprom_write_byte 235:HW_drivers.c **** } 236:HW_drivers.c **** } 812 .LM64: 813 .L23: 814 .LBE5: 815 /* epilogue: frame size=0 */ 816 01dc DF91 pop r29 817 01de CF91 pop r28 818 01e0 1F91 pop r17 819 01e2 0F91 pop r16 820 01e4 FF90 pop r15 821 01e6 EF90 pop r14 822 01e8 DF90 pop r13 823 01ea CF90 pop r12 824 01ec BF90 pop r11 825 01ee AF90 pop r10 826 01f0 0895 ret 827 /* epilogue end (size=11) */ 828 /* function Line_calibrate size 101 (80) */ 835 .Lscope5: 837 .lcomm ADC_Mutex,2 840 .text 842 Letext: 843 /* File "HW_drivers.c": code 253 = 0x00fd ( 215), prologues 16, epilogues 22 */ DEFINED SYMBOLS *ABS*:00000000 HW_drivers.c *ABS*:0000003f __SREG__ *ABS*:0000003e __SP_H__ *ABS*:0000003d __SP_L__ *ABS*:00000000 __tmp_reg__ *ABS*:00000001 __zero_reg__ C:\DOCUME~1\palm3\LOCALS~1\Temp/ccM5aaaa.s:120 .progmem.data:00000000 gpd_lookup C:\DOCUME~1\palm3\LOCALS~1\Temp/ccM5aaaa.s:380 .text:00000000 InitADC .bss:00000000 ADC_Mutex C:\DOCUME~1\palm3\LOCALS~1\Temp/ccM5aaaa.s:415 .text:00000016 adc_read C:\DOCUME~1\palm3\LOCALS~1\Temp/ccM5aaaa.s:489 .text:0000004e gpd_read C:\DOCUME~1\palm3\LOCALS~1\Temp/ccM5aaaa.s:576 .text:00000096 SCM_Init C:\DOCUME~1\palm3\LOCALS~1\Temp/ccM5aaaa.s:624 .text:000000d2 SCM_calibrate C:\DOCUME~1\palm3\LOCALS~1\Temp/ccM5aaaa.s:693 .text:00000128 Line_calibrate C:\DOCUME~1\palm3\LOCALS~1\Temp/ccM5aaaa.s:842 .text:000001f2 Letext *ABS*:00000000 *ABS* UNDEFINED SYMBOLS __do_copy_data __do_clear_bss AvrXSetSemaphore AvrXWaitSemaphore R_ParameterTable i2c_writebyte i2c_readbyte E_ParameterTable eeprom_write_byte PutDecWord PutChar