📄 m8pwm.lis
字号:
005E 83BD out 0x23,R24
0060 .dbline 124
0060 ; TCCR2 = 0x69; //8M/8=1MHz,0x79
0060 89E6 ldi R24,105
0062 85BD out 0x25,R24
0064 .dbline -2
0064 L4:
0064 .dbline 0 ; func end
0064 0895 ret
0066 .dbend
0066 .dbfunc e adc_init _adc_init fV
.even
0066 _adc_init::
0066 .dbline -1
0066 .dbline 130
0066 ; }
0066 ; /***************************************************************************
0066 ; A/D初始化
0066 ; ****************************************************************************/
0066 ; void adc_init(void)
0066 ; {
0066 .dbline 131
0066 ; ADCSRA =0x0; //关闭AD
0066 2224 clr R2
0068 26B8 out 0x6,R2
006A .dbline 132
006A ; ADMUX = (1<<REFS0)|(1<<ADLAR)|(1<<MUX1)|(1<<MUX0); //选择外部参考电源 ADC3 左对齐
006A 83E6 ldi R24,99
006C 87B9 out 0x7,R24
006E .dbline 133
006E ; ACSR = (1<<ACD); //关闭模拟比较器
006E 80E8 ldi R24,128
0070 88B9 out 0x8,R24
0072 .dbline 134
0072 ; ADCSRA = (1<<ADEN)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);//中断允许 32分频
0072 8DE9 ldi R24,157
0074 86B9 out 0x6,R24
0076 .dbline -2
0076 L5:
0076 .dbline 0 ; func end
0076 0895 ret
0078 .dbend
0078 .dbfunc e Adc_isr _Adc_isr fV
.even
0078 _Adc_isr::
0078 2A92 st -y,R2
007A 2FB6 in R2,0x3f
007C 2A92 st -y,R2
007E .dbline -1
007E .dbline 140
007E ; }
007E ; /***************************************************************************
007E ; A/D中断处理
007E ; ****************************************************************************/
007E ; void Adc_isr(void)
007E ; {
007E .dbline 141
007E ; AdResult=ADCH; //读取高位数据(左对齐)
007E 25B0 in R2,0x5
0080 20920000 sts _AdResult,R2
0084 .dbline -2
0084 L6:
0084 2990 ld R2,y+
0086 2FBE out 0x3f,R2
0088 2990 ld R2,y+
008A .dbline 0 ; func end
008A 1895 reti
008C .dbend
008C .dbfunc e Timer1_vof _Timer1_vof fV
.even
008C _Timer1_vof::
008C 0A92 st -y,R0
008E 1A92 st -y,R1
0090 2A92 st -y,R2
0092 3A92 st -y,R3
0094 4A92 st -y,R4
0096 5A92 st -y,R5
0098 0A93 st -y,R16
009A 1A93 st -y,R17
009C 2A93 st -y,R18
009E 3A93 st -y,R19
00A0 8A93 st -y,R24
00A2 9A93 st -y,R25
00A4 EA93 st -y,R30
00A6 FA93 st -y,R31
00A8 0FB6 in R0,0x3f
00AA 0A92 st -y,R0
00AC 00D0 rcall push_gset1
00AE 2497 sbiw R28,4
00B0 .dbline -1
00B0 .dbline 150
00B0 ; //OCR2 = 0xff - AdResult; //更新PWM参数
00B0 ;
00B0 ; }
00B0 ; /***************************************************************************
00B0 ; 定时器1中断处理程序
00B0 ; ****************************************************************************/
00B0 ; void Timer1_vof(void)
00B0 ; //1s中断程序,用于检测转速
00B0 ; {
00B0 .dbline 151
00B0 ; TCNT1=0xD23A;
00B0 8AE3 ldi R24,53818
00B2 92ED ldi R25,210
00B4 9DBD out 0x2d,R25
00B6 8CBD out 0x2c,R24
00B8 .dbline 152
00B8 ; SpeedVal=RolCount*1.13; //3.1415*3.6*后轮半径(0.1m)=1.13
00B8 00E0 ldi R16,<L10
00BA 10E0 ldi R17,>L10
00BC 00D0 rcall lpm32
00BE 3A93 st -y,R19
00C0 2A93 st -y,R18
00C2 1A93 st -y,R17
00C4 0A93 st -y,R16
00C6 00910200 lds R16,_RolCount
00CA 1127 clr R17
00CC 00D0 rcall int2fp
00CE 3A93 st -y,R19
00D0 2A93 st -y,R18
00D2 1A93 st -y,R17
00D4 0A93 st -y,R16
00D6 00D0 rcall empy32f
00D8 FE01 movw R30,R28
00DA 0083 std z+0,R16
00DC 1183 std z+1,R17
00DE 2283 std z+2,R18
00E0 3383 std z+3,R19
00E2 FE01 movw R30,R28
00E4 2080 ldd R2,z+0
00E6 3180 ldd R3,z+1
00E8 4280 ldd R4,z+2
00EA 5380 ldd R5,z+3
00EC 5A92 st -y,R5
00EE 4A92 st -y,R4
00F0 3A92 st -y,R3
00F2 2A92 st -y,R2
00F4 00E0 ldi R16,<L11
00F6 10E0 ldi R17,>L11
00F8 00D0 rcall lpm32
00FA 3A93 st -y,R19
00FC 2A93 st -y,R18
00FE 1A93 st -y,R17
0100 0A93 st -y,R16
0102 00D0 rcall cmp32f
0104 B4F0 brlt L8
0106 FE01 movw R30,R28
0108 2080 ldd R2,z+0
010A 3180 ldd R3,z+1
010C 4280 ldd R4,z+2
010E 5380 ldd R5,z+3
0110 5A92 st -y,R5
0112 4A92 st -y,R4
0114 3A92 st -y,R3
0116 2A92 st -y,R2
0118 00E0 ldi R16,<L11
011A 10E0 ldi R17,>L11
011C 00D0 rcall lpm32
011E 3A93 st -y,R19
0120 2A93 st -y,R18
0122 1A93 st -y,R17
0124 0A93 st -y,R16
0126 00D0 rcall sub32f
0128 00D0 rcall fp2int
012A A801 movw R20,R16
012C 4050 subi R20,0 ; offset = 32768
012E 5048 sbci R21,128
0130 07C0 rjmp L9
0132 L8:
0132 FE01 movw R30,R28
0134 0081 ldd R16,z+0
0136 1181 ldd R17,z+1
0138 2281 ldd R18,z+2
013A 3381 ldd R19,z+3
013C 00D0 rcall fp2int
013E A801 movw R20,R16
0140 L9:
0140 40930100 sts _SpeedVal,R20
0144 .dbline 153
0144 ; RolCount=0;
0144 2224 clr R2
0146 20920200 sts _RolCount,R2
014A .dbline -2
014A L7:
014A 2496 adiw R28,4
014C 00D0 rcall pop_gset1
014E 0990 ld R0,y+
0150 0FBE out 0x3f,R0
0152 F991 ld R31,y+
0154 E991 ld R30,y+
0156 9991 ld R25,y+
0158 8991 ld R24,y+
015A 3991 ld R19,y+
015C 2991 ld R18,y+
015E 1991 ld R17,y+
0160 0991 ld R16,y+
0162 5990 ld R5,y+
0164 4990 ld R4,y+
0166 3990 ld R3,y+
0168 2990 ld R2,y+
016A 1990 ld R1,y+
016C 0990 ld R0,y+
016E .dbline 0 ; func end
016E 1895 reti
0170 .dbend
0170 .dbfunc e int0_isr _int0_isr fV
.even
0170 _int0_isr::
0170 2A92 st -y,R2
0172 3A92 st -y,R3
0174 8A93 st -y,R24
0176 9A93 st -y,R25
0178 2FB6 in R2,0x3f
017A 2A92 st -y,R2
017C .dbline -1
017C .dbline 160
017C .dbline 162
017C 80910200 lds R24,_RolCount
0180 8F5F subi R24,255 ; addi 1
0182 80930200 sts _RolCount,R24
0186 .dbline 163
0186 8FE6 ldi R24,3183
0188 9CE0 ldi R25,12
018A 20900300 lds R2,_RolNum
018E 30900400 lds R3,_RolNum+1
0192 8215 cp R24,R2
0194 9305 cpc R25,R3
0196 78F4 brsh L13
0198 .dbline 164
0198 .dbline 165
0198 2224 clr R2
019A 3324 clr R3
019C 30920400 sts _RolNum+1,R3
01A0 20920300 sts _RolNum,R2
01A4 .dbline 166
01A4 80910500 lds R24,_KiloMeter
01A8 90910600 lds R25,_KiloMeter+1
01AC 0196 adiw R24,1
01AE 90930600 sts _KiloMeter+1,R25
01B2 80930500 sts _KiloMeter,R24
01B6 .dbline 167
01B6 L13:
01B6 .dbline -2
01B6 L12:
01B6 2990 ld R2,y+
01B8 2FBE out 0x3f,R2
01BA 9991 ld R25,y+
01BC 8991 ld R24,y+
01BE 3990 ld R3,y+
01C0 2990 ld R2,y+
01C2 .dbline 0 ; func end
01C2 1895 reti
01C4 .dbend
01C4 .dbfunc e int1_isr _int1_isr fV
.even
01C4 _int1_isr::
01C4 2A92 st -y,R2
01C6 8A93 st -y,R24
01C8 2FB6 in R2,0x3f
01CA 2A92 st -y,R2
01CC .dbline -1
01CC .dbline 173
01CC ;
01CC ; }
01CC ; /***************************************************************************
01CC ; 外部中断0处理程序
01CC ; ****************************************************************************/
01CC ; void int0_isr(void)
01CC ; {
01CC ; //external interupt on INT0
01CC ; RolCount++;//半圈数增加
01CC ; if(RolNum> 3183)//半圈=3.1416*0.1米=0.31416米,1000/0,31416=3183
01CC ; {
01CC ; RolNum=0;
01CC ; ++KiloMeter;//个位,十位不为0,只需要改变个位十位
01CC ; }
01CC ; }
01CC ; /***************************************************************************
01CC ; 外部中断1处理程序
01CC ; ****************************************************************************/
01CC ; void int1_isr(void)
01CC ; {
01CC .dbline 175
01CC ; //external interupt on INT1
01CC ; if(MCUCR&(0x01<<ISC10))
01CC 25B6 in R2,0x35
01CE 22FE sbrs R2,2
01D0 0CC0 rjmp L16
01D2 .dbline 176
01D2 ; {//上升沿触发中断,为释放状态
01D2 .dbline 177
01D2 ; TCCR2=0x69; //8M/8=1MHz
01D2 89E6 ldi R24,105
01D4 85BD out 0x25,R24
01D6 .dbline 178
01D6 ; MCUCR&=~(0x01<<ISC10);//clear ISC10 ,设为下降沿触发
01D6 85B7 in R24,0x35
01D8 8B7F andi R24,251
01DA 85BF out 0x35,R24
01DC .dbline 179
01DC ; BRAKE_LED_OFF;
01DC 85B3 in R24,0x15
01DE 8C7F andi R24,252
01E0 85BB out 0x15,R24
01E2 .dbline 180
01E2 ; BrakeFlag=0;
01E2 2224 clr R2
01E4 20920C00 sts _BrakeFlag,R2
01E8 .dbline 181
01E8 ; }
01E8 0BC0 rjmp L17
01EA L16:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -