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

📄 m8pwm.s

📁 电动车控制器
💻 S
📖 第 1 页 / 共 2 页
字号:
	.even
_uart0_tx::
	.dbline -1
	.dbline 227
; 	else UartBufCount=0;   
; 	
; }
; /*************************************************************************** 
;                      串口接收程序
; ****************************************************************************/ 
; void uart0_tx(unsigned char tdata)
; {
L34:
	.dbline 228
L35:
	.dbline 228
;    while(!(UCSRA & (1<<UDRE) ));
	sbis 0xb,5
	rjmp L34
	.dbline 229
;    UDR = tdata;
	out 0xc,R16
	.dbline -2
L33:
	.dbline 0 ; func end
	ret
	.dbsym r tdata 16 c
	.dbend
	.dbfunc e tx_pack _tx_pack fV
;          tmptt -> R20
;           mode -> R20
	.even
_tx_pack::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 232
; }
; void tx_pack(uchar mode)
; {   //revmode=mode&0x10
	.dbline 234
;     uchar tmptt;
; 	uart0_tx(0xaa);
	ldi R16,170
	rcall _uart0_tx
	.dbline 235
; 	if(mode&0x10)
	sbrs R20,4
	rjmp L38
	.dbline 236
; 	{//revmode=1,返回里程;
	.dbline 237
; 	    tmptt=KiloMeter&0x00ff;
	lds R20,_KiloMeter
	andi R21,0
	.dbline 238
; 		uart0_tx(tmptt);
	mov R16,R20
	rcall _uart0_tx
	.dbline 239
;         uart0_tx(0xff-tmptt);
	mov R2,R20
	clr R3
	ldi R16,255
	sub R16,R2
	sbc R17,R3
	rcall _uart0_tx
	.dbline 240
; 		tmptt=(KiloMeter>>8)&0x00ff;
	lds R20,_KiloMeter
	lds R21,_KiloMeter+1
	mov R20,R21
	clr R21
	andi R21,0
	.dbline 241
; 	    uart0_tx(tmptt);//+24V
	mov R16,R20
	rcall _uart0_tx
	.dbline 242
; 	    uart0_tx(0xff-tmptt);
	mov R2,R20
	clr R3
	ldi R16,255
	sub R16,R2
	sbc R17,R3
	rcall _uart0_tx
	.dbline 243
; 	}
	rjmp L39
L38:
	.dbline 245
	.dbline 246
	lds R16,_SpeedVal
	rcall _uart0_tx
	.dbline 247
	lds R2,_SpeedVal
	clr R3
	ldi R16,255
	sub R16,R2
	sbc R17,R3
	rcall _uart0_tx
	.dbline 248
	lds R16,_AdResult
	rcall _uart0_tx
	.dbline 249
	lds R2,_AdResult
	clr R3
	ldi R16,255
	sub R16,R2
	sbc R17,R3
	rcall _uart0_tx
	.dbline 251
L39:
	.dbline -2
L37:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r tmptt 20 c
	.dbsym r mode 20 c
	.dbend
	.dbfunc e SpeedControl _SpeedControl fV
;           tmp2 -> <dead>
;           tmp1 -> R16,R17
	.even
_SpeedControl::
	.dbline -1
	.dbline 254
; 	else
; 	{//revmode=0,返回电压和速度
; 	    uart0_tx(SpeedVal);
;         uart0_tx(0xff-SpeedVal);
; 	    uart0_tx(AdResult);//+24V
; 	    uart0_tx(0xff-AdResult);
; 	
; 	}	
; }
; void SpeedControl(void)
; {
	.dbline 256
;     uint tmp1,tmp2;
; 	tmp1=OCR2+SpeedVal+5;
	lds R2,_SpeedVal
	clr R3
	in R16,0x23
	clr R17
	add R16,R2
	adc R17,R3
	subi R16,251  ; offset = 5
	sbci R17,255
	.dbline 257
; 	if(tmp1>0xff)tmp1=0xff;	 
	ldi R24,255
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brsh L41
	.dbline 257
	ldi R16,255
	ldi R17,0
L41:
	.dbline 258
; 	if( UartBuf[1]>tmp1 )
	lds R2,_UartBuf+1
	clr R3
	cp R16,R2
	cpc R17,R3
	brsh L43
	.dbline 259
; 	{
	.dbline 260
; 	    OCR2 = (tmp1&0x00ff);//速度控制信息
	movw R24,R16
	andi R25,0
	out 0x23,R24
	.dbline 261
; 	}	
	rjmp L44
L43:
	.dbline 262
	lds R2,_UartBuf+1
	out 0x23,R2
L44:
	.dbline -2
L40:
	.dbline 0 ; func end
	ret
	.dbsym l tmp2 1 i
	.dbsym r tmp1 16 i
	.dbend
	.dbfunc e EepromRead _EepromRead fc
;    eeprom_flag -> R10
;    eeprom_data -> R20
;    eeprom_temp -> y+0
;              k -> R20
;        Address -> R22
	.even
_EepromRead::
	rcall push_gset4
	mov R22,R16
	sbiw R28,3
	.dbline -1
	.dbline 267
; 	else OCR2 = UartBuf[1];
; 	//OCR2 = UartBuf[1];
; }
; /*EEPROM读*/
; uchar EepromRead(uchar Address)  
; {  	
	.dbline 269
; 	uchar eeprom_temp[3];
; 	uchar eeprom_data,k,eeprom_flag=0;
	clr R10
	.dbline 270
; 	for(k=0;k<3;k++)
	clr R20
	rjmp L51
X0:
	.dbline 271
; 	{
L52:
	.dbline 272
L53:
	.dbline 272
	sbic 0x1c,1
	rjmp L52
	.dbline 273
	ldi R24,170
	mul R24,R20
	mov R2,R22
	clr R3
	add R2,R0
	adc R3,R1
	out 0x1f,R3
	out 0x1e,R2
	.dbline 274
	sbi 0x1c,0
	.dbline 275
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	in R2,0x1d
	std z+0,R2
	.dbline 276
L49:
	.dbline 270
	inc R20
L51:
	.dbline 270
	cpi R20,3
	brlo L53
	.dbline 278
; 	    while(EECR & (1<<EEWE));  
; 		EEAR = Address+k*EEP_RANG;       //一次读出三个单元的内容然后判断,
; 		EECR |= (1<<EERE);  
; 	  	eeprom_temp[k]=EEDR;
; 	}
; 	/*判断读取的数据是否正确*/
; 	if( (eeprom_temp[0]==eeprom_temp[1]) & (eeprom_temp[1]==eeprom_temp[2]) )
	ldd R2,y+1
	ldd R3,y+0
	cp R3,R2
	brne L60
	ldi R24,1
	ldi R25,0
	movw R12,R24
	rjmp L61
L60:
	clr R12
	clr R13
L61:
	ldd R2,y+2
	ldd R3,y+1
	cp R3,R2
	brne L62
	ldi R20,1
	ldi R21,0
	rjmp L63
L62:
	clr R20
	clr R21
L63:
	movw R2,R12
	and R2,R20
	and R3,R21
	tst R2
	brne X1
	tst R3
	breq L55
X1:
	.dbline 279
; 		eeprom_data=EEDR;
	in R20,0x1d
	rjmp L56
L55:
	.dbline 281
; 	/*判断发生错误的单元,少数服从多数原则*/
; 	else if(eeprom_temp[0]==eeprom_temp[1])
	ldd R2,y+1
	ldd R3,y+0
	cp R3,R2
	brne L64
	.dbline 282
; 		 {
	.dbline 284
; 		 /*第三单元出错*/
; 		     eeprom_data = eeprom_temp[0];
	mov R20,R3
	.dbline 285
; 		     eeprom_flag=0xff;
	ldi R24,255
	mov R10,R24
	.dbline 286
; 		 }
	rjmp L65
L64:
	.dbline 287
; 	else if(eeprom_temp[1]==eeprom_temp[2])
	ldd R2,y+2
	ldd R3,y+1
	cp R3,R2
	brne L67
	.dbline 288
; 		 {
	.dbline 290
; 		 /*第一单元出错*/
; 		     eeprom_data = eeprom_temp[1];
	mov R20,R3
	.dbline 291
; 		     eeprom_flag=0xff;
	ldi R24,255
	mov R10,R24
	.dbline 292
; 		 }
	rjmp L68
L67:
	.dbline 293
; 	else if(eeprom_temp[0]==eeprom_temp[2])
	ldd R2,y+2
	ldd R3,y+0
	cp R3,R2
	brne L72
	.dbline 294
; 		 {
	.dbline 296
; 		 /*第二单元出错*/
; 		     eeprom_data = eeprom_temp[0];
	mov R20,R3
	.dbline 297
; 		     eeprom_flag=0xff;
	ldi R24,255
	mov R10,R24
	.dbline 298
; 		 }
	rjmp L73
L72:
	.dbline 300
; 	else
; 	     {//三个单元都不相等,则将数据填为0xff
	.dbline 301
; 		    eeprom_data = 0xff;
	ldi R20,255
	.dbline 302
; 			eeprom_flag=0xff;
	ldi R24,255
	mov R10,R24
	.dbline 303
; 		 }
L73:
L68:
L65:
L56:
	.dbline 304
; 	if(eeprom_flag)EepromWrite(Address,eeprom_data);//发生错误,则将数据重新写入	
	tst R10
	breq L75
	.dbline 304
	mov R18,R20
	mov R16,R22
	rcall _EepromWrite
L75:
	.dbline 305
; return eeprom_data; 	 
	mov R16,R20
	.dbline -2
L47:
	adiw R28,3
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r eeprom_flag 10 c
	.dbsym r eeprom_data 20 c
	.dbsym l eeprom_temp 0 A[3:3]c
	.dbsym r k 20 c
	.dbsym r Address 22 c
	.dbend
	.dbfunc e EepromWrite _EepromWrite fV
;      tmpeeprom -> R20
;              k -> R22
;           Data -> R18
;        Address -> R16
	.even
_EepromWrite::
	rcall push_gset2
	.dbline -1
	.dbline 310
; }  
; ///////////////////////////////////////////////////////////////////////////////
; //*EEPROM写,一次写三单元,作为备份*/
; void EepromWrite(uchar Address, uchar Data)  
; {  
	.dbline 312
; 	char tmpeeprom,k;
; 	tmpeeprom=SREG;          		 // 保存当前设置,以便恢复
	in R20,0x3f
	.dbline 313
;    	CLI();                    		 // 关闭中断
	cli
	.dbline 314
; 	if(Address >EEP_RANG)Address=EEP_RANG;
	ldi R24,170
	cp R24,R16
	brsh L78
	.dbline 314
	ldi R16,170
L78:
	.dbline 315
; 	for(k=0;k<3;k++)
	clr R22
	rjmp L83
X2:
	.dbline 316
; 	{
L84:
	.dbline 317
L85:
	.dbline 317
	sbic 0x1c,1
	rjmp L84
	.dbline 318
	ldi R24,170
	mul R24,R22
	mov R2,R16
	clr R3
	add R2,R0
	adc R3,R1
	out 0x1f,R3
	out 0x1e,R2
	.dbline 319
	out 0x1d,R18
	.dbline 320
	sbi 0x1c,2
	.dbline 321
	sbi 0x1c,1
	.dbline 322
	clr R2
	clr R3
	out 0x1f,R3
	out 0x1e,R2
	.dbline 323
L81:
	.dbline 315
	inc R22
L83:
	.dbline 315
	cpi R22,3
	brlo L85
	.dbline 324
; 	   while(EECR & (1<<EEWE));  	 
;    	   EEAR = (Address+k*EEP_RANG);  		// 写地址,相隔rang个单元
;    	   EEDR = Data;  					// 写数据
;    	   EECR |= (1<<EEMWE);  	    	// 置位EEMWE同时清零EEWE
;   	   EECR |= (1<<EEWE);        		 // 在4个时钟周期内置位EEWE  	                  		
;    	   EEAR = 0;    	 
;     }
; 	SREG =tmpeeprom; 	 // 恢复当前设置
	out 0x3f,R20
	.dbline 325
;     SEI();				            // 打开中断
	sei
	.dbline -2
L77:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r tmpeeprom 20 c
	.dbsym r k 22 c
	.dbsym r Data 18 c
	.dbsym r Address 16 c
	.dbend
	.dbfunc e Hardware_init _Hardware_init fV
	.even
_Hardware_init::
	.dbline -1
	.dbline 331
	.dbline 332
	cli
	.dbline 333
	rcall _Port_init
	.dbline 334
	rcall _uart0_init
	.dbline 335
	rcall _Timer1_init
	.dbline 336
	rcall _Timer2_init
	.dbline 337
	rcall _adc_init
	.dbline 338
	ldi R24,10
	out 0x35,R24
	.dbline 339
	ldi R24,192
	out 0x3b,R24
	.dbline 340
	ldi R24,16
	out 0x39,R24
	.dbline 341
	sei
	.dbline 342
	in R24,0x15
	andi R24,252
	out 0x15,R24
	.dbline 343
	ldi R16,1
	rcall _EepromRead
	mov R2,R16
	ldi R16,2
	push R2
	rcall _EepromRead
	pop R2
	mov R18,R16
	clr R19
	ldi R16,256
	ldi R17,1
	rcall empy16s
	clr R3
	add R2,R16
	adc R3,R17
	sts _KiloMeter+1,R3
	sts _KiloMeter,R2
	.dbline 344
	sts _OldKiloMeter+1,R3
	sts _OldKiloMeter,R2
	.dbline 345
	movw R24,R2
	cpi R24,255
	ldi R30,255
	cpc R25,R30
	brne L88
	.dbline 345
	clr R2
	clr R3
	sts _KiloMeter+1,R3
	sts _KiloMeter,R2
L88:
	.dbline -2
L87:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Delay_ms _Delay_ms fV
;              l -> R20,R21
;              j -> R22,R23
;              m -> R16,R17
	.even
_Delay_ms::
	rcall push_gset2
	.dbline -1
	.dbline 353
; } 
; /*************************************************************************** 
;                                                     系统初始化 
; ****************************************************************************/ 
; void Hardware_init(void) 
; { 
;  CLI();   
;  Port_init(); 
;  uart0_init();
;  Timer1_init(); 
;  Timer2_init(); 
;  adc_init(); 
;  MCUCR = (0x01<<ISC01)|(0x01<<ISC11);//INT0、1下降沿触发
;  GICR  = (0x01<<INT0)|(0x01<<INT1); //INT0、1使能
;  TIMSK = (0x01<<OCIE1A);   
;  SEI(); 
;  BRAKE_LED_OFF;
;  KiloMeter=EepromRead(1)+EepromRead(2)*0x100;
;  OldKiloMeter=KiloMeter;
;  if(KiloMeter==0xffff)KiloMeter=0;
; } 
; 
; /*************************************************************************** 
;                                                     延时程序 
; ****************************************************************************/ 
; 
; void Delay_ms(unsigned int m)  //1ms延时 
; { 
	.dbline 355
;  int l,j; 
;  for(l=0;l<m;l++) 
	clr R20
	clr R21
	rjmp L94
L91:
	.dbline 356
;    for(j=0;j<500;j++) 
	clr R22
	clr R23
L95:
	.dbline 357
	.dbline 358
	.dbline 359
L96:
	.dbline 356
	subi R22,255  ; offset = 1
	sbci R23,255
	.dbline 356
	cpi R22,244
	ldi R30,1
	cpc R23,R30
	brlt L95
L92:
	.dbline 355
	subi R20,255  ; offset = 1
	sbci R21,255
L94:
	.dbline 355
	cp R20,R16
	cpc R21,R17
	brlo L91
	.dbline -2
L90:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r l 20 I
	.dbsym r j 22 I
	.dbsym r m 16 i
	.dbend
	.dbfunc e main _main fV
;              k -> R20,R21
;            adc -> R20,R21
;          edata -> R22
	.even
_main::
	.dbline -1
	.dbline 365
;    { 
;        ;
;    } 
; } 
; /************************************************************************** 
;                                                         主函数 
; **************************************************************************/ 
; void main(void) 
; { 
	.dbline 366
;  int k=0,adc=0;
	clr R20
	clr R21
	.dbline 366
	.dbline 368
;  uchar edata;
;  Hardware_init(); 
	rcall _Hardware_init
	rjmp L101
L100:
	.dbline 370
;  while(1) 
;    {         
	.dbline 371
; 		if(KiloMeter!=OldKiloMeter)
	lds R2,_OldKiloMeter
	lds R3,_OldKiloMeter+1
	lds R4,_KiloMeter
	lds R5,_KiloMeter+1
	cp R4,R2
	cpc R5,R3
	breq L103
	.dbline 372
; 		{ 
	.dbline 373
; 		    edata = KiloMeter&0x00ff;
	mov R22,R4
	andi R23,0
	.dbline 374
; 			if(edata) //只改变十位个位
	tst R22
	breq L105
	.dbline 375
; 			{
	.dbline 376
; 			    EepromWrite(1,edata); //30ms
	mov R18,R22
	ldi R16,1
	rcall _EepromWrite
	.dbline 377
; 			}
	rjmp L106
L105:
	.dbline 379
; 			else
; 			{   //60ms
	.dbline 380
; 			    EepromWrite(1,edata);
	mov R18,R22
	ldi R16,1
	rcall _EepromWrite
	.dbline 381
; 				edata = (KiloMeter>>8)&0x00ff;
	lds R22,_KiloMeter
	lds R23,_KiloMeter+1
	mov R22,R23
	clr R23
	andi R23,0
	.dbline 382
; 				EepromWrite(2,edata);
	mov R18,R22
	ldi R16,2
	rcall _EepromWrite
	.dbline 383
; 			}			
L106:
	.dbline 384
; 		}
L103:
	.dbline 385
; 		if(++adc>1)
	subi R20,255  ; offset = 1
	sbci R21,255
	ldi R24,1
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brge L107
	.dbline 386
; 		{
	.dbline 387
; 		    ADCSRA |=(1<<ADSC);  //启动AD转换 
	sbi 0x6,6
	.dbline 388
; 			adc=0;
	clr R20
	clr R21
	.dbline 389
; 		}
L107:
	.dbline 390
	ldi R16,100
	ldi R17,0
	rcall _Delay_ms
	.dbline 391
	rcall _SpeedControl
	.dbline 393
L101:
	.dbline 369
	rjmp L100
X3:
	.dbline -2
L99:
	.dbline 0 ; func end
	ret
	.dbsym r k 20 I
	.dbsym r adc 20 I
	.dbsym r edata 22 c
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
_UartBuf::
	.blkb 10
	.dbsym e UartBuf _UartBuf A[10:10]c
	.area lit(rom, con, rel)
L11:
	.word 0x0,0x4700
L10:
	.word 0xa3d7,0x3f90

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -