📄 tm1zd.asm
字号:
include p16f877a.inc
INDF EQU 0X00
FSR EQU 0X04
XIANSHU EQU 0X20;限制速度值
QIANYA EQU 0X21;欠压值
A_D_Status EQU 0X22;速值
HR EQU 0X23;模拟霍尔信号值
;20H~27H存放各路模拟值.
;28H存放前一通道值.
;29H存模拟通道数.
;2AH\2BH单元为速度值.
;38H单元存放临时模拟值
TSH EQU 0X2A ;手柄电压高位寄存器
TSL EQU 0X2B ;手柄电压低位寄存器
DEYH EQU 0X2B
DEYL EQU 0X2C
;DEY EQU 0X2D
W_TEMP EQU 0X2E
STATUS_TEMP EQU 0X2F
;F0 EQU 0X30 ;低
;F1 EQU 0X31 ;中
;F2 EQU 0X32 ;高
FLAG1 EQU 0X33 ;标志寄存器
ACCALO EQU 0X34
ACCAHI EQU 0X35
ACCBLO EQU 0X36
ACCBHI EQU 0X37
ACCCLO EQU 0X38
;ACCCHI EQU 0X39
ACCDLO EQU 0X3A
ACCDHI EQU 0X3B
PRD EQU 0X3C
DEYH1 EQU 0X3D
DEYL1 EQU 0X3E
TEMP EQU 0X3F
SIGN EQU 0X40
COUNT EQU 0X41
VOLTAGEH EQU 0X42
VOLTAGEL EQU 0X43
TEMP1 EQU 0X44
COUNT_VOL EQU 0X45
;***********标志寄存器位定义以及程序中常数定义**********
CONSTANT VOLTAGE=0
CONSTANT PWM=1
CONSTANT LOWPOWER=2
CONSTANT SHUDOWN=3
CONSTANT OFF=4
CONSTANT FULLPWM=0X05;当PWM输出全高时,输入CCPR1L中的值
CONSTANT VOLOFFH=0X02;当电池电压低于24AH时,低压保护2.86V/31.5V
CONSTANT VOLOFFL=0X4A;
CONSTANT VOLONH=0X00;当电池电压大于003AH时,允许电机重新开机3V/33V
CONSTANT VOLONL=0X66;
CONSTANT TSONH=0X00 ;刹车后手柄复位值低于03AH,则允许电机重新启动
CONSTANT TSONL=0X3A ;37H 或38H
ORG 0X00
NOP
GOTO MAIN
;************************
;中断矢量入口程序
;************************
ORG 0X04
GOTO Intservice
ORG 0X30
;************************
Initial
;*******存储体1*******
banksel TRISA
; CLRF INTCON ;禁止所有中断
BCF OPTION_REG,6 ; 下降沿触发
BCF OPTION_REG,7 ;启用内部弱上拉功能电路
MOVLW 0XFB
movwf TRISC
;BSF TRISC,1 ;设置RC1为输入口,其他为输出口,其中RC2为PWM输出口
MOVLW 0XFF
MOVWF TRISA
MOVWF TRISB
MOVLW 0X00
MOVWF TRISD
MOVLW 0X07
MOVWF TRISE
;banksel PR2
movlw 0x4D ;设定PWM频率初始值16kHZ*******
movwf PR2
; banksel ADCON1
movlw B'10000010' ;设定转换通道,转换值右移RA模拟输入,RE输入
movwf ADCON1 ;以Vdd和Vss为参考
BSF PIE1,ADIE
BCF PIE2,CCP2IE
;*******以下为存储体0*******
banksel PORTD
MOVLW 0X00
MOVWF PORTD ;由于D口上电复位的不确定性,必须关闭所有MOS管
MOVLW 0XFF
MOVWF PORTB
MOVLW FULLPWM ;初始化PWM工作寄存器,使PWM占空比为0
MOVWF CCPR1L ;输出电压为0
MOVLW 0x01
MOVWF T2CON ;D6-D3后分平频器分频比1:1,D2-D0预分频器分频比1:4
MOVLW 0x0c
MOVWF CCP1CON ;设定PWM模式
MOVLW 0X0B ;CCP2工作于特殊事件触发方式,用于采样AD周期寄存器
MOVWF CCP2CON
MOVLW 0X91
MOVWF ADCON0 ;选择AD转换时钟为F/32,AN2通道,并使A/D转换允许
CLRF TMR2 ;清除TMR2记数值
CLRF TMR1H ;清除TMR1记数值
CLRF TMR1L
CLRF T1CON ;TMR1预分频为1,工作于定时方式
MOVLW 0X08
MOVWF CCPR2H ;F5FF初始化A/D采样周期寄存器T=512us
MOVLW 0X00
MOVWF CCPR2L
MOVLW 0XDB
MOVWF INTCON ;开总中断、外围中断、INT中断及RB口电平变化中断允许
;BSF INTCON,4 ;允许外部INT0IE中断
;BSF INTCON,3 ;允许外部 RBIE 电平变化中断
;BCF INTCON,1 ;清外部INTF中断标志位
;BCF INTCON,0 ;清外部RBIF中断标志位
;BSF INTCON,PEIE ;允许第二级的中断请求
;BSF INTCON,GIE ;将中断的总开关打开,使中断可以产生
;banksel PORTD ;初始化子程序
CLRF FLAG1
CLRF COUNT_VOL
BSF T1CON,TMR1ON ;开CCP2,对手柄进行等间隔采样
BSF T2CON,TMR2ON ;开CCP1(使用PWM调速功能)
return
;************************
; 中断服务程序
;************************
Intservice
MOVWF W_TEMP ;将W寄存器的内容保存
SWAPF STATUS,W ;将STATUS寄存器高低字节的内容交换
MOVWF STATUS_TEMP ;存入STATUS_TEMP变量中
MOVF PORTD,W
MOVWF PRD
SERVE1
BTFSC PIR1,ADIF ;INT0标志位?
GOTO ADZD ;是
BTFSC INTCON,1 ;INT0标志位?
GOTO INTSERVE1 ;是
BTFSC INTCON,0 ;RBIF标志位?
GOTO RB4ZD ;RB4中断
SERVE2
MOVF PRD ,W
MOVWF PORTD
SWAPF STATUS_TEMP,W
MOVWF STATUS
SWAPF W_TEMP,F
SWAPF W_TEMP,W
RETFIE
;**********************
;**********************
MAIN
CALL Initial ;调用初始话程序
MAIN1
MOVLW 0X00
MOVWF PORTD
BTFSS FLAG1,PWM
GOTO NEXT1
CALL OUT_PWM
BCF FLAG1,PWM
NEXT1
BTFSS FLAG1,LOWPOWER
GOTO MAIN1
CALL POWER
BTFSC FLAG1,OFF
GOTO MAIN
GOTO MAIN1
POWER
BCF FLAG1,OFF
MOVLW 0X0F
MOVWF PORTD
RETURN
OUT_PWM
MOVLW 0XFF
MOVWF PORTD
RETURN
;**********************************
;外部中断INT0服务子程序
;**********************************
INTSERVE1
BCF INTCON,1 ;清INT0标志位
INT01
BTFSC PORTB,0
GOTO SERVE1 ;恢复正常为1,表示启动结束,返回主程序
MOVLW 0XF0 ;若为0,则输出无效控制字
MOVWF PORTD ;
GOTO INT01 ;测试是否恢复正常值?
;**********************************
;RB4中断
;**********************************
RB4ZD
banksel PORTD
BSF PORTD,7
BCF INTCON,0 ;RB4IF清除溢出标志
GOTO SERVE2 ;测试为干扰,则返回
;*********AD采样中断服务程序***************
ADZD
BTFSC FLAG1,VOLTAGE ;是电压采样吗?
GOTO SET_VOLTAGE ;是,做相应的处理
SET_TS
BCF ADCON0,CHS0
BSF ADCON0,CHS1 ;不是,则调速选择2采样通道
INCF COUNT_VOL ;电压采样周期寄存器值加1
BTFSS STATUS,Z
GOTO AD4 ;没有呢,采样速度
BSF ADCON0,CHS0
BCF ADCON0,CHS1 ;到了,选择通道1(电压)
BSF FLAG1,VOLTAGE ;置相应的标志位
AD4
BCF PIR1,ADIF
;BCF PIR1,TMR1IF
MOVF ADRESH,0 ;采样值送暂存器
MOVWF TSH
BSF STATUS,RP0
MOVF ADRESL,0
BCF STATUS,RP0
MOVWF TSL
BSF FLAG1,PWM
BTFSS FLAG1,VOLTAGE ;是否需要进行电压采样?
GOTO AD6
MOVLW 0X05
MOVWF TEMP1
AD5
DECFSZ TEMP1
GOTO AD5
BSF ADCON0,GO
AD6
;BCF STATUS,C
RRF TSH
RRF TSL
RRF TSH
RRF TSL
;************************
;banksel CCPR1L
movf TSL,W
movwf CCPR1L ;更新工作周期的命令值
;BSF T1CON,TMR1ON ;开CCP2,对手柄进行等间隔采样
GOTO SERVE2 ;恢复现场,中断返回
;*****************************
;
;*****************************
SET_VOLTAGE
BCF ADCON0,CHS0
BSF ADCON0,CHS1 ;选择2采样通道(调速)
BCF PIR1,ADIF
;BCF PIR1,TMR1IF
BCF FLAG1,VOLTAGE
MOVF ADRESH,0
MOVWF VOLTAGEH
BSF STATUS,RP0
MOVF ADRESL,0
BCF STATUS,RP0
MOVWF VOLTAGEL
BSF FLAG1,LOWPOWER
GOTO SERVE2 ;恢复现场,中断返回
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -