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