Files

482 lines
29 KiB
Plaintext

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)