📄 m16pwm-led.lis
字号:
0094 90E0 ldi R25,>_UartBuf
0096 E22D mov R30,R2
0098 FF27 clr R31
009A E80F add R30,R24
009C F91F adc R31,R25
009E 2CB0 in R2,0xc
00A0 2082 std z+0,R2
00A2 .dbline 102
00A2 ; if(UartBuf[0]==0xaa)//包头
00A2 80910000 lds R24,_UartBuf
00A6 8A3A cpi R24,170
00A8 59F5 brne L5
00AA .dbline 103
00AA ; {
00AA .dbline 105
00AA ; //UartBuf[3]=Rev,Rev,Rev,Rev,Rev,Rev,LEFT_LED,RIGHT_LED
00AA ; if(UartBufCount>4)
00AA 84E0 ldi R24,4
00AC 20901700 lds R2,_UartBufCount
00B0 8215 cp R24,R2
00B2 48F5 brsh L6
00B4 .dbline 106
00B4 ; {
00B4 .dbline 107
00B4 ; if( ((UartBuf[1]+UartBuf[2])==0xff)&&
00B4 20900200 lds R2,_UartBuf+2
00B8 80910100 lds R24,_UartBuf+1
00BC 820D add R24,R2
00BE 8F3F cpi R24,255
00C0 D9F4 brne L9
00C2 20900400 lds R2,_UartBuf+4
00C6 80910300 lds R24,_UartBuf+3
00CA 820D add R24,R2
00CC 8F3F cpi R24,255
00CE A1F4 brne L9
00D0 .dbline 109
00D0 ; ((UartBuf[3]+UartBuf[4])==0xff) )
00D0 ; {
00D0 .dbline 110
00D0 ; LedBuf[0]=UartBuf[1];//SpeedVal
00D0 20900100 lds R2,_UartBuf+1
00D4 20921400 sts _LedBuf,R2
00D8 .dbline 111
00D8 ; voldata=UartBuf[3];
00D8 40910300 lds R20,_UartBuf+3
00DC .dbline 112
00DC ; if(voldata<105)voldata=105; //电压范围21~29.5,每个码表示0.2V
00DC 4936 cpi R20,105
00DE 08F4 brsh L17
00E0 .dbline 112
00E0 49E6 ldi R20,105
00E2 L17:
00E2 .dbline 114
00E2 ; // result=100*((tmpvol/5)-21)/(29.5-21)
00E2 ; LedBuf[1]=40*(voldata-105)/17;//+24V
00E2 88E2 ldi R24,40
00E4 849F mul R24,R20
00E6 8001 movw R16,R0
00E8 0856 subi R16,104
00EA 1041 sbci R17,16
00EC 21E1 ldi R18,17
00EE 30E0 ldi R19,0
00F0 0E940000 xcall div16s
00F4 00931500 sts _LedBuf+1,R16
00F8 .dbline 116
00F8 ;
00F8 ; }
00F8 L9:
00F8 .dbline 117
00F8 ; UartBufCount=0;
00F8 2224 clr R2
00FA 20921700 sts _UartBufCount,R2
00FE .dbline 118
00FE ; }
00FE .dbline 119
00FE ; }
00FE 03C0 xjmp L6
0100 L5:
0100 .dbline 120
0100 2224 clr R2
0102 20921700 sts _UartBufCount,R2
0106 L6:
0106 .dbline -2
0106 L4:
0106 0E940000 xcall pop_gset1
010A 0990 ld R0,y+
010C 0FBE out 0x3f,R0
010E F991 ld R31,y+
0110 E991 ld R30,y+
0112 9991 ld R25,y+
0114 8991 ld R24,y+
0116 3991 ld R19,y+
0118 2991 ld R18,y+
011A 1991 ld R17,y+
011C 0991 ld R16,y+
011E 3990 ld R3,y+
0120 2990 ld R2,y+
0122 1990 ld R1,y+
0124 0990 ld R0,y+
0126 .dbline 0 ; func end
0126 1895 reti
0128 .dbsym r voldata 20 c
0128 .dbend
0128 .dbfunc e uart0_tx _uart0_tx fV
0128 ; tdata -> R16
.even
0128 _uart0_tx::
0128 .dbline -1
0128 .dbline 126
0128 ; else UartBufCount=0;
0128 ; }
0128 ; /***************************************************************************
0128 ;
0128 ; ****************************************************************************/
0128 ; void uart0_tx(uchar tdata)
0128 ; {
0128 L21:
0128 .dbline 127
0128 L22:
0128 .dbline 127
0128 ; while(!(UCSRA & (1<<UDRE) ));
0128 5D9B sbis 0xb,5
012A FECF rjmp L21
012C .dbline 128
012C ; UDR = tdata;
012C 0CB9 out 0xc,R16
012E .dbline -2
012E L20:
012E .dbline 0 ; func end
012E 0895 ret
0130 .dbsym r tdata 16 c
0130 .dbend
0130 .dbfunc e tx_pack _tx_pack fV
.even
0130 _tx_pack::
0130 .dbline -1
0130 .dbline 131
0130 ; }
0130 ; void tx_pack(void)
0130 ; {
0130 .dbline 133
0130 ;
0130 ; uart0_tx(0xaa);
0130 0AEA ldi R16,170
0132 FADF xcall _uart0_tx
0134 .dbline 134
0134 ; if(SpeedMode)
0134 20900100 lds R2,_SpeedMode
0138 2220 tst R2
013A 59F0 breq L25
013C .dbline 135
013C ; { //巡航模式
013C .dbline 136
013C ; uart0_tx(SpeedVal);
013C 00910200 lds R16,_SpeedVal
0140 F3DF xcall _uart0_tx
0142 .dbline 137
0142 ; uart0_tx(0xff-SpeedVal);
0142 20900200 lds R2,_SpeedVal
0146 3324 clr R3
0148 0FEF ldi R16,255
014A 0219 sub R16,R2
014C 1309 sbc R17,R3
014E ECDF xcall _uart0_tx
0150 .dbline 138
0150 ; }
0150 0AC0 xjmp L26
0152 L25:
0152 .dbline 140
0152 ; else
0152 ; { //手动模式
0152 .dbline 141
0152 ; uart0_tx(AdResult);
0152 00910000 lds R16,_AdResult
0156 E8DF xcall _uart0_tx
0158 .dbline 142
0158 ; uart0_tx(0xff-AdResult);
0158 20900000 lds R2,_AdResult
015C 3324 clr R3
015E 0FEF ldi R16,255
0160 0219 sub R16,R2
0162 1309 sbc R17,R3
0164 E1DF xcall _uart0_tx
0166 .dbline 143
0166 ; }
0166 L26:
0166 .dbline 144
0166 ; uart0_tx(M8Mode);
0166 00910300 lds R16,_M8Mode
016A DEDF xcall _uart0_tx
016C .dbline 145
016C ; uart0_tx(0xff-M8Mode);
016C 20900300 lds R2,_M8Mode
0170 3324 clr R3
0172 0FEF ldi R16,255
0174 0219 sub R16,R2
0176 1309 sbc R17,R3
0178 D7DF xcall _uart0_tx
017A .dbline -2
017A L24:
017A .dbline 0 ; func end
017A 0895 ret
017C .dbend
.area vector(rom, abs)
.org 4
0004 0C94BE00 jmp _int0_isr
.area text(rom, con, rel)
017C .dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
017C .dbfunc e int0_isr _int0_isr fV
.even
017C _int0_isr::
017C 2A92 st -y,R2
017E 8A93 st -y,R24
0180 2FB6 in R2,0x3f
0182 2A92 st -y,R2
0184 .dbline -1
0184 .dbline 152
0184 ; }
0184 ; /***************************************************************************
0184 ; 用于手动模式和巡航模式的选择
0184 ; ****************************************************************************/
0184 ; #pragma interrupt_handler int0_isr:2
0184 ; void int0_isr(void)
0184 ; {
0184 .dbline 154
0184 ; //external interupt on INT0
0184 ; if(SpeedMode)
0184 20900100 lds R2,_SpeedMode
0188 2220 tst R2
018A 31F0 breq L28
018C .dbline 155
018C ; {
018C .dbline 156
018C ; SpeedMode=0;//手动模式
018C 2224 clr R2
018E 20920100 sts _SpeedMode,R2
0192 .dbline 157
0192 ; LedDp=0;
0192 20921600 sts _LedDp,R2
0196 .dbline 158
0196 ; }
0196 0AC0 xjmp L29
0198 L28:
0198 .dbline 160
0198 .dbline 161
0198 85E5 ldi R24,85
019A 80930100 sts _SpeedMode,R24
019E .dbline 162
019E 81E0 ldi R24,1
01A0 80931600 sts _LedDp,R24
01A4 .dbline 163
01A4 20900000 lds R2,_AdResult
01A8 20920200 sts _SpeedVal,R2
01AC .dbline 164
01AC L29:
01AC .dbline -2
01AC L27:
01AC 2990 ld R2,y+
01AE 2FBE out 0x3f,R2
01B0 8991 ld R24,y+
01B2 2990 ld R2,y+
01B4 .dbline 0 ; func end
01B4 1895 reti
01B6 .dbend
01B6 .dbfunc e adc_init _adc_init fV
.even
01B6 _adc_init::
01B6 .dbline -1
01B6 .dbline 170
01B6 ; else
01B6 ; {
01B6 ; SpeedMode=0x55;//巡航模式
01B6 ; LedDp=0x01;
01B6 ; SpeedVal=AdResult;
01B6 ; }
01B6 ; }
01B6 ; /***************************************************************************
01B6 ; A/D初始化
01B6 ; ****************************************************************************/
01B6 ; void adc_init(void)
01B6 ; {
01B6 .dbline 171
01B6 ; ADCSRA =0x0; //关闭AD
01B6 2224 clr R2
01B8 26B8 out 0x6,R2
01BA .dbline 172
01BA ; ADMUX = (1<<REFS0)|(1<<ADLAR)|(1<<MUX1); //选择外部参考电源 ADC2 左对齐
01BA 82E6 ldi R24,98
01BC 87B9 out 0x7,R24
01BE .dbline 173
01BE ; ACSR = (1<<ACD); //关闭模拟比较器
01BE 80E8 ldi R24,128
01C0 88B9 out 0x8,R24
01C2 .dbline 174
01C2 ; ADCSRA = (1<<ADEN)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);//中断允许 32分频
01C2 8DE9 ldi R24,157
01C4 86B9 out 0x6,R24
01C6 .dbline -2
01C6 L30:
01C6 .dbline 0 ; func end
01C6 0895 ret
01C8 .dbend
.area vector(rom, abs)
.org 56
0038 0C94E400 jmp _Adc_isr
.area text(rom, con, rel)
01C8 .dbfile D:\EBIKE\eb_pro\M16PWM_led\m16pwm-led.c
01C8 .dbfunc e Adc_isr _Adc_isr fV
01C8 ; ad_tmp -> R20,R21
.even
01C8 _Adc_isr::
01C8 0A93 st -y,R16
01CA 1A93 st -y,R17
01CC 2A93 st -y,R18
01CE 3A93 st -y,R19
01D0 8A93 st -y,R24
01D2 9A93 st -y,R25
01D4 EA93 st -y,R30
01D6 0FB7 in R16,0x3f
01D8 0A93 st -y,R16
01DA 0E940000 xcall push_gset1
01DE .dbline -1
01DE .dbline 181
01DE ; }
01DE ; /***************************************************************************
01DE ; A/D中断处理
01DE ; ****************************************************************************/
01DE ; #pragma interrupt_handler Adc_isr:15
01DE ; void Adc_isr(void)
01DE ; {
01DE .dbline 183
01DE ; uint ad_tmp;
01DE ; ad_tmp=ADCH; //读取高位数据(左对齐)
01DE 45B1 in R20,0x5
01E0 5527 clr R21
01E2 .dbline 184
01E2 ; if(ad_tmp>0xd0)ad_tmp=0xd0;
01E2 80ED ldi R24,208
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -