⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 m8pwm.lst

📁 电动车控制器
💻 LST
📖 第 1 页 / 共 4 页
字号:
    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 + -