分享,PIC16F716驱动步进电机(汇编代码+PROTELL SCH)

2020-02-10 08:51发布

以前用MEGA8和C参考AVR里的例程做过12864和1602液晶,最近学PIC不到一个月,动手做了个步进电机的笑笑驱动系统,大家讨论。
电机是由硬盘上拆下来的,用三个9013驱动,按照六拍运行,上电后缓慢加速,
效果还不错,只是有点噪声
P16F716的资源用到T0,T1,INDF指针,希望大家给点意见

#include <P16F716.INC>

;*****************变量定义*******************        
        CBLOCK        70H
ADD_STEP1
ADD_STEP2
ADD_STEP3
ADD_STEP4
ADD_STEP5
ADD_STEP6
STEP_NUM
WREG_TEMP
STATUS_TEMP
BASE_NUM       
COUNT               
TMR0_V
        ENDC

  __CONFIG _CP_OFF&_BODEN_ON&_PWRTE_ON&_WDT_OFF&_RC_OSC

;*****************复位入口******************   
        ORG        00H           
        GOTO        MAIN
;*****************中断入口******************
        ORG        04H
        MOVWF        WREG_TEMP    ;保护WREG
        SWAPF        STATUS,0
        MOVWF        STATUS_TEMP  ;保护STATUS
;****************************************
;                查询中断
;            TMR0为最高优先级
;****************************************
        BTFSC        PIR1,TMR1IF
        GOTO        T1_SERV
        BTFSC        INTCON,T0IF
        GOTO        T0_SERV
        GOTO        RET
;****************************************
;                T0中断
;        查表转换,循环步进数,驱动电机
;****************************************
T0_SERV
        BCF        INTCON,T0IF        ;清中断标志
        MOVF        TMR0_V,0
        MOVWF        TMR0                ;赋定时值
        INCF        FSR       
        MOVF        INDF,0       
        MOVWF        PORTA
        SUBLW        0x05
        BNZ        RET
        MOVLW        0x6F
        MOVWF        FSR                ;FSR指向STEP_ONE
        GOTO        RET
;****************************************
;                T1中断处理 1ms定时
;                负责TMR0从00加到D7
;                之后屏蔽此中断
;****************************************
T1_SERV
        BCF        PIR1,TMR1IF
        MOVLW        0xFC
        MOVWF        TMR1H
        MOVLW        0x17
        MOVWF        TMR1L                ;赋定时值
       
        INCF        TMR0_V,1
        MOVLW        0xEC        ;152us               
        SUBWF        TMR0_V,0
        BNZ        RET                ;Z非零,跳到RET
        MOVLW        0xEC                ;Z=0
        MOVWF        TMR0_V
        BCF        T1CON,TMR1ON        ;关TMR1中断
        GOTO        RET
;************中断返回,恢复现场*************  
RET
        SWAPF        STATUS_TEMP,0
        MOVWF        STATUS         ;恢复STATUS
        SWAPF        WREG_TEMP,1
        SWAPF        WREG_TEMP,0    ;恢复WREG
        RETFIE
;******************主函数******************
         ORG        50H
MAIN     
        BSF        STATUS,RP0
        MOVLW        B'11111000'
        MOVWF        TRISA                ;RA0,RA1,RA2输出
        MOVLW        B'11111111'
        MOVWF        TRISB                ;RB0作为按键输入
        MOVLW        B'00000010'        ;内部上拉,下降沿触发,
        MOVWF        OPTION_REG        ;T0时钟为内部FOCS/4,;8分频
        BSF        PIE1,TMR1IE
        BCF        STATUS,RP0
        MOVLW        .0
        MOVWF        T1CON
        BCF        PIR1,TMR1IF
        ;MOVLW        .101
        ;MOVWF        BASE_NUM        ;延时基数
       
        MOVLW        0x01
        MOVWF        ADD_STEP1
        MOVLW        0x03
        MOVWF        ADD_STEP2
        MOVLW        0x02
        MOVWF        ADD_STEP3
        MOVLW        0x06
        MOVWF        ADD_STEP4
        MOVLW        0x04
        MOVWF        ADD_STEP5
        MOVLW        0x05
        MOVWF        ADD_STEP6
       
        MOVLW        0x70        ;不能用STEP_ONE代替
        MOVWF        FSR        ;FSR指向STEP_ONE所在寄存器
       
        MOVLW        0x01                ;使转子固定在某一相位上,防止启动时的抖动
        MOVWF        PORTA
        CALL        DELAY                ;等待步进电机平稳
       
        MOVLW        0x00
        MOVWF        TMR0_V
        MOVWF        TMR0
        MOVLW        0xFC
        MOVWF        TMR1H
        MOVLW        0x17
        MOVWF        TMR1L
        BSF        T1CON,TMR1ON
        MOVLW        B'11110000'        ;开外设、T0、INT中断允许
        MOVWF        INTCON
       
LOOP        GOTO        LOOP
;******************DELAY******************
DELAY
        MOVLW        .201
        MOVWF        COUNT
LOOP1        DECFSZ        COUNT,1
        GOTO        LOOP1
        ;DECFSZ        BASE_NUM,1
        ;GOTO        DELAY
        RETURN
               
        END
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。