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

📄 m8pwm.s

📁 电动车控制器
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module M8pwm.c
	.area vector(rom, abs)
	.org 16
	rjmp _Timer1_vof
	.org 28
	rjmp _Adc_isr
	.org 2
	rjmp _int0_isr
	.org 4
	rjmp _int1_isr
	.org 22
	rjmp _uart0_rx_isr
	.area data(ram, con, rel)
_AdResult::
	.blkb 1
	.area idata
	.byte 16
	.area data(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbsym e AdResult _AdResult c
_SpeedVal::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbsym e SpeedVal _SpeedVal c
_RolCount::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbsym e RolCount _RolCount c
_RolNum::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbsym e RolNum _RolNum i
_KiloMeter::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbsym e KiloMeter _KiloMeter i
_OldKiloMeter::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbsym e OldKiloMeter _OldKiloMeter i
_TenMeter::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbsym e TenMeter _TenMeter c
_UartBufCount::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbsym e UartBufCount _UartBufCount c
_LrLedReg::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbsym e LrLedReg _LrLedReg c
_BrakeFlag::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbsym e BrakeFlag _BrakeFlag c
	.area text(rom, con, rel)
	.dbfile D:\EBIKE\eb_pro\M8ProV\M8pwm.c
	.dbfunc e Port_init _Port_init fV
	.even
_Port_init::
	.dbline -1
	.dbline 64
; /****************************************************************************** 
; 程序名称:电机驱动程序 
; 运行平台:ATMaga8 12m晶振 
; 程序说明:通过输入来调节pw波 
; pc3 作为ad输入 
; 
; PD5=运行状态指示灯
; pb0=左转灯,pb1=右转灯,pb=0时灯亮, 左右灯同时亮起为刹车状态 
;  2007-12-24
; ******************************************************************************/ 
; #include <iom8v.h> 
; #include <macros.h> 
; 
; #pragma  interrupt_handler Timer1_vof:9  //计算速度信息
; #pragma  interrupt_handler Adc_isr:15   // 采集握把信号
; #pragma  interrupt_handler int0_isr:2    //用于计算每秒钟后轮转过的半圈数
; #pragma  interrupt_handler int1_isr:3    //用于相应刹车 
; #pragma  interrupt_handler uart0_rx_isr:12//串口接收程序
; 
; #define  uchar      unsigned char
; #define  uint       unsigned int
; #define  BRAKE_LED_ON      PORTC |=0x03
; #define  BRAKE_LED_OFF     PORTC &=0xfc
; #define  LEFT_LED_ON       PORTC |=0x01
; #define  LEFT_LED_OFF      PORTC &=0xfe
; #define  RIGHT_LED_ON      PORTC |=0x02
; #define  RIGHT_LED_OFF     PORTC &=0xfd
; #define  EEP_RANG          170
; //Variable
; unsigned char AdResult=0x10; //保存AD结果
; unsigned char SpeedVal=0;    //速度
; unsigned char RolCount=0;   //每秒钟后轮转过的半圈数
; unsigned int  RolNum=0;     //记录总的圈数据,满1000米后将里程写入eeprom
; unsigned int  KiloMeter=0;//里程数据
; unsigned int  OldKiloMeter=0; //前一里程数据
; unsigned char TenMeter=0;   //十米里程计数
; unsigned char UartBuf[10],UartBufCount=0;
; unsigned char LrLedReg=0;   //用于保存刹车灯的状态,以便在刹车释放后回复
; unsigned char BrakeFlag=0;  //0=刹车松开,0x55=刹车
; 
; 
; 
; /***************************************************************************/ 
; 
;  /***************************************************************************/ 
;  void Port_init(void); 
;  void uart0_init(void);
;  void uart0_tx(unsigned char tdata);
;  void tx_pack(uchar mode);
;  void Timer0_init(void); 
;  void Timer1_init(void); 
;  void Timer2_init(void);
;  void SpeedControl(void);
;  void Timer1a_c(void); 
;  void Hardware_init(void); 
;  void EepromWrite(uchar Address, uchar Data);
;  uchar EepromRead(uchar Address);
;  void Delay_ms(unsigned int delay_time); 
;  void adc_init(void);   
; /*************************************************************************** 
;                                                     端口初始化 
; ****************************************************************************/ 
; void Port_init(void) 
; { 
	.dbline 66
;  
;  PORTB=0b11110111; 
	ldi R24,247
	out 0x18,R24
	.dbline 67
;  DDRB =0b00001000;   //PB3用来输出pw波 
	ldi R24,8
	out 0x17,R24
	.dbline 68
;  PORTC=0b11111100;   //上拉使能
	ldi R24,252
	out 0x15,R24
	.dbline 69
;  DDRC =0b00100011;   //pc0,1=LR_led,Pc5=led in 
	ldi R24,35
	out 0x14,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e uart0_init _uart0_init fV
	.even
_uart0_init::
	.dbline -1
	.dbline 82
;  //PORTD=0xff; 
;  //DDRD =0xe0;   // d6d7=lr_led
;  
; }
; /*************************************************************************** 
;              串口0初始化 
; ****************************************************************************/  
; // desired baud rate: 9600
; // actual: baud rate:9615 (0.2%)
; // char size: 8 bit
; // parity: Disabled
; void uart0_init(void)
; {
	.dbline 83
;  UCSRB = 0x00; //disable while setting baud rate
	clr R2
	out 0xa,R2
	.dbline 84
;  UCSRA = 0x00;
	out 0xb,R2
	.dbline 85
;  UCSRC = BIT(URSEL) | 0x06;
	ldi R24,134
	out 0x20,R24
	.dbline 86
;  UBRRL = 0x4D; //set baud rate lo
	ldi R24,77
	out 0x9,R24
	.dbline 87
;  UBRRH = 0x00; //set baud rate hi
	out 0x20,R2
	.dbline 88
;  UCSRB = 0x98;
	ldi R24,152
	out 0xa,R24
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Timer1_init _Timer1_init fV
	.even
_Timer1_init::
	.dbline -1
	.dbline 96
; }
; 
; /*************************************************************************** 
;                                                     定时器1初始化 
; ****************************************************************************/ 
; //定时器1主要用来做速度扫描
; void Timer1_init(void)                      
; { 
	.dbline 98
;  //定时器1部分 ,1024分频,定时1s 
;    TCCR1B = 0x00; //stop
	clr R2
	out 0x2e,R2
	.dbline 99
;    TCNT1H = 0xD2; //setup
	ldi R24,210
	out 0x2d,R24
	.dbline 100
;    TCNT1L = 0x3A;
	ldi R24,58
	out 0x2c,R24
	.dbline 101
;    OCR1AH = 0x3D;
	ldi R24,61
	out 0x2b,R24
	.dbline 102
;    OCR1AL = 0x09;
	ldi R24,9
	out 0x2a,R24
	.dbline 103
;    OCR1BH = 0x3D;
	ldi R24,61
	out 0x29,R24
	.dbline 104
;    OCR1BL = 0x09;
	ldi R24,9
	out 0x28,R24
	.dbline 107
;    //OCR1CH = $OCR1CH$;
;    //OCR1CL = $OCR1CL$;
;    ICR1H  = 0x3D;
	ldi R24,61
	out 0x27,R24
	.dbline 108
;    ICR1L  = 0x09;
	ldi R24,9
	out 0x26,R24
	.dbline 109
;    TCCR1A = 0x00;
	out 0x2f,R2
	.dbline 110
;    TCCR1B = 0x05; //start Timer
	ldi R24,5
	out 0x2e,R24
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Timer2_init _Timer2_init fV
	.even
_Timer2_init::
	.dbline -1
	.dbline 119
; } 
; /*************************************************************************** 
;            Timer2初始化 ,PWM
; ****************************************************************************/ 
; // desired value: 20KHz 
; // actual value: 20.000KHz (0.0%) 
; //定时器0用来产生PW波 
; void Timer2_init(void)
; {
	.dbline 120
;  TCCR2 = 0x00; //stop
	clr R2
	out 0x25,R2
	.dbline 121
;  ASSR  = 0x00; //set async mode
	out 0x22,R2
	.dbline 122
;  TCNT2 = 0x0; //setup
	out 0x24,R2
	.dbline 123
;  OCR2  = 0x1;//设置OCR2
	ldi R24,1
	out 0x23,R24
	.dbline 124
;  TCCR2 = 0x69; //8M/8=1MHz,0x79
	ldi R24,105
	out 0x25,R24
	.dbline -2
L4:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 130
; }
; /*************************************************************************** 
;                                                     A/D初始化 
; ****************************************************************************/ 
; void adc_init(void) 
; { 
	.dbline 131
;  ADCSRA =0x0; //关闭AD 
	clr R2
	out 0x6,R2
	.dbline 132
;  ADMUX = (1<<REFS0)|(1<<ADLAR)|(1<<MUX1)|(1<<MUX0); //选择外部参考电源 ADC3 左对齐 
	ldi R24,99
	out 0x7,R24
	.dbline 133
;  ACSR = (1<<ACD); //关闭模拟比较器 
	ldi R24,128
	out 0x8,R24
	.dbline 134
;  ADCSRA = (1<<ADEN)|(1<<ADIF)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS0);//中断允许 32分频 
	ldi R24,157
	out 0x6,R24
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Adc_isr _Adc_isr fV
	.even
_Adc_isr::
	st -y,R2
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 140
;  } 
; /*************************************************************************** 
;                                                     A/D中断处理 
; ****************************************************************************/ 
; void Adc_isr(void) 
; { 
	.dbline 141
;  AdResult=ADCH; //读取高位数据(左对齐)
	in R2,0x5
	sts _AdResult,R2
	.dbline -2
L6:
	ld R2,y+
	out 0x3f,R2
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e Timer1_vof _Timer1_vof fV
	.even
_Timer1_vof::
	st -y,R0
	st -y,R1
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R16
	st -y,R17
	st -y,R18
	st -y,R19
	st -y,R24
	st -y,R25
	st -y,R30
	st -y,R31
	in R0,0x3f
	st -y,R0
	rcall push_gset1
	sbiw R28,4
	.dbline -1
	.dbline 150
;  //OCR2 = 0xff - AdResult; //更新PWM参数  
;  
; } 
; /*************************************************************************** 
;           定时器1中断处理程序 
; ****************************************************************************/ 
; void Timer1_vof(void)                                      
; //1s中断程序,用于检测转速
; {    
	.dbline 151
;    TCNT1=0xD23A;
	ldi R24,53818
	ldi R25,210
	out 0x2d,R25
	out 0x2c,R24
	.dbline 152
;    SpeedVal=RolCount*1.13;  //3.1415*3.6*后轮半径(0.1m)=1.13                   
	ldi R16,<L10
	ldi R17,>L10
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	lds R16,_RolCount
	clr R17
	rcall int2fp
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall empy32f
	movw R30,R28
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R16,<L11
	ldi R17,>L11
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall cmp32f
	brlt L8
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	ldi R16,<L11
	ldi R17,>L11
	rcall lpm32
	st -y,R19
	st -y,R18
	st -y,R17
	st -y,R16
	rcall sub32f
	rcall fp2int
	movw R20,R16
	subi R20,0  ; offset = 32768
	sbci R21,128
	rjmp L9
L8:
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	rcall fp2int
	movw R20,R16
L9:
	sts _SpeedVal,R20
	.dbline 153
;    RolCount=0;    
	clr R2
	sts _RolCount,R2
	.dbline -2
L7:
	adiw R28,4
	rcall pop_gset1
	ld R0,y+
	out 0x3f,R0
	ld R31,y+
	ld R30,y+
	ld R25,y+
	ld R24,y+
	ld R19,y+
	ld R18,y+
	ld R17,y+
	ld R16,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	ld R1,y+
	ld R0,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e int0_isr _int0_isr fV
	.even
_int0_isr::
	st -y,R2
	st -y,R3
	st -y,R24
	st -y,R25
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 160
	.dbline 162
	lds R24,_RolCount
	subi R24,255    ; addi 1
	sts _RolCount,R24
	.dbline 163
	ldi R24,3183
	ldi R25,12
	lds R2,_RolNum
	lds R3,_RolNum+1
	cp R24,R2
	cpc R25,R3
	brsh L13
	.dbline 164
	.dbline 165
	clr R2
	clr R3
	sts _RolNum+1,R3
	sts _RolNum,R2
	.dbline 166
	lds R24,_KiloMeter
	lds R25,_KiloMeter+1
	adiw R24,1
	sts _KiloMeter+1,R25
	sts _KiloMeter,R24
	.dbline 167
L13:
	.dbline -2
L12:
	ld R2,y+
	out 0x3f,R2
	ld R25,y+
	ld R24,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e int1_isr _int1_isr fV
	.even
_int1_isr::
	st -y,R2
	st -y,R24
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 173
;      
; } 
; /*************************************************************************** 
;           外部中断0处理程序 
; ****************************************************************************/
; void int0_isr(void)
; {
;  //external interupt on INT0
;     RolCount++;//半圈数增加	
; 	if(RolNum> 3183)//半圈=3.1416*0.1米=0.31416米,1000/0,31416=3183
; 	{
; 	   RolNum=0;
; 	   ++KiloMeter;//个位,十位不为0,只需要改变个位十位	
; 	}
; }
; /*************************************************************************** 
;           外部中断1处理程序 
; ****************************************************************************/
; void int1_isr(void)
; {
	.dbline 175
;    //external interupt on INT1
;    if(MCUCR&(0x01<<ISC10))
	in R2,0x35
	sbrs R2,2
	rjmp L16
	.dbline 176
;    {//上升沿触发中断,为释放状态  
	.dbline 177
;       TCCR2=0x69; //8M/8=1MHz
	ldi R24,105
	out 0x25,R24
	.dbline 178
; 	  MCUCR&=~(0x01<<ISC10);//clear ISC10 ,设为下降沿触发
	in R24,0x35
	andi R24,251
	out 0x35,R24
	.dbline 179
; 	  BRAKE_LED_OFF;
	in R24,0x15
	andi R24,252
	out 0x15,R24
	.dbline 180
; 	  BrakeFlag=0;
	clr R2
	sts _BrakeFlag,R2
	.dbline 181
;    }
	rjmp L17
L16:
	.dbline 183
	.dbline 184
	clr R2
	out 0x25,R2
	.dbline 185
	in R24,0x35
	ori R24,4
	out 0x35,R24
	.dbline 186
	in R24,0x15
	ori R24,3
	out 0x15,R24
	.dbline 187
	ldi R24,85
	sts _BrakeFlag,R24
	.dbline 188
L17:
	.dbline -2
L15:
	ld R2,y+
	out 0x3f,R2
	ld R24,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e uart0_rx_isr _uart0_rx_isr fV
	.even
_uart0_rx_isr::
	rcall push_lset
	.dbline -1
	.dbline 194
;    else
;    {//下降沿触发中断,为刹车状态  
;       TCCR2=0;//
; 	  MCUCR|=(0x01<<ISC10);//set ISC10,设为上升沿触发
; 	  BRAKE_LED_ON;
; 	  BrakeFlag=0x55;
;    }   
; }
; /*************************************************************************** 
;                      串口接收中断程序
; ****************************************************************************/ 
; void uart0_rx_isr(void)
; {
	.dbline 197
;  //uart has received a character in UDR    
; 	
; 	UartBuf[UartBufCount++]= UDR;
	lds R2,_UartBufCount
	clr R3
	mov R24,R2
	subi R24,255    ; addi 1
	sts _UartBufCount,R24
	ldi R24,<_UartBuf
	ldi R25,>_UartBuf
	mov R30,R2
	clr R31
	add R30,R24
	adc R31,R25
	in R2,0xc
	std z+0,R2
	.dbline 199
; 	//PORTC ^=0x20;
; 	if(UartBuf[0]==0xaa)//包头
	lds R24,_UartBuf
	cpi R24,170
	brne L19
	.dbline 200
; 	{
	.dbline 203
; 	//UartBuf[3]=Rev,Rev,Rev,RevMode,Rev,Rev,LEFT_LED,RIGHT_LED
; 	
; 	     if(UartBufCount>4)
	ldi R24,4
	lds R2,_UartBufCount
	cp R24,R2
	brsh L20
	.dbline 204
; 		 {
	.dbline 205
; 		    if( ((UartBuf[1]+UartBuf[2])==0xff)&&
	lds R2,_UartBuf+2
	lds R24,_UartBuf+1
	add R24,R2
	cpi R24,255
	brne L23
	lds R2,_UartBuf+4
	lds R24,_UartBuf+3
	add R24,R2
	cpi R24,255
	brne L23
	.dbline 207
; 				((UartBuf[3]+UartBuf[4])==0xff) ) 
; 			{				    		        
	.dbline 208
; 				LrLedReg=UartBuf[3]&0x03;//
	lds R24,_UartBuf+3
	andi R24,3
	sts _LrLedReg,R24
	.dbline 209
; 				if(BrakeFlag!=0x55)
	lds R24,_BrakeFlag
	cpi R24,85
	breq L30
	.dbline 210
; 				{
	.dbline 211
; 				    PORTC&=0xfc;//
	in R24,0x15
	andi R24,252
	out 0x15,R24
	.dbline 212
; 				    PORTC|=LrLedReg;	
	lds R2,_LrLedReg
	in R3,0x15
	or R3,R2
	out 0x15,R3
	.dbline 213
; 				}	       
L30:
	.dbline 214
; 		        tx_pack(UartBuf[3]);
	lds R16,_UartBuf+3
	rcall _tx_pack
	.dbline 215
; 				PORTC ^=0x20;						
	ldi R24,32
	in R2,0x15
	eor R2,R24
	out 0x15,R2
	.dbline 216
; 		    }
L23:
	.dbline 217
; 		    UartBufCount=0;			
	clr R2
	sts _UartBufCount,R2
	.dbline 218
; 	     }	    
	.dbline 219
; 	}
	rjmp L20
L19:
	.dbline 220
	clr R2
	sts _UartBufCount,R2
L20:
	.dbline -2
L18:
	rcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e uart0_tx _uart0_tx fV
;          tdata -> R16

⌨️ 快捷键说明

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