📄 251.lis
字号:
01E8 ; SPCR = 0x51; //setup SPI
01E8 81E5 ldi R24,81
01EA 8DB9 out 0xd,R24
01EC .dbline 240
01EC ; SPSR = 0x00; //setup SPI
01EC 2224 clr R2
01EE 2EB8 out 0xe,R2
01F0 .dbline -2
01F0 L39:
01F0 .dbline 0 ; func end
01F0 0895 ret
01F2 .dbend
01F2 .dbfunc e adc_setmux _adc_setmux fV
01F2 ; channel -> R16
.even
01F2 _adc_setmux::
01F2 .dbline -1
01F2 .dbline 246
01F2 ; }
01F2 ;
01F2 ; //ADC initialize
01F2 ; // Conversion time: 104uS
01F2 ; void adc_setmux(uchar channel)
01F2 ; {
01F2 .dbline 247
01F2 ; if(channel>5)
01F2 85E0 ldi R24,5
01F4 8017 cp R24,R16
01F6 08F4 brsh L41
01F8 .dbline 248
01F8 ; channel = 0;
01F8 0027 clr R16
01FA L41:
01FA .dbline 249
01FA ; ADMUX &= BIT(7)|BIT(6)|BIT(5)|BIT(4);
01FA 87B1 in R24,0x7
01FC 807F andi R24,240
01FE 87B9 out 0x7,R24
0200 .dbline 250
0200 ; ADMUX |= channel;
0200 27B0 in R2,0x7
0202 202A or R2,R16
0204 27B8 out 0x7,R2
0206 .dbline -2
0206 L40:
0206 .dbline 0 ; func end
0206 0895 ret
0208 .dbsym r channel 16 c
0208 .dbend
0208 .dbfunc e adc_init _adc_init fV
.even
0208 _adc_init::
0208 .dbline -1
0208 .dbline 254
0208 ; }
0208 ;
0208 ; void adc_init(void)
0208 ; {
0208 .dbline 255
0208 ; ADCSR = 0x00; //disable adc
0208 2224 clr R2
020A 26B8 out 0x6,R2
020C .dbline 256
020C ; ADMUX = 0x40; //select adc input 0, select AVCC=VREF
020C 80E4 ldi R24,64
020E 87B9 out 0x7,R24
0210 .dbline 257
0210 ; ACSR = 0x80;
0210 80E8 ldi R24,128
0212 88B9 out 0x8,R24
0214 .dbline 258
0214 ; ADCSR = 0xED; //ADEN=1,ADSC=1(start),ADFR=1(freerun),ADIE(interrupt enable)=1 32div
0214 8DEE ldi R24,237
0216 86B9 out 0x6,R24
0218 .dbline -2
0218 L43:
0218 .dbline 0 ; func end
0218 0895 ret
021A .dbend
.area vector(rom, abs)
.org 28
001C 0DC1 rjmp _adc_isr
.area text(rom, con, rel)
021A .dbfile D:\prog251\251.c
021A .dbfunc e adc_isr _adc_isr fV
.even
021A _adc_isr::
021A 00D0 rcall push_lset
021C .dbline -1
021C .dbline 263
021C ; }
021C ;
021C ; #pragma interrupt_handler adc_isr:15
021C ; void adc_isr(void)
021C ; {
021C .dbline 265
021C ; //1. conversion complete, read value (int) using...
021C ; Voltage[ADCCurrentChannel]=ADCL; //Read 8 low bits first (important)
021C 20902000 lds R2,_ADCCurrentChannel
0220 82E0 ldi R24,2
0222 829D mul R24,R2
0224 F001 movw R30,R0
0226 80E0 ldi R24,<_Voltage
0228 90E0 ldi R25,>_Voltage
022A E80F add R30,R24
022C F91F adc R31,R25
022E 24B0 in R2,0x4
0230 3324 clr R3
0232 3182 std z+1,R3
0234 2082 std z+0,R2
0236 .dbline 266
0236 ; Voltage[ADCCurrentChannel]|=(int)ADCH << 8; //read 2 high bits and shift into top byte //
0236 20902000 lds R2,_ADCCurrentChannel
023A 82E0 ldi R24,2
023C 829D mul R24,R2
023E 1001 movw R2,R0
0240 80E0 ldi R24,<_Voltage
0242 90E0 ldi R25,>_Voltage
0244 280E add R2,R24
0246 391E adc R3,R25
0248 45B0 in R4,0x5
024A 5524 clr R5
024C 542C mov R5,R4
024E 4424 clr R4
0250 F101 movw R30,R2
0252 6080 ldd R6,z+0
0254 7180 ldd R7,z+1
0256 6428 or R6,R4
0258 7528 or R7,R5
025A 7182 std z+1,R7
025C 6082 std z+0,R6
025E .dbline 267
025E ; VoltageRefreshed[ADCCurrentChannel] = 1;
025E 80E0 ldi R24,<_VoltageRefreshed
0260 90E0 ldi R25,>_VoltageRefreshed
0262 E0912000 lds R30,_ADCCurrentChannel
0266 FF27 clr R31
0268 E80F add R30,R24
026A F91F adc R31,R25
026C 81E0 ldi R24,1
026E 8083 std z+0,R24
0270 .dbline 270
0270 ;
0270 ; //2. NextChannel
0270 ; ++ADCCurrentChannel;
0270 80912000 lds R24,_ADCCurrentChannel
0274 8F5F subi R24,255 ; addi 1
0276 80932000 sts _ADCCurrentChannel,R24
027A .dbline 271
027A ; if(ADCCurrentChannel>5)
027A 85E0 ldi R24,5
027C 20902000 lds R2,_ADCCurrentChannel
0280 8215 cp R24,R2
0282 18F4 brsh L45
0284 .dbline 272
0284 ; ADCCurrentChannel = 0;
0284 2224 clr R2
0286 20922000 sts _ADCCurrentChannel,R2
028A L45:
028A .dbline 275
028A ;
028A ; //3.Set MUX
028A ; adc_setmux(ADCCurrentChannel+1);
028A 00912000 lds R16,_ADCCurrentChannel
028E 0F5F subi R16,255 ; addi 1
0290 B0DF rcall _adc_setmux
0292 .dbline 277
0292 ; //4.CLEAR INTERUPT FLAG ADIF
0292 ; ADCSR |= BIT(ADIF);
0292 349A sbi 0x6,4
0294 .dbline -2
0294 L44:
0294 00D0 rcall pop_lset
0296 .dbline 0 ; func end
0296 1895 reti
0298 .dbend
.area vector(rom, abs)
.org 2
0002 4CC1 rjmp _int0_isr
.area text(rom, con, rel)
0298 .dbfile D:\prog251\251.c
0298 .dbfunc e int0_isr _int0_isr fV
.even
0298 _int0_isr::
0298 2A92 st -y,R2
029A 3A92 st -y,R3
029C 4A92 st -y,R4
029E 5A92 st -y,R5
02A0 0A93 st -y,R16
02A2 1A93 st -y,R17
02A4 2A93 st -y,R18
02A6 3A93 st -y,R19
02A8 8A93 st -y,R24
02AA 9A93 st -y,R25
02AC AA93 st -y,R26
02AE BA93 st -y,R27
02B0 EA93 st -y,R30
02B2 2FB6 in R2,0x3f
02B4 2A92 st -y,R2
02B6 00D0 rcall push_gset2
02B8 .dbline -1
02B8 .dbline 282
02B8 ; }
02B8 ;
02B8 ; #pragma interrupt_handler int0_isr:2
02B8 ; void int0_isr(void)//speed
02B8 ; {
02B8 .dbline 285
02B8 ; //external interupt on INT0
02B8 ; //1.Read Interval
02B8 ; CLI();
02B8 F894 cli
02BA .dbline 286
02BA ; if(SpeedUltraLow)
02BA 20901100 lds R2,_SpeedUltraLow
02BE 2220 tst R2
02C0 21F0 breq L48
02C2 .dbline 287
02C2 ; SpeedUltraLow = 0;
02C2 2224 clr R2
02C4 20921100 sts _SpeedUltraLow,R2
02C8 12C0 rjmp L49
02CA L48:
02CA .dbline 288
02CA ; else if (!(TIFR&BIT(TOV1)))
02CA 28B6 in R2,0x38
02CC 22FC sbrc R2,2
02CE 0FC0 rjmp L50
02D0 .dbline 289
02D0 ; {
02D0 .dbline 290
02D0 ; TimeInterval = TCNT1;
02D0 2CB4 in R2,0x2c
02D2 3DB4 in R3,0x2d
02D4 4424 clr R4
02D6 5524 clr R5
02D8 30921300 sts _TimeInterval+1,R3
02DC 20921200 sts _TimeInterval,R2
02E0 50921500 sts _TimeInterval+2+1,R5
02E4 40921400 sts _TimeInterval+2,R4
02E8 .dbline 291
02E8 ; TimeIntervalRefreshed = 1;
02E8 81E0 ldi R24,1
02EA 80931000 sts _TimeIntervalRefreshed,R24
02EE .dbline 292
02EE ; }
02EE L50:
02EE L49:
02EE .dbline 295
02EE ;
02EE ; //Mileage Counting
02EE ; MileagePulseCnt++;
02EE 80915F00 lds R24,_MileagePulseCnt
02F2 90916000 lds R25,_MileagePulseCnt+1
02F6 0196 adiw R24,1
02F8 90936000 sts _MileagePulseCnt+1,R25
02FC 80935F00 sts _MileagePulseCnt,R24
0300 .dbline 296
0300 ; if (MileagePulseCnt>=998)
0300 863E cpi R24,230
0302 E3E0 ldi R30,3
0304 9E07 cpc R25,R30
0306 C0F1 brlo L52
0308 .dbline 297
0308 ; {
0308 .dbline 298
0308 ; mileage++;
0308 41E0 ldi R20,1
030A 50E0 ldi R21,0
030C 60E0 ldi R22,0
030E 70E0 ldi R23,0
0310 40905900 lds R4,_mileage+2
0314 50905A00 lds R5,_mileage+2+1
0318 20905700 lds R2,_mileage
031C 30905800 lds R3,_mileage+1
0320 240E add R2,R20
0322 351E adc R3,R21
0324 461E adc R4,R22
0326 571E adc R5,R23
0328 30925800 sts _mileage+1,R3
032C 20925700 sts _mileage,R2
0330 50925A00 sts _mileage+2+1,R5
0334 40925900 sts _mileage+2,R4
0338 .dbline 299
0338 ; MileageCurrent++;
0338 41E0 ldi R20,1
033A 50E0 ldi R21,0
033C 60E0 ldi R22,0
033E 70E0 ldi R23,0
0340 40905D00 lds R4,_MileageCurrent+2
0344 50905E00 lds R5,_MileageCurrent+2+1
0348 20905B00 lds R2,_MileageCurrent
034C 30905C00 lds R3,_MileageCurrent+1
0350 240E add R2,R20
0352 351E adc R3,R21
0354 461E adc R4,R22
0356 571E adc R5,R23
0358 30925C00 sts _MileageCurrent+1,R3
035C 20925B00 sts _MileageCurrent,R2
0360 50925E00 sts _MileageCurrent+2+1,R5
0364 40925D00 sts _MileageCurrent+2,R4
0368 .dbline 300
0368 ; MileageSaved = 0;
0368 2224 clr R2
036A 20926100 sts _MileageSaved,R2
036E .dbline 301
036E ; MileagePulseCnt = 0;
036E 3324 clr R3
0370 30926000 sts _MileagePulseCnt+1,R3
0374 20925F00 sts _MileagePulseCnt,R2
0378 .dbline 302
0378 ; }
0378 L52:
0378 .dbline 305
0378 ;
0378 ; //clear Timer
0378 ; TCNT1H = 0;
0378 2224 clr R2
037A 2DBC out 0x2d,R2
037C .dbline 306
037C ; TCNT1L = 0;
037C 2CBC out 0x2c,R2
037E .dbline -2
037E L47:
037E 00D0 rcall pop_gset2
0380 2990 ld R2,y+
0382 2FBE out 0x3f,R2
0384 E991 ld R30,y+
0386 B991 ld R27,y+
0388 A991 ld R26
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -