📄 test_pc10_main.s
字号:
clr R21
.dbline 229
; send_buffer[0] = temp;
sts _send_buffer,R20
.dbline 230
; char_len = 2;
ldi R24,2
sts _char_len,R24
.dbline 231
; serial_send(0);
clr R16
xcall _serial_send
.dbline 232
; return;
.dbline -2
L52:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r temp 20 i
.dbsym r s 22 c
.dbend
.dbfunc e printf_int _printf_int fV
; c -> R20,R21
.even
_printf_int::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 237
; }
;
;
; void printf_int(int c )
; {
.dbline 238
; char_len = bcd_char( c, send_buffer);
ldi R18,<_send_buffer
ldi R19,>_send_buffer
movw R16,R20
xcall _bcd_char
sts _char_len,R16
.dbline 239
; serial_send(0);
clr R16
xcall _serial_send
.dbline 240
; return;
.dbline -2
L54:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r c 20 I
.dbend
.dbfunc e printf_str _printf_str fV
; i -> R20
; s -> R22,R23
.even
_printf_str::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 244
; }
;
;
; void printf_str(char *s ){
.dbline 245
; unsigned char i=0;
clr R20
xjmp L57
L56:
.dbline 247
.dbline 249
ldi R24,<_send_buffer
ldi R25,>_send_buffer
mov R30,R20
clr R31
add R30,R24
adc R31,R25
movw R26,R22
ld R2,x
std z+0,R2
.dbline 250
inc R20
.dbline 251
subi R22,255 ; offset = 1
sbci R23,255
.dbline 252
L57:
.dbline 247
;
; while( *s ){
movw R30,R22
ldd R2,z+0
tst R2
brne L56
.dbline 253
;
; send_buffer[i] = *s ;
; i ++;
; s++;
; }
; char_len = i;
sts _char_len,R20
.dbline 254
; serial_send( 0 );
clr R16
xcall _serial_send
.dbline 256
;
; return;
.dbline -2
L55:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r s 22 pc
.dbend
.dbfunc e outp _outp fV
; p -> R20,R21
; data -> R18
; add -> R16,R17
.even
_outp::
xcall push_gset1
.dbline -1
.dbline 264
; }
; /////////////////////////////////////////////////////////////////////////////////
;
; /////////////////////////////////////////////////////////////////////////////
; ////// 104bus io 操作
; //////////////////////////////////////////////////////////////////////////////
; void outp(unsigned int add,unsigned char data)
; {
.dbline 266
; unsigned char *p;
; p = (unsigned char *) (add+0x2000);
movw R20,R16
subi R20,0 ; offset = 8192
sbci R21,224
.dbline 268
;
; *p=data;
movw R30,R20
std z+0,R18
.dbline -2
.dbline 270
;
; }
L59:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r p 20 pc
.dbsym r data 18 c
.dbsym r add 16 i
.dbend
.dbfunc e inp _inp fc
; p -> R20,R21
; add -> R16,R17
.even
_inp::
xcall push_gset1
.dbline -1
.dbline 274
;
;
; unsigned char inp(unsigned int add)
; {
.dbline 277
;
; unsigned char *p;
; p = (unsigned char *) (add+0x2000);
movw R20,R16
subi R20,0 ; offset = 8192
sbci R21,224
.dbline 278
; return *p;
movw R30,R20
ldd R16,z+0
.dbline -2
L60:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r p 20 pc
.dbsym r add 16 i
.dbend
.dbfunc e init_gyro _init_gyro fV
.even
_init_gyro::
.dbline -1
.dbline 298
;
; }
;
; ////////////////////////////////////////////////////////////////////////////////
; //////////////////////////////////////////////////////////////////////
; //
; // gyro_sample
; //
; // 参数 无
; //
; // 说明 陀螺仪采样函数,首先运行500次,求得零漂平均值,然后处理
; // 陀螺仪数据,最终用算出的角度更新全局变量rob_angle
; //
; // 返回值 无
; //
; // 创建人 张辉
; //
; //////////////////////////////////////////////////////////////////////
;
; void init_gyro(){
.dbline 299
; outp(GYRO_BASE+4,0x00); /*陀螺仪标志位置0*/
clr R18
ldi R16,660
ldi R17,2
.dbline -2
.dbline 301
;
; }
L61:
.dbline 0 ; func end
xjmp _outp
.dbend
.dbfunc e gyro_sample _gyro_sample fI
; angle -> y+6
; cmplt -> R10,R11
; low_byte -> R10,R11
; mid_byte -> R12,R13
; high_byte -> y+2
.even
_gyro_sample::
xcall push_gset4
sbiw R28,10
.dbline -1
.dbline 303
; int gyro_sample()
; {
.dbline 308
; int cmplt;
; long angle;
; unsigned long high_byte;
; unsigned int mid_byte,low_byte;
; high_byte = 0;
ldi R20,0
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
std z+2,R20
std z+3,R21
std z+4,R22
std z+5,R23
.dbline 309
; cmplt=inp(GYRO_BASE+0);
ldi R16,656
ldi R17,2
xcall _inp
mov R10,R16
clr R11
.dbline 311
;
; if((cmplt&0x01)==0x01)
movw R24,R10
andi R24,1
andi R25,0
cpi R24,1
ldi R30,0
cpc R25,R30
brne L63
.dbline 312
; {
.dbline 313
; return 0;
clr R16
clr R17
xjmp L62
L63:
.dbline 315
; }
; outp(GYRO_BASE+4,0x01);
ldi R18,1
ldi R16,660
ldi R17,2
xcall _outp
.dbline 316
; high_byte=inp(GYRO_BASE+1);
ldi R16,657
ldi R17,2
xcall _inp
mov R2,R16
clr R3
clr R4
clr R5
movw R30,R28
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
.dbline 317
; printf("%d ",high_byte);
std y+0,R4
std y+1,R5
mov R18,R2
mov R19,R3
ldi R16,<L65
ldi R17,>L65
xcall _printf
.dbline 318
; mid_byte=inp(GYRO_BASE+2);
ldi R16,658
ldi R17,2
xcall _inp
mov R12,R16
clr R13
.dbline 319
; printf("%d ",mid_byte);
movw R18,R12
ldi R16,<L65
ldi R17,>L65
xcall _printf
.dbline 320
; low_byte=inp(GYRO_BASE+3);
ldi R16,659
ldi R17,2
xcall _inp
mov R10,R16
clr R11
.dbline 321
; printf("%d ",low_byte);
movw R18,R10
ldi R16,<L65
ldi R17,>L65
xcall _printf
.dbline 322
; outp(GYRO_BASE+4,0x00);
clr R18
ldi R16,660
ldi R17,2
xcall _outp
.dbline 323
; if(high_byte>=0x80)
ldi R20,128
ldi R21,0
ldi R22,0
ldi R23,0
movw R30,R28
ldd R2,z+2
ldd R3,z+3
ldd R4,z+4
ldd R5,z+5
cp R2,R20
cpc R3,R21
cpc R4,R22
cpc R5,R23
brlo L66
.dbline 324
; high_byte |= 0xffffff00;
ldi R20,0
ldi R21,255
ldi R22,255
ldi R23,255
or R2,R20
or R3,R21
or R4,R22
or R5,R23
std z+2,R2
std z+3,R3
std z+4,R4
std z+5,R5
L66:
.dbline 325
; angle=(long)(((high_byte)<<16)+((mid_byte&0x00ff)<<8)+(low_byte&0x00ff));
movw R24,R12
andi R25,0
mov R25,R24
clr R24
movw R2,R24
clr R4
clr R5
movw R30,R28
ldd R6,z+2
ldd R7,z+3
ldd R8,z+4
ldd R9,z+5
mov R8,R6
mov R9,R7
clr R6
clr R7
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
movw R24,R10
andi R25,0
movw R2,R24
clr R4
clr R5
add R6,R2
adc R7,R3
adc R8,R4
adc R9,R5
std z+6,R6
std z+7,R7
std z+8,R8
std z+9,R9
.dbline 326
; rob_angle=angle/2742.9797399;
ldd R16,z+6
ldd R17,z+7
ldd R18,z+8
ldd R19,z+9
xcall long2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
ldi R16,<L68
ldi R17,>L68
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall div32f
sts _rob_angle+1,R17
sts _rob_angle,R16
sts _rob_angle+2+1,R19
sts _rob_angle+2,R18
.dbline 327
; return 1;
ldi R16,1
ldi R17,0
.dbline -2
L62:
adiw R28,10
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym l angle 6 L
.dbsym r cmplt 10 I
.dbsym r low_byte 10 i
.dbsym r mid_byte 12 i
.dbsym l high_byte 2 l
.dbend
.dbfunc e relay_write _relay_write fV
; p -> R20,R21
; data -> R16
.even
_relay_write::
xcall push_gset1
.dbline -1
.dbline 332
;
; }
; ///////////////////////////////////////////////////////////////////////////////
; void relay_write(unsigned char data)
; {
.dbline 334
; unsigned char *p;
; p = (unsigned char *) 0x2250;
ldi R20,8784
ldi R21,34
.dbline 336
;
; *p=data;
movw R30,R20
std z+0,R16
.dbline -2
.dbline 338
;
; }
L69:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r p 20 pc
.dbsym r data 16 c
.dbend
.dbfunc e relay_read _relay_read fc
; p -> R16,R17
.even
_relay_read::
.dbline -1
.dbline 342
;
;
; unsigned char relay_read(void)
; {
.dbline 345
;
; unsigned char *p;
; p = (unsigned char *) 0x2250;
ldi R16,8784
ldi R17,34
.dbline 346
; return *p;
movw R30,R16
ldd R16,z+0
.dbline -2
L70:
.dbline 0 ; func end
ret
.dbsym r p 16 pc
.dbend
.dbfunc e motor_pwm _motor_pwm fV
; right -> R18,R19
; left -> R16,R17
.even
_motor_pwm::
.dbline -1
.dbline 355
;
; }
; ////////////////////////////////////////////////////////////////////////////
; /////////////
; ///////// pwm
; ///////
; /////////////////////////////////////////////////////////////////////////////
; void motor_pwm ( int left,int right )
; {
.dbline 357
;
; DDRB|=0XE0;
in R24,0x17
ori R24,224
out 0x17,R24
.dbline 358
; TCCR1A=0xA8;
ldi R24,168
out 0x2f,R24
.dbline 359
; TCCR1B=0x11;
ldi R24,17
out 0x2e,R24
.dbline 360
; ICR1 = 0x6000;
ldi R24,24576
ldi R25,96
sts 70+1,R25
sts 70,R24
.dbline 361
; OCR1A = left; /////12288 is stop
sts 74+1,R17
sts 74,R16
.dbline 362
; OCR1B = right; //// range is from 0 to 24576
sts 72+1,R19
sts 72,R18
.dbline -2
.dbline 365
;
; //OCR1C = 0x3000 + mid;
; }
L71:
.dbline 0 ; func end
ret
.dbsym r right 18 I
.dbsym r left 16 I
.dbend
.dbfunc e mainboard_pwm _mainboard_pwm fV
; pwm3 -> y+0
; pwm2 -> R18,R19
; pwm1 -> R16,R17
.even
_mainboard_pwm::
.dbline -1
.dbline 368
;
; void mainboard_pwm(int pwm1, int pwm2, int pwm3)
; {
.dbline 369
; DDRE |= 0x38;
in R24,0x2
ori R24,56
out 0x2,R24
.dbline 370
; TCCR3A = 0xA8;
ldi R24,168
sts 139,R24
.dbline 371
; TCCR3B = 0x12;
ldi R24,18
sts 138,R24
.dbline 372
; ICR3 = 0x4E20;
ldi R24,20000
ldi R25,78
sts 128+1,R25
sts 128,R24
.dbline 373
; OCR3A = pwm1;
sts 134+1,R17
sts 134,R16
.dbline 374
; OCR3B = pwm2;
sts 132+1,R19
sts 132,R18
.dbline 375
; OCR3C = pwm3;
ldd R0,y+0
ldd R1,y+1
sts 130+1,R1
sts 130,R0
.dbline -2
.dbline 377
;
; }
L72:
.dbline 0 ; func end
ret
.dbsym l pwm3 0 I
.dbsym r pwm2 18 I
.dbsym r pwm1 16 I
.dbend
.dbfunc e mainboard_pwm1 _mainboard_pwm1 fV
; frequ -> R20,R21
.even
_mainboard_pwm1::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 380
;
; void mainboard_pwm1( int frequ)
; {
.dbline 381
; DDRE |= 0x38;
in R24,0x2
ori R24,56
out 0x2,R24
.dbline 382
; TCCR3A = 0xA8;
ldi R24,168
sts 139,R24
.dbline 383
; TCCR3B = 0x12;
ldi R24,18
sts 138,R24
.dbline 384
; ICR3 = frequ;
sts 128+1,R21
sts 128,R20
.dbline 385
; OCR3A = frequ/2;
ldi R18,2
ldi R19,0
movw R16,R20
xcall div16s
sts 134+1,R17
sts 134,R16
.dbline 386
; OCR3B = frequ/2;
ldi R18,2
ldi R19,0
movw R16,R20
xcall div16s
sts 132+1,R17
sts 132,R16
.dbline 387
; OCR3C = frequ/2;
ldi R18,2
ldi R19,0
movw R16,R20
xcall div16s
sts 130+1,R17
sts 130,R16
.dbline -2
.dbline 389
;
; }
L73:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r frequ 20 I
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 403
; //////////////////////////////////////////////////////////////////////////////
; //
; //
; /////////////////////////////////////////////////////////////////////////////////
;
;
;
;
;
;
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 405
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 406
; XDIV = 0x00; //xtal divider
clr R2
out 0x3c,R2
.dbline 407
; XMCRA = 0x00; //external memory
sts 109,R2
.dbline 408
; init_isp_devices();
xcall _init_isp_devices
.dbline 409
; init_gyro();
xcall _init_gyro
.dbline 410
; uart0_init();
xcall _uart0_init
.dbline 411
; uart1_init();
xcall _uart1_init
.dbline 412
; MCUCR = 0x80;
ldi R24,128
out 0x35,R24
.dbline 413
; EICRA = 0x00; //extended ext ints
clr R2
sts 106,R2
.dbline 414
; EICRB = 0x00; //extended ext ints
out 0x3a,R2
.dbline 415
; EIMSK = 0x00;
out 0x39,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -