📄 m8pwm.lst
字号:
0126 938A ST R24,-Y
0127 B62F IN R2,0x3F
0128 922A ST R2,-Y
(0168) }
(0169) /***************************************************************************
(0170) 外部中断1处理程序
(0171) ****************************************************************************/
(0172) void int1_isr(void)
(0173) {
(0174) //external interupt on INT1
(0175) if(MCUCR&(0x01<<ISC10))
0129 B625 IN R2,0x35
012A FE22 SBRS R2,2
012B C00C RJMP 0x0138
(0176) {//上升沿触发中断,为释放状态
(0177) TCCR2=0x69; //8M/8=1MHz
012C E689 LDI R24,0x69
012D BD85 OUT 0x25,R24
(0178) MCUCR&=~(0x01<<ISC10);//clear ISC10 ,设为下降沿触发
012E B785 IN R24,0x35
012F 7F8B ANDI R24,0xFB
0130 BF85 OUT 0x35,R24
(0179) BRAKE_LED_OFF;
0131 B385 IN R24,0x15
0132 7F8C ANDI R24,0xFC
0133 BB85 OUT 0x15,R24
(0180) BrakeFlag=0;
0134 2422 CLR R2
0135 9220006C STS BrakeFlag,R2
(0181) }
0137 C00B RJMP 0x0143
(0182) else
(0183) {//下降沿触发中断,为刹车状态
(0184) TCCR2=0;//
0138 2422 CLR R2
0139 BC25 OUT 0x25,R2
(0185) MCUCR|=(0x01<<ISC10);//set ISC10,设为上升沿触发
013A B785 IN R24,0x35
013B 6084 ORI R24,4
013C BF85 OUT 0x35,R24
(0186) BRAKE_LED_ON;
013D B385 IN R24,0x15
013E 6083 ORI R24,3
013F BB85 OUT 0x15,R24
(0187) BrakeFlag=0x55;
0140 E585 LDI R24,0x55
0141 9380006C STS BrakeFlag,R24
(0188) }
0143 9029 LD R2,Y+
0144 BE2F OUT 0x3F,R2
0145 9189 LD R24,Y+
0146 9029 LD R2,Y+
0147 9518 RETI
_uart0_rx_isr:
0148 D1EB RCALL push_lset
(0189) }
(0190) /***************************************************************************
(0191) 串口接收中断程序
(0192) ****************************************************************************/
(0193) void uart0_rx_isr(void)
(0194) {
(0195) //uart has received a character in UDR
(0196)
(0197) UartBuf[UartBufCount++]= UDR;
0149 9020006A LDS R2,UartBufCount
014B 2433 CLR R3
014C 2D82 MOV R24,R2
014D 5F8F SUBI R24,0xFF
014E 9380006A STS UartBufCount,R24
0150 E68D LDI R24,0x6D
0151 E090 LDI R25,0
0152 2DE2 MOV R30,R2
0153 27FF CLR R31
0154 0FE8 ADD R30,R24
0155 1FF9 ADC R31,R25
0156 B02C IN R2,0x0C
0157 8220 STD Z+0,R2
(0198) //PORTC ^=0x20;
(0199) if(UartBuf[0]==0xaa)//包头
0158 9180006D LDS R24,UartBuf
015A 3A8A CPI R24,0xAA
015B F579 BNE 0x018B
(0200) {
(0201) //UartBuf[3]=Rev,Rev,Rev,RevMode,Rev,Rev,LEFT_LED,RIGHT_LED
(0202)
(0203) if(UartBufCount>4)
015C E084 LDI R24,4
015D 9020006A LDS R2,UartBufCount
015F 1582 CP R24,R2
0160 F568 BCC 0x018E
(0204) {
(0205) if( ((UartBuf[1]+UartBuf[2])==0xff)&&
0161 9020006F LDS R2,UartBuf+2
0163 9180006E LDS R24,UartBuf+1
0165 0D82 ADD R24,R2
0166 3F8F CPI R24,0xFF
0167 F4F9 BNE 0x0187
0168 90200071 LDS R2,0x71
016A 91800070 LDS R24,UartBuf+3
016C 0D82 ADD R24,R2
016D 3F8F CPI R24,0xFF
016E F4C1 BNE 0x0187
(0206) ((UartBuf[3]+UartBuf[4])==0xff) )
(0207) {
(0208) LrLedReg=UartBuf[3]&0x03;//
016F 91800070 LDS R24,UartBuf+3
0171 7083 ANDI R24,3
0172 9380006B STS LrLedReg,R24
(0209) if(BrakeFlag!=0x55)
0174 9180006C LDS R24,BrakeFlag
0176 3585 CPI R24,0x55
0177 F041 BEQ 0x0180
(0210) {
(0211) PORTC&=0xfc;//
0178 B385 IN R24,0x15
0179 7F8C ANDI R24,0xFC
017A BB85 OUT 0x15,R24
(0212) PORTC|=LrLedReg;
017B 9020006B LDS R2,LrLedReg
017D B235 IN R3,0x15
017E 2832 OR R3,R2
017F BA35 OUT 0x15,R3
(0213) }
(0214) tx_pack(UartBuf[3]);
0180 91000070 LDS R16,UartBuf+3
0182 D011 RCALL _tx_pack
(0215) PORTC ^=0x20;
0183 E280 LDI R24,0x20
0184 B225 IN R2,0x15
0185 2628 EOR R2,R24
0186 BA25 OUT 0x15,R2
(0216) }
(0217) UartBufCount=0;
0187 2422 CLR R2
0188 9220006A STS UartBufCount,R2
(0218) }
(0219) }
018A C003 RJMP 0x018E
(0220) else UartBufCount=0;
018B 2422 CLR R2
018C 9220006A STS UartBufCount,R2
018E D1BC RCALL pop_lset
018F 9518 RETI
(0221)
(0222) }
(0223) /***************************************************************************
(0224) 串口接收程序
(0225) ****************************************************************************/
(0226) void uart0_tx(unsigned char tdata)
(0227) {
(0228) while(!(UCSRA & (1<<UDRE) ));
_uart0_tx:
tdata --> R16
0190 9B5D SBIS 0x0B,5
0191 CFFE RJMP _uart0_tx
(0229) UDR = tdata;
0192 B90C OUT 0x0C,R16
0193 9508 RET
_tx_pack:
tmptt --> R20
mode --> R20
0194 D16B RCALL push_gset1
0195 2F40 MOV R20,R16
(0230) }
(0231) void tx_pack(uchar mode)
(0232) { //revmode=mode&0x10
(0233) uchar tmptt;
(0234) uart0_tx(0xaa);
0196 EA0A LDI R16,0xAA
0197 DFF8 RCALL _uart0_tx
(0235) if(mode&0x10)
0198 FF44 SBRS R20,4
0199 C01B RJMP 0x01B5
(0236) {//revmode=1,返回里程;
(0237) tmptt=KiloMeter&0x00ff;
019A 91400065 LDS R20,KiloMeter
019C 7050 ANDI R21,0
(0238) uart0_tx(tmptt);
019D 2F04 MOV R16,R20
019E DFF1 RCALL _uart0_tx
(0239) uart0_tx(0xff-tmptt);
019F 2E24 MOV R2,R20
01A0 2433 CLR R3
01A1 EF0F LDI R16,0xFF
01A2 1902 SUB R16,R2
01A3 0913 SBC R17,R3
01A4 DFEB RCALL _uart0_tx
(0240) tmptt=(KiloMeter>>8)&0x00ff;
01A5 91400065 LDS R20,KiloMeter
01A7 91500066 LDS R21,KiloMeter+1
01A9 2F45 MOV R20,R21
01AA 2755 CLR R21
01AB 7050 ANDI R21,0
(0241) uart0_tx(tmptt);//+24V
01AC 2F04 MOV R16,R20
01AD DFE2 RCALL _uart0_tx
(0242) uart0_tx(0xff-tmptt);
01AE 2E24 MOV R2,R20
01AF 2433 CLR R3
01B0 EF0F LDI R16,0xFF
01B1 1902 SUB R16,R2
01B2 0913 SBC R17,R3
01B3 DFDC RCALL _uart0_tx
(0243) }
01B4 C014 RJMP 0x01C9
(0244) else
(0245) {//revmode=0,返回电压和速度
(0246) uart0_tx(SpeedVal);
01B5 91000061 LDS R16,SpeedVal
01B7 DFD8 RCALL _uart0_tx
(0247) uart0_tx(0xff-SpeedVal);
01B8 90200061 LDS R2,SpeedVal
01BA 2433 CLR R3
01BB EF0F LDI R16,0xFF
01BC 1902 SUB R16,R2
01BD 0913 SBC R17,R3
01BE DFD1 RCALL _uart0_tx
(0248) uart0_tx(AdResult);//+24V
01BF 91000060 LDS R16,AdResult
01C1 DFCE RCALL _uart0_tx
(0249) uart0_tx(0xff-AdResult);
01C2 90200060 LDS R2,AdResult
01C4 2433 CLR R3
01C5 EF0F LDI R16,0xFF
01C6 1902 SUB R16,R2
01C7 0913 SBC R17,R3
01C8 DFC7 RCALL _uart0_tx
(0250)
(0251) }
01C9 D139 RCALL pop_gset1
01CA 9508 RET
(0252) }
(0253) void SpeedControl(void)
(0254) {
(0255) uint tmp1,tmp2;
(0256) tmp1=OCR2+SpeedVal+5;
_SpeedControl:
tmp2 --> Y+1
tmp1 --> R16
01CB 90200061 LDS R2,SpeedVal
01CD 2433 CLR R3
01CE B503 IN R16,0x23
01CF 2711 CLR R17
01D0 0D02 ADD R16,R2
01D1 1D13 ADC R17,R3
01D2 5F0B SUBI R16,0xFB
01D3 4F1F SBCI R17,0xFF
(0257) if(tmp1>0xff)tmp1=0xff;
01D4 EF8F LDI R24,0xFF
01D5 E090 LDI R25,0
01D6 1780 CP R24,R16
01D7 0791 CPC R25,R17
01D8 F410 BCC 0x01DB
01D9 EF0F LDI R16,0xFF
01DA E010 LDI R17,0
(0258) if( UartBuf[1]>tmp1 )
01DB 9020006E LDS R2,UartBuf+1
01DD 2433 CLR R3
01DE 1502 CP R16,R2
01DF 0513 CPC R17,R3
01E0 F420 BCC 0x01E5
(0259) {
(0260) OCR2 = (tmp1&0x00ff);//速度控制信息
01E1 01C8 MOVW R24,R16
01E2 7090 ANDI R25,0
01E3 BD83 OUT 0x23,R24
(0261) }
01E4 C003 RJMP 0x01E8
(0262) else OCR2 = UartBuf[1];
01E5 9020006E LDS R2,UartBuf+1
01E7 BC23 OUT 0x23,R2
01E8 9508 RET
_EepromRead:
eeprom_flag --> R10
eeprom_data --> R20
eeprom_temp --> Y+0
k --> R20
Address --> R22
01E9 D110 RCALL push_gset4
01EA 2F60 MOV R22,R16
01EB 9723 SBIW R28,3
(0263) //OCR2 = UartBuf[1];
(0264) }
(0265) /*EEPROM读*/
(0266) uchar EepromRead(uchar Address)
(0267) {
(0268) uchar eeprom_temp[3];
(0269) uchar eeprom_data,k,eeprom_flag=0;
01EC 24AA CLR R10
(0270) for(k=0;k<3;k++)
01ED 2744 CLR R20
01EE C013 RJMP 0x0202
(0271) {
(0272) while(EECR & (1<<EEWE));
01EF 99E1 SBIC 0x1C,1
01F0 CFFE RJMP 0x01EF
(0273) EEAR = Address+k*EEP_RANG; //一次读出三个单元的内容然后判断,
01F1 EA8A LDI R24,0xAA
01F2 9F84 MUL R24,R20
01F3 2E26 MOV R2,R22
01F4 2433 CLR R3
01F5 0C20 ADD R2,R0
01F6 1C31 ADC R3,R1
01F7 BA3F OUT 0x1F,R3
01F8 BA2E OUT 0x1E,R2
(0274) EECR |= (1<<EERE);
01F9 9AE0 SBI 0x1C,0
(0275) eeprom_temp[k]=EEDR;
01FA 01CE MOVW R24,R28
01FB 2FE4 MOV R30,R20
01FC 27FF CLR R31
01FD 0FE8 ADD R30,R24
01FE 1FF9 ADC R31,R25
01FF B22D IN R2,0x1D
0200 8220 STD Z+0,R2
0201 9543 INC R20
0202 3043 CPI R20,3
0203 F358 BCS 0x01EF
(0276) }
(0277) /*判断读取的数据是否正确*/
(0278) if( (eeprom_temp[0]==eeprom_temp[1]) & (eeprom_temp[1]==eeprom_temp[2]) )
0204 8029 LDD R2,Y+1
0205 8038 LDD R3,Y+0
0206 1432 CP R3,R2
0207 F421 BNE 0x020C
0208 E081 LDI R24,1
0209 E090 LDI R25,0
020A 016C MOVW R12,R24
020B C002 RJMP 0x020E
020C 24CC CLR R12
020D 24DD CLR R13
020E 802A LDD R2,Y+2
020F 8039 LDD R3,Y+1
0210 1432 CP R3,R2
0211 F419 BNE 0x0215
0212 E041 LDI R20,1
0213 E050 LDI R21,0
0214 C002 RJMP 0x0217
0215 2744 CLR R20
0216 2755 CLR R21
0217 0116 MOVW R2,R12
0218 2224 AND R2,R20
0219 2235 AND R3,R21
021A 2022 TST R2
021B F411 BNE 0x021E
021C 2033 TST R3
021D F011 BEQ 0x0220
(0279) eeprom_data=EEDR;
021E B34D IN R20,0x1D
021F C01B RJMP 0x023B
(0280) /*判断发生错误的单元,少数服从多数原则*/
(0281) else if(eeprom_temp[0]==eeprom_temp[1])
0220 8029 LDD R2,Y+1
0221 8038 LDD R3,Y+0
0222 1432 CP R3,R2
0223 F421 BNE 0x0228
(0282) {
(0283) /*第三单元出错*/
(0284) eeprom_data = eeprom_temp[0];
0224 2D43 MOV R20,R3
(0285) eeprom_flag=0xff;
0225 EF8F LDI R24,0xFF
0226 2EA8 MOV R10,R24
(0286) }
0227 C013 RJMP 0x023B
(0287) else if(eeprom_temp[1]==eeprom_temp[2])
0228 802A LDD R2,Y+2
0229 8039 LDD R3,Y+1
022A 1432 CP R3,R2
022B F421 BNE 0x0230
(0288) {
(0289) /*第一单元出错*/
(0290) eeprom_data = eeprom_temp[1];
022C 2D43 MOV R20,R3
(0291) eeprom_flag=0xff;
022D EF8F LDI R24,0xFF
022E 2EA8 MOV R10,R24
(0292) }
022F C00B RJMP 0x023B
(0293) else if(eeprom_temp[0]==eeprom_temp[2])
0230 802A LDD R2,Y+2
0231 8038 LDD R3,Y+0
0232 1432 CP R3,R2
0233 F421 BNE 0x0238
(0294) {
(0295) /*第二单元出错*/
(0296) eeprom_data = eeprom_temp[0];
0234 2D43 MOV R20,R3
(0297) eeprom_flag=0xff;
0235 EF8F LDI R24,0xFF
0236 2EA8 MOV R10,R24
(0298) }
0237 C003 RJMP 0x023B
(0299) else
(0300) {//三个单元都不相等,则将数据填为0xff
(0301) eeprom_data = 0xff;
0238 EF4F LDI R20,0xFF
(0302) eeprom_flag=0xff;
0239 EF8F LDI R24,0xFF
023A 2EA8 MOV R10,R24
(0303) }
(0304) if(eeprom_flag)EepromWrite(Address,eeprom_data);//发生错误,则将数据重新写入
023B 20AA TST R10
023C F019 BEQ 0x0240
023D 2F24 MOV R18,R20
023E 2F06 MOV R16,R22
023F D004 RCALL _EepromWrite
(0305) return eeprom_data;
0240 2F04 MOV R16,R20
0241 9623 ADIW R28,3
0242 D0B3 RCALL pop_gset4
0243 9508 RET
_EepromWrite:
tmpeeprom --> R20
k --> R22
Data --> R18
Address --> R16
0244 D0B9 RCALL push_gset2
(0306) }
(0307) ///////////////////////////////////////////////////////////////////////////////
(0308) //*EEPROM写,一次写三单元,作为备份*/
(0309) void EepromWrite(uchar Address, uchar Data)
(0310) {
(0311) char tmpeeprom,k;
(0312) tmpeeprom=SREG; // 保存当前设置,以便恢复
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -