📄 print.asm
字号:
pop ax
br $Cm_hp_here_wait ;HP为低中的情况2
Cm_hp_here:
movw cm_step_num,#12 ;HP为低中的情况1 移12步
Cm_hp_here_wait:
cmp cm_init_flag,#MOTOR_IDLE
bne $Cm_hp_here_wait ;循环等待
Cm_init_left:
movw cm_step_num,#52
mov cm_rush_flag,#MOTOR_RUSH_STATE ;MOTOR_HOLD_STATE=000H ;保持状态
;MOTOR_RUSH_STATE=001H ;rush状态
;MOTOR_DRIVE_STATE=011H ;驱动状态
mov cm_init_flag,#MOTOR_INIT
mov cm_dir_flag,#MOTOR_DIR_L_OR_B
mov db_10Step12SwitchFlag,#DB_12STEP
mov cm_step_counter,#12
mov cm_speed_state,#MOTOR_SPEED_ACC
call timer20_init ;hp信号为高,向走左no more than 49步
Cm_init_left_wait_0:
cmp cm_init_flag,#MOTOR_IDLE
bne $Cm_init_left_wait_0 ;由Timer2中断完成加-匀-减速过程
call hp_signal
bnc $Cm_init_last
mov print_return_value,#PRNT_HP_ERR
ret ;停下还 hp signal高则还回硬件错误
Cm_init_last:
movw cm_step_num,#65
mov cm_rush_flag,#MOTOR_RUSH_STATE
mov cm_init_flag,#MOTOR_INIT
mov cm_dir_flag,#MOTOR_DIR_R_OR_F
mov db_10Step12SwitchFlag,#DB_12STEP
mov cm_step_counter,#12
mov cm_speed_state,#MOTOR_SPEED_ACC
call timer20_init ;最后走52步
Cm_init_last_wait:
cmp cm_speed_state,#MOTOR_SPEED_CONST
bne $Cm_init_last_wait1
call hp_signal
bnc $Cm_init_last_wait1
br $Cm_init_hp_here1 ;遇HP高
Cm_init_last_wait1:
cmp cm_init_flag,#MOTOR_IDLE
bne $Cm_init_last_wait
mov print_return_value,#PRNT_HP_ERR
ret ;停下还 hp signal低则还回硬件错误
Cm_init_hp_here1:
movw cm_step_num,#10 ;遇HP高移10steps
Cm_init_hp_here1_wait:
cmp cm_init_flag,#MOTOR_IDLE
bne $Cm_init_hp_here1_wait
movw stop_position,#478
cmp db_PaperWideFlag,#PAPER_WIDE_57
bne $Cm_init_init_end
movw stop_position,#358 ;HP初始化结束
Cm_init_init_end:
call cm_move_in_centre
ret
;******************************************************************************
; 函数名:
; cm_move_in_centre
;
; 功能:
; 字车走到中间位置
;-------------------------------------------------------------------------------
cm_move_in_centre:
cmp cm_init_flag,#MOTOR_IDLE
bne $cm_move_in_centre ;等车停止
cm_move_in_centre_0:
movw ax,#228
cmp db_PaperWideFlag,#PAPER_WIDE_57
be $cm_move_in_centre_00 ;57mm
movw ax,#268 ;76mm 总步数268×2 纸类型不同中间位置就不一样
cm_move_in_centre_00:
movw bc,ax
cmpw stop_position,ax
bl $cm_move_in_centre_01
bh $cm_move_in_centre_02
br $!cm_move_in_centre_exit ;字车当前停止位置与中间位置的比较
cm_move_in_centre_01:
mov cm_dir_flag,#MOTOR_DIR_R_OR_F
subw ax,stop_position
incw ax ;奇数补偿
shrw ax,1
movw cm_idle_num,ax
br $!cm_move_in_centre_03 ;S<centre 向右走
cm_move_in_centre_02:
mov cm_dir_flag,#MOTOR_DIR_L_OR_B
subw stop_position,ax ; stop_position-ax -> stop_position
movw ax,stop_position ;stop_position -> ax
incw ax ;ax++
shrw ax,1 ;ax/2 ->ax
movw cm_idle_num,ax ;S>centre 向右走
cm_move_in_centre_03:
mov cm_speed_state,#MOTOR_SPEED_LOW
cmpw cm_idle_num,#24
bnh $cm_move_in_centre_04
subw cm_idle_num,#24
mov cm_speed_state,#MOTOR_SPEED_ACC
cm_move_in_centre_04:
mov cm_logic_flag,#01h
movw stop_position,bc
call start_cm_motor
cm_move_in_centre_exit:
ret
;******************************************************************************
; 函数名:
; start_cm_motor
;
; 功能:
; 启动字车电机
;-------------------------------------------------------------------------------
start_cm_motor:
mov cm_rush_flag,#MOTOR_RUSH_STATE
mov cm_init_flag,#MOTOR_WORK
mov cm_step_counter,#12
cmp cm_logic_flag,#00h
bne $start_cm_motor_1
mov cm_speed_state,#MOTOR_SPEED_ACC
start_cm_motor_1:
call timer20_init
ret ;input cm_step_num,cm_dir_flag 步辐,方向
;******************************************************************************
; 函数名:
; timer20_int
;
; 功能:
; timer20中断,处理字车和出针
;
;-------------------------------------------------------------------------------
timer20_int:
call mos_on
call mos_off
sel rb3 ;选择3等级通用寄存器
cmp cm_init_flag,#MOTOR_INIT
be $cm_int_00 ;字车电机定位初始化
br $!cm_int_20 ;字车电机走动
cm_int_00:
cmp cm_rush_flag,#MOTOR_RUSH_STATE
bne $cm_rush_00
call cm_driver_current ;处于rush状态
call cm_hold_current ;调用电流保护
call cm_driver_current
addw cr20W,#2ecch ;//rush时间为6ms
cmp cm_speed_state,#MOTOR_SPEED_STOP ;
bne $cm_rush_22
mov cm_rush_flag,#MOTOR_HOLD_STATE
br $!cm_int_end ;rush完后停止
cm_rush_22:
mov cm_rush_flag,#MOTOR_DRIVE_STATE
br $!cm_int_end ;rush完后驱动
cm_rush_00:
cmp cm_rush_flag,#MOTOR_DRIVE_STATE
be $cm_rush_01
call cm_hold_current
cmp feeding_flag,#MOTOR_WORK
be $cm_reserve_tm2_1
clr1 ce2
cm_reserve_tm2_1:
set1 cmk20 ;关中断
mov cm_init_flag,#MOTOR_IDLE
br $!cm_int_end
cm_rush_01:
cmp cm_speed_state,#MOTOR_SPEED_LOW
bne $cm_speed_normal
addw cr20w,#2638h ;慢匀速移动 4.9ms
decw cm_step_num ;字车移动步数减1
cmpw cm_step_num,#00h
bne $cm_rush_32
mov cm_rush_flag,#MOTOR_RUSH_STATE
mov cm_speed_state,#MOTOR_SPEED_STOP ;慢速
cm_rush_32:
br $!cm_ph_exchange
cm_speed_normal:
cmp cm_speed_state,#MOTOR_SPEED_CONST
bne $cm_speed_normal_11
br $!cm_constant_move ;匀速
cm_speed_normal_11:
cmp cm_speed_state,#MOTOR_SPEED_ACC
bne $cm_decelerate_00
br $!cm_accelerate_tbl ;加速
cm_decelerate_00:
br $!cm_decelerate_tbl ;减速
CM_ACCELERATE_TIMER_TBL: dw 2638h,1268h,0EBDh,0CCAh
dw 0B9Fh,0AC3h,0A23h,09ACh
dw 0948h,08e4h,0830h,0830h
cm_accelerate_tbl: ;cm accelerate加速start (可以简化)
push vvp ;vvp用于24位 ???WHL用于保存什么
push ax ;AX、HL、BC用于16位
push hl
push bc
movg vvp,#CM_ACCELERATE_TIMER_TBL
movw ax,#10
movw bc,#00h
cmp db_10Step12SwitchFlag,#DB_10STEP
bne $cm_12stepAccelerate
mov c,cm_step_counter
subw ax,bc
shlw ax,1 ;????????????
movw hl,ax
movw ax,[vvp+hl]
addw cr20w,ax
dec cm_step_counter
cmp cm_step_counter,#00h
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -