📄 m8pwm.s
字号:
.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 + -