1 ;-------------------------------------------------------- 2 ; File Created by SDCC : free open source ANSI-C Compiler 3 ; Version 4.2.0 #13081 (Linux) 4 ;-------------------------------------------------------- 5 .module adc 6 .optsdcc -mmcs51 --model-small 7 8 ;-------------------------------------------------------- 9 ; Public variables in this module 10 ;-------------------------------------------------------- 11 .globl _delay_ms 12 .globl _delay_us 13 .globl _EADC 14 .globl _ET1 15 .globl _ET0 16 .globl _ES 17 .globl _EA 18 .globl _REN 19 .globl _RI 20 .globl _TI 21 .globl _TR1 22 .globl _TF1 23 .globl _IT0 24 .globl _IE0 25 .globl _TR0 26 .globl _TF0 27 .globl _CMPCR2 28 .globl _CMPCR1 29 .globl _TA 30 .globl _IRCBAND_REG 31 .globl _IAP_TPS 32 .globl _IAP_CONTR 33 .globl _IAP_TRIG 34 .globl _IAP_CMD 35 .globl _IAP_ADDRL 36 .globl _IAP_ADDRH 37 .globl _IAP_DATA 38 .globl _WDT_CONTR 39 .globl _PCA_PWM3 40 .globl _PCA_PWM2 41 .globl _PCA_PWM1 42 .globl _PCA_PWM0 43 .globl _CCAP3L 44 .globl _CCAP2L 45 .globl _CCAP1L 46 .globl _CCAP0L 47 .globl _CCAPM3 48 .globl _CCAPM2 49 .globl _CCAPM1 50 .globl _CCAPM0 51 .globl _CMOD 52 .globl _CCON 53 .globl _ADCTIM_X 54 .globl _ADCCFG 55 .globl _ADC_RESL 56 .globl _ADC_RES 57 .globl _ADC_CONTR 58 .globl _SPDAT 59 .globl _SPCTL 60 .globl _SPSTAT 61 .globl _IP2H 62 .globl _IP2 63 .globl _IP 64 .globl _IE2 65 .globl _IE 66 .globl _BRT 67 .globl _P_SW1 68 .globl _SADEN 69 .globl _SADDR 70 .globl _S2BUF 71 .globl _S2CON 72 .globl _SBUF 73 .globl _SCON 74 .globl _TM4PS_X 75 .globl _TM3PS_X 76 .globl _TM2PS_X 77 .globl _T4T3M 78 .globl _T4L 79 .globl _T4H 80 .globl _T3L 81 .globl _T3H 82 .globl _T2L 83 .globl _T2H 84 .globl _INTCLKO 85 .globl _AUXR 86 .globl _TH1 87 .globl _TH0 88 .globl _TL1 89 .globl _TL0 90 .globl _TMOD 91 .globl _TCON 92 .globl _P_SW2 93 .globl _P5M0 94 .globl _P5M1 95 .globl _P4M0 96 .globl _P4M1 97 .globl _P3M0 98 .globl _P3M1 99 .globl _P2M0 100 .globl _P2M1 101 .globl _P1M0 102 .globl _P1M1 103 .globl _P0M0 104 .globl _P0M1 105 .globl _PSW 106 .globl _B 107 .globl _ACC 108 .globl _PCON 109 .globl _DPH 110 .globl _DPL 111 .globl _SP 112 .globl _P5 113 .globl _P4 114 .globl _P3 115 .globl _P2 116 .globl _P1 117 .globl _P0 118 .globl _adc_init 119 .globl _adc_read 120 .globl _battery_read_mv 121 ;-------------------------------------------------------- 122 ; special function registers 123 ;-------------------------------------------------------- 124 .area RSEG (ABS,DATA) 000000 125 .org 0x0000 000080 126 _P0 = 0x0080 000090 127 _P1 = 0x0090 0000A0 128 _P2 = 0x00a0 0000B0 129 _P3 = 0x00b0 0000C0 130 _P4 = 0x00c0 0000C8 131 _P5 = 0x00c8 000081 132 _SP = 0x0081 000082 133 _DPL = 0x0082 000083 134 _DPH = 0x0083 000087 135 _PCON = 0x0087 0000E0 136 _ACC = 0x00e0 0000F0 137 _B = 0x00f0 0000D0 138 _PSW = 0x00d0 000093 139 _P0M1 = 0x0093 000094 140 _P0M0 = 0x0094 000091 141 _P1M1 = 0x0091 000092 142 _P1M0 = 0x0092 000095 143 _P2M1 = 0x0095 000096 144 _P2M0 = 0x0096 0000B1 145 _P3M1 = 0x00b1 0000B2 146 _P3M0 = 0x00b2 0000B3 147 _P4M1 = 0x00b3 0000B4 148 _P4M0 = 0x00b4 0000C9 149 _P5M1 = 0x00c9 0000CA 150 _P5M0 = 0x00ca 0000BA 151 _P_SW2 = 0x00ba 000088 152 _TCON = 0x0088 000089 153 _TMOD = 0x0089 00008A 154 _TL0 = 0x008a 00008B 155 _TL1 = 0x008b 00008C 156 _TH0 = 0x008c 00008D 157 _TH1 = 0x008d 00008E 158 _AUXR = 0x008e 00008F 159 _INTCLKO = 0x008f 0000D6 160 _T2H = 0x00d6 0000D7 161 _T2L = 0x00d7 0000D4 162 _T3H = 0x00d4 0000D5 163 _T3L = 0x00d5 0000D2 164 _T4H = 0x00d2 0000D3 165 _T4L = 0x00d3 0000D1 166 _T4T3M = 0x00d1 00FEA1 167 _TM2PS_X = 0xfea1 00FEA2 168 _TM3PS_X = 0xfea2 00FEA3 169 _TM4PS_X = 0xfea3 000098 170 _SCON = 0x0098 000099 171 _SBUF = 0x0099 00009A 172 _S2CON = 0x009a 00009B 173 _S2BUF = 0x009b 0000A9 174 _SADDR = 0x00a9 0000B9 175 _SADEN = 0x00b9 0000A2 176 _P_SW1 = 0x00a2 00009C 177 _BRT = 0x009c 0000A8 178 _IE = 0x00a8 0000AF 179 _IE2 = 0x00af 0000B8 180 _IP = 0x00b8 0000B6 181 _IP2 = 0x00b6 0000B7 182 _IP2H = 0x00b7 0000CD 183 _SPSTAT = 0x00cd 0000CE 184 _SPCTL = 0x00ce 0000CF 185 _SPDAT = 0x00cf 0000BC 186 _ADC_CONTR = 0x00bc 0000BD 187 _ADC_RES = 0x00bd 0000BE 188 _ADC_RESL = 0x00be 0000DE 189 _ADCCFG = 0x00de 00FEA8 190 _ADCTIM_X = 0xfea8 0000D8 191 _CCON = 0x00d8 0000D9 192 _CMOD = 0x00d9 0000DA 193 _CCAPM0 = 0x00da 0000DB 194 _CCAPM1 = 0x00db 0000DC 195 _CCAPM2 = 0x00dc 0000DD 196 _CCAPM3 = 0x00dd 0000EA 197 _CCAP0L = 0x00ea 0000EB 198 _CCAP1L = 0x00eb 0000EC 199 _CCAP2L = 0x00ec 0000ED 200 _CCAP3L = 0x00ed 0000F2 201 _PCA_PWM0 = 0x00f2 0000F3 202 _PCA_PWM1 = 0x00f3 0000F4 203 _PCA_PWM2 = 0x00f4 0000F5 204 _PCA_PWM3 = 0x00f5 0000C1 205 _WDT_CONTR = 0x00c1 0000C2 206 _IAP_DATA = 0x00c2 0000C3 207 _IAP_ADDRH = 0x00c3 0000C4 208 _IAP_ADDRL = 0x00c4 0000C5 209 _IAP_CMD = 0x00c5 0000C6 210 _IAP_TRIG = 0x00c6 0000C7 211 _IAP_CONTR = 0x00c7 0000F7 212 _IAP_TPS = 0x00f7 00009D 213 _IRCBAND_REG = 0x009d 0000AE 214 _TA = 0x00ae 0000E6 215 _CMPCR1 = 0x00e6 0000E7 216 _CMPCR2 = 0x00e7 217 ;-------------------------------------------------------- 218 ; special function bits 219 ;-------------------------------------------------------- 220 .area RSEG (ABS,DATA) 000000 221 .org 0x0000 00008D 222 _TF0 = 0x008d 00008C 223 _TR0 = 0x008c 000089 224 _IE0 = 0x0089 000088 225 _IT0 = 0x0088 00008F 226 _TF1 = 0x008f 00008E 227 _TR1 = 0x008e 000099 228 _TI = 0x0099 000098 229 _RI = 0x0098 00009C 230 _REN = 0x009c 0000AF 231 _EA = 0x00af 0000AC 232 _ES = 0x00ac 0000A9 233 _ET0 = 0x00a9 0000AB 234 _ET1 = 0x00ab 0000AD 235 _EADC = 0x00ad 236 ;-------------------------------------------------------- 237 ; overlayable register banks 238 ;-------------------------------------------------------- 239 .area REG_BANK_0 (REL,OVR,DATA) 000000 240 .ds 8 241 ;-------------------------------------------------------- 242 ; internal ram data 243 ;-------------------------------------------------------- 244 .area DSEG (DATA) 245 ;-------------------------------------------------------- 246 ; overlayable items in internal ram 247 ;-------------------------------------------------------- 248 ;-------------------------------------------------------- 249 ; indirectly addressable internal ram data 250 ;-------------------------------------------------------- 251 .area ISEG (DATA) 252 ;-------------------------------------------------------- 253 ; absolute internal ram data 254 ;-------------------------------------------------------- 255 .area IABS (ABS,DATA) 256 .area IABS (ABS,DATA) 257 ;-------------------------------------------------------- 258 ; bit data 259 ;-------------------------------------------------------- 260 .area BSEG (BIT) 000000 261 _adc_busy: 000000 262 .ds 1 263 ;-------------------------------------------------------- 264 ; paged external ram data 265 ;-------------------------------------------------------- 266 .area PSEG (PAG,XDATA) 267 ;-------------------------------------------------------- 268 ; external ram data 269 ;-------------------------------------------------------- 270 .area XSEG (XDATA) 271 ;-------------------------------------------------------- 272 ; absolute external ram data 273 ;-------------------------------------------------------- 274 .area XABS (ABS,XDATA) 275 ;-------------------------------------------------------- 276 ; external initialized ram data 277 ;-------------------------------------------------------- 278 .area XISEG (XDATA) 279 .area HOME (CODE) 280 .area GSINIT0 (CODE) 281 .area GSINIT1 (CODE) 282 .area GSINIT2 (CODE) 283 .area GSINIT3 (CODE) 284 .area GSINIT4 (CODE) 285 .area GSINIT5 (CODE) 286 .area GSINIT (CODE) 287 .area GSFINAL (CODE) 288 .area CSEG (CODE) 289 ;-------------------------------------------------------- 290 ; global & static initialisations 291 ;-------------------------------------------------------- 292 .area HOME (CODE) 293 .area GSINIT (CODE) 294 .area GSFINAL (CODE) 295 .area GSINIT (CODE) 296 ; src/adc.c:11: static volatile __bit adc_busy = 0; 297 ; assignBit 000000 C2*00 [12] 298 clr _adc_busy 299 ;-------------------------------------------------------- 300 ; Home 301 ;-------------------------------------------------------- 302 .area HOME (CODE) 303 .area HOME (CODE) 304 ;-------------------------------------------------------- 305 ; code 306 ;-------------------------------------------------------- 307 .area CSEG (CODE) 308 ;------------------------------------------------------------ 309 ;Allocation info for local variables in function 'adc_init' 310 ;------------------------------------------------------------ 311 ; src/adc.c:13: void adc_init(void) 312 ; ----------------------------------------- 313 ; function adc_init 314 ; ----------------------------------------- 000000 315 _adc_init: 000007 316 ar7 = 0x07 000006 317 ar6 = 0x06 000005 318 ar5 = 0x05 000004 319 ar4 = 0x04 000003 320 ar3 = 0x03 000002 321 ar2 = 0x02 000001 322 ar1 = 0x01 000000 323 ar0 = 0x00 324 ; src/adc.c:16: P3M0 &= ~(1 << 3); 000000 53 B2 F7 [24] 325 anl _P3M0,#0xf7 326 ; src/adc.c:17: P3M1 |= (1 << 3); 000003 43 B1 08 [24] 327 orl _P3M1,#0x08 328 ; src/adc.c:20: ADCCFG = 0x20 | 0x0F; 000006 75 DE 2F [24] 329 mov _ADCCFG,#0x2f 330 ; src/adc.c:23: P_SW2 |= 0x80; 000009 43 BA 80 [24] 331 orl _P_SW2,#0x80 332 ; src/adc.c:24: *((volatile uint8_t __xdata *)0xFEA8) = 0xFF; /* ADCTIM = 0xFF (最大采样) */ 00000C 90 FE A8 [24] 333 mov dptr,#0xfea8 00000F 74 FF [12] 334 mov a,#0xff 000011 F0 [24] 335 movx @dptr,a 336 ; src/adc.c:25: P_SW2 &= ~0x80; 000012 53 BA 7F [24] 337 anl _P_SW2,#0x7f 338 ; src/adc.c:28: EADC = 0; 339 ; assignBit 000015 C2 AD [12] 340 clr _EADC 341 ; src/adc.c:31: ADC_CONTR = ADC_POWER; 000017 75 BC 80 [24] 342 mov _ADC_CONTR,#0x80 343 ; src/adc.c:32: delay_ms(2); /* 等待 ADC 稳定 */ 00001A 90 00 02 [24] 344 mov dptr,#0x0002 345 ; src/adc.c:33: } 00001D 02r00r00 [24] 346 ljmp _delay_ms 347 ;------------------------------------------------------------ 348 ;Allocation info for local variables in function 'adc_read' 349 ;------------------------------------------------------------ 350 ;ch Allocated to registers r7 351 ;------------------------------------------------------------ 352 ; src/adc.c:35: uint16_t adc_read(uint8_t ch) 353 ; ----------------------------------------- 354 ; function adc_read 355 ; ----------------------------------------- 000020 356 _adc_read: 357 ; src/adc.c:37: if (ch > 15) return 0; 000020 E5 82 [12] 358 mov a,dpl 000022 FF [12] 359 mov r7,a 000023 24 F0 [12] 360 add a,#0xff - 0x0f 000025 50 04 [24] 361 jnc 00102$ 000027 90 00 00 [24] 362 mov dptr,#0x0000 00002A 22 [24] 363 ret 00002B 364 00102$: 365 ; src/adc.c:38: ADC_CONTR = ADC_POWER | (ch & 0x0F); /* 选择通道 */ 00002B 74 0F [12] 366 mov a,#0x0f 00002D 5F [12] 367 anl a,r7 00002E 44 80 [12] 368 orl a,#0x80 000030 F5 BC [12] 369 mov _ADC_CONTR,a 370 ; src/adc.c:39: delay_us(20); /* 等待通道切换稳定 */ 000032 90 00 14 [24] 371 mov dptr,#0x0014 000035 12r00r00 [24] 372 lcall _delay_us 373 ; src/adc.c:40: ADC_CONTR |= ADC_START; /* 启动 */ 000038 43 BC 40 [24] 374 orl _ADC_CONTR,#0x40 375 ; src/adc.c:41: while (!(ADC_CONTR & ADC_FLAG)); /* 等待完成 */ 00003B 376 00103$: 00003B E5 BC [12] 377 mov a,_ADC_CONTR 00003D 30 E5 FB [24] 378 jnb acc.5,00103$ 379 ; src/adc.c:42: ADC_CONTR &= ~ADC_FLAG; /* 清标志 */ 000040 53 BC DF [24] 380 anl _ADC_CONTR,#0xdf 381 ; src/adc.c:45: return (((uint16_t)ADC_RES & 0x03) << 8) | ADC_RESL; 000043 AF BD [24] 382 mov r7,_ADC_RES 000045 53 07 03 [24] 383 anl ar7,#0x03 000048 8F 06 [24] 384 mov ar6,r7 00004A 7F 00 [12] 385 mov r7,#0x00 00004C AC BE [24] 386 mov r4,_ADC_RESL 00004E 7D 00 [12] 387 mov r5,#0x00 000050 EC [12] 388 mov a,r4 000051 42 07 [12] 389 orl ar7,a 000053 ED [12] 390 mov a,r5 000054 42 06 [12] 391 orl ar6,a 000056 8F 82 [24] 392 mov dpl,r7 000058 8E 83 [24] 393 mov dph,r6 394 ; src/adc.c:46: } 00005A 22 [24] 395 ret 396 ;------------------------------------------------------------ 397 ;Allocation info for local variables in function 'battery_read_mv' 398 ;------------------------------------------------------------ 399 ;adc Allocated to registers 400 ;v Allocated to registers r4 r5 r6 r7 401 ;------------------------------------------------------------ 402 ; src/adc.c:48: uint16_t battery_read_mv(void) 403 ; ----------------------------------------- 404 ; function battery_read_mv 405 ; ----------------------------------------- 00005B 406 _battery_read_mv: 407 ; src/adc.c:50: uint16_t adc = adc_read(ADC_BAT_CH); /* 0..1023 */ 00005B 75 82 0B [24] 408 mov dpl,#0x0b 00005E 12r00r20 [24] 409 lcall _adc_read 410 ; src/adc.c:52: float v = (float)adc / 1024.0f * ADC_VREF_VOLT * BATTERY_DIVIDER; 000061 12r00r00 [24] 411 lcall ___uint2fs 000064 AC 82 [24] 412 mov r4,dpl 000066 AD 83 [24] 413 mov r5,dph 000068 AE F0 [24] 414 mov r6,b 00006A FF [12] 415 mov r7,a 00006B E4 [12] 416 clr a 00006C C0 E0 [24] 417 push acc 00006E C0 E0 [24] 418 push acc 000070 74 80 [12] 419 mov a,#0x80 000072 C0 E0 [24] 420 push acc 000074 74 44 [12] 421 mov a,#0x44 000076 C0 E0 [24] 422 push acc 000078 8C 82 [24] 423 mov dpl,r4 00007A 8D 83 [24] 424 mov dph,r5 00007C 8E F0 [24] 425 mov b,r6 00007E EF [12] 426 mov a,r7 00007F 12r00r00 [24] 427 lcall ___fsdiv 000082 AC 82 [24] 428 mov r4,dpl 000084 AD 83 [24] 429 mov r5,dph 000086 AE F0 [24] 430 mov r6,b 000088 FF [12] 431 mov r7,a 000089 E5 81 [12] 432 mov a,sp 00008B 24 FC [12] 433 add a,#0xfc 00008D F5 81 [12] 434 mov sp,a 00008F C0 04 [24] 435 push ar4 000091 C0 05 [24] 436 push ar5 000093 C0 06 [24] 437 push ar6 000095 C0 07 [24] 438 push ar7 000097 90 00 00 [24] 439 mov dptr,#0x0000 00009A 75 F0 20 [24] 440 mov b,#0x20 00009D 74 41 [12] 441 mov a,#0x41 00009F 12r00r00 [24] 442 lcall ___fsmul 0000A2 AC 82 [24] 443 mov r4,dpl 0000A4 AD 83 [24] 444 mov r5,dph 0000A6 AE F0 [24] 445 mov r6,b 0000A8 FF [12] 446 mov r7,a 0000A9 E5 81 [12] 447 mov a,sp 0000AB 24 FC [12] 448 add a,#0xfc 0000AD F5 81 [12] 449 mov sp,a 450 ; src/adc.c:53: return (uint16_t)(v * 1000); /* mV */ 0000AF C0 04 [24] 451 push ar4 0000B1 C0 05 [24] 452 push ar5 0000B3 C0 06 [24] 453 push ar6 0000B5 C0 07 [24] 454 push ar7 0000B7 90 00 00 [24] 455 mov dptr,#0x0000 0000BA 75 F0 7A [24] 456 mov b,#0x7a 0000BD 74 44 [12] 457 mov a,#0x44 0000BF 12r00r00 [24] 458 lcall ___fsmul 0000C2 AC 82 [24] 459 mov r4,dpl 0000C4 AD 83 [24] 460 mov r5,dph 0000C6 AE F0 [24] 461 mov r6,b 0000C8 FF [12] 462 mov r7,a 0000C9 E5 81 [12] 463 mov a,sp 0000CB 24 FC [12] 464 add a,#0xfc 0000CD F5 81 [12] 465 mov sp,a 0000CF 8C 82 [24] 466 mov dpl,r4 0000D1 8D 83 [24] 467 mov dph,r5 0000D3 8E F0 [24] 468 mov b,r6 0000D5 EF [12] 469 mov a,r7 470 ; src/adc.c:54: } 0000D6 02r00r00 [24] 471 ljmp ___fs2uint 472 .area CSEG (CODE) 473 .area CONST (CODE) 000000 474 _DEFAULT_ADDR: 000000 E7 475 .db #0xe7 ; 231 000001 E7 476 .db #0xe7 ; 231 000002 E7 477 .db #0xe7 ; 231 000003 E7 478 .db #0xe7 ; 231 000004 C2 479 .db #0xc2 ; 194 480 .area XINIT (CODE) 481 .area CABS (ABS,CODE)