📄 snsles2431.asm
字号:
movlw b'00000010'
movwf CAP1CON ;every rising edge ,time base not reset
movlw b'00000000'
movwf CAP2CON ;off
movlw b'00000000'
movwf CAP3CON ;off
movlw b'00111010'
movwf DFLTCON ; ic1 ic2 ic3 digital fillter 1:4
movlw b'00000000' ;Disable QEI
movwf QEICON
;-----------------------------------------------------------------
;init PORTC
movlw b'00000111'
movwf TRISC
;-----------------------------------------------------------------
;init Timer1
movlw b'10000001'
movwf T1CON
movlw 0xC3 ;0xC350 = 10mSec@20MHz
movwf TMR1H
movlw 0xFF
movwf TMR1L
;-----------------------------------------------------------------
;-----------------------------------------------------------------
clrf SPEED_REFH
clrf CURRENT_UH
clrf CURRENT_UL
clrf FLAGS_SRLS
;-----------------------------------------------------------------
INITIALIZE_SERIAL_PORT
; movlw 0x81 ;Baudrate = 9600
; movwf SPBRG
;
; movlw 0x24 ;8-bit transmission;Enable Transmission;
; movwf TXSTA ;Asynchronous mode with High speed transmission
; movlw 0x90 ;Enable the serial port
; movwf RCSTA ;with 8-bit continuous reception
; bcf TRISC,6
; bsf TRISC,7
;------------------------------------------------------------------------
;init interrupts
bsf PIE1,ADIE ;AD Converter over Interrupt enable
bsf PIE3,PTIE ;PWM interrupt
bsf PIE1,TMR1IE
movlw 0x093 ;Power ON reset status bit/Brownout reset status bit
movwf RCON ;and Instruction flag bits are set
;Priority level on Interrupots enabled
RETURN
;*******************************************************************************
;This routine checks for the keys status. 2 keys are checked, Run/Stop and
;Forward(FWD)/Reverse(REV)
;*******************************************************************************
KEY_CHECK
btfsc KEY_PORT,RUN_STOP_KEY ;Is key pressed "RUN/STOP"?
goto CHECK_FWD_REV_KEY
bsf FLAGS1,KEY_PRESSED ;;;;;;;;;;;;
btfsc FLAGS1,DEBOUNCE
return
call KEY_DEBOUNCE
btfss FLAGS1,DEBOUNCE
return
bsf FLAGS1,KEY_RS
goto SET_KEYS ;;;;;;;;;;;;;;;;
return
CHECK_FWD_REV_KEY
bsf FLAGS1,KEY_PRESSED ;;;;;;;;;;;;;;;;;;;;;;
btfsc KEY_PORT,FWD_REV_KEY ;Is key pressed "RUN/STOP"?
goto SET_KEYS
btfsc FLAGS1,DEBOUNCE
return
call KEY_DEBOUNCE
btfss FLAGS1,DEBOUNCE
return
bsf FLAGS1,KEY_FR
return
SET_KEYS
btfss FLAGS1,DEBOUNCE
return
bcf FLAGS1,DEBOUNCE
bsf FLAGS1,KEY_PRESSED
btfss FLAGS1,KEY_RS
bra ITS_FWD_REV
btg FLAGS1,RUN_STOP
return
ITS_FWD_REV
btg FLAGS1,FWD_REV
return
;*******************************************************************************
KEY_DEBOUNCE
decfsz DEBOUNCE_COUNTER,F
return
bsf FLAGS1,DEBOUNCE
movlw DEBOUNCE_COUNT
movwf DEBOUNCE_COUNTER
return
;*******************************************************************************
PROCESS_KEY_PRESSED
btfss FLAGS1,KEY_PRESSED
return
btfss FLAGS1,KEY_RS
goto CHECK_FWD_REV
btfss FLAGS1,RUN_STOP
goto STOP_MOTOR_NOW
call RUN_MOTOR_AGAIN
bcf FLAGS1,KEY_PRESSED
bcf FLAGS1,KEY_RS
bsf LED_PORT,RUN_STOP_LED
return
STOP_MOTOR_NOW
call STOP_MOTOR ;STOP motor
bcf FLAGS1,KEY_PRESSED
bcf FLAGS1,KEY_RS
bcf LED_PORT,RUN_STOP_LED
return
CHECK_FWD_REV
btfss FLAGS1,KEY_FR
return
btg LED_PORT,FWD_REV_LED
bcf LED_PORT,RUN_STOP_LED
call STOP_MOTOR
call DELAY
call RUN_MOTOR_AGAIN
bcf FLAGS1,KEY_PRESSED
bcf FLAGS1,KEY_FR
bsf LED_PORT,RUN_STOP_LED
return
;*******************************************************************************
;This routine stops the motor by driving the PWMs to 0% duty cycle.
;*******************************************************************************
STOP_MOTOR
movlw 0x00
movwf CX
movwf CX1
movwf CX2
movwf CX3
movwf CX4
bcf PIE1,ADIE
bcf PIE3,IC1IE ;Velocity capture
bcf PIE3,IC3DRIE ;Diection change
bcf PIE3,IC2QEIE ;QEI interrupt
bcf PIE3,PTIE ;PWM interrupt
bcf PIE1,TMR1IE
clrf OVDCOND ;STOP motor
clrf PDC0H
clrf PDC1H
clrf PDC2H
clrf PDC3H
clrf PDC0L
clrf PDC1L
clrf PDC2L
clrf PDC3L
bcf FLAGS,CALC_PWM
clrf SPEED_REFH
return
;*******************************************************************************
;This routine starts motor from previous stop with motor parameters initialized
;*******************************************************************************
RUN_MOTOR_AGAIN
movlw 0x00
movwf CX
movwf CX1
movwf CX2
movwf CX3
movwf CX4
bsf FLAGS1,RUN_STOP
; bcf FLAGS,FLAG_FAULT
;-----------------------------------------------------------------
clrf SPEED_REFH
clrf CURRENT_UH
clrf CURRENT_UL
;-----------------------------------------------------------------
bsf PIE1,ADIE
bsf PIE3,IC1IE ;Velocity capture
bsf PIE1,TMR1IE ;enable T1 interrupt
bsf PIE3,PTIE ;PWM interrupt
clrf FLAGS
movlw b'10000000' ;Faults on
movwf FLTCONFIG
bcf FLT_FLAGS,OCUR
bcf FLT_FLAGS,OVOLT
bcf FLT_FLAGS,OTEMP
clrf FLAGS_SRLS
clrf OVDCOND_TEMP
movlw 0xF0
movwf COUNT_OPEN_LOOPH
movwf COUNT_OPEN_LOOPL
return
;---------------------------------
TOGGLE_LEDS
incfsz COUNTER_SP,F
return
incfsz COUNTER_SP1,F
return
btg LED1
btg LED2
btg LED3
return
;------------------------------------------
FIRST_ADC_INIT
movlw b'00100111'
movwf ADCON0
movlw b'00000000'
movwf ADCON1
movlw b'00110010'
movwf ADCON2
movlw b'00000000'
movwf ADCON3
movlw b'00000000'
movwf ADCHS
movlw b'00000010'
movwf ANSEL0
movlw b'00000000'
movwf ANSEL1
bcf TRISC,0
bcf TRISC,2
bcf TRISC,3
return
LED_BLINK
bcf LED1
bcf LED2
bcf LED3
movlw 0X40
cpfsgt ADRESH
return
bcf TRISC,5
bsf LED1
movlw 0x80
cpfsgt ADRESH
return
bcf TRISC,6
bsf LED2
movlw 0XD0
cpfsgt ADRESH
return
bcf TRISC,7
bsf LED3
return
;*******************************************************************************
SET_SEQUENCE_COUNT
call OPEN_LOOP_PWM
btfss FLAGS1,FWD_REV
bra RUN_REVERSE
movlw 0x5 ;Check for the last value on the table
cpfslt TABLE_OFFSET
bra CLEAR_OFFSET
incf TABLE_OFFSET,F ;Increment offset1
bra LOAD_SEQUENCE_COUNT
CLEAR_OFFSET
clrf TABLE_OFFSET
bra LOAD_SEQUENCE_COUNT
RUN_REVERSE
decf TABLE_OFFSET,F ;Increment offset1
btfsc STATUS,C
bra LOAD_SEQUENCE_COUNT
LOAD_OFFSET
movlw 0x5
movwf TABLE_OFFSET
LOAD_SEQUENCE_COUNT
movf TABLE_OFFSET,W
btfss STATUS,Z
bra NEXT_TEST1
movlw b'00000010'
movwf OVDCONS
movlw b'00010000'
movwf OVDCOND
btg LED1
return
NEXT_TEST1
movf TABLE_OFFSET,W
sublw 0x01
btfss STATUS,Z
bra NEXT_TEST2
movlw b'00001000'
movwf OVDCONS
movlw b'00010000'
movwf OVDCOND
btg LED1
return
NEXT_TEST2
movf TABLE_OFFSET,W
sublw 0x02
btfss STATUS,Z
bra NEXT_TEST3
movlw b'00001000'
movwf OVDCONS
movlw b'00000001'
movwf OVDCOND
btg LED1
return
NEXT_TEST3
movf TABLE_OFFSET,W
sublw 0x03
btfss STATUS,Z
bra NEXT_TEST4
movlw b'00100000'
movwf OVDCONS
movlw b'00000001'
movwf OVDCOND
btg LED1
return
NEXT_TEST4
movf TABLE_OFFSET,W
sublw 0x04
btfss STATUS,Z
bra NEXT_TEST5
movlw b'00100000'
movwf OVDCONS
movlw b'00000100'
movwf OVDCOND
btg LED1
return
NEXT_TEST5
movf TABLE_OFFSET,W
sublw 0x05
btfss STATUS,Z
return
movlw b'00000010'
movwf OVDCONS
movlw b'00000100'
movwf OVDCOND
btg LED1
return
;*******************************************************************************
;This routine sets PWM duty cycles for open loop while starting the motor from stand still
OPEN_LOOP_PWM
movlw 0x07
cpfsgt CX4
bra AAA
movlw 0x9f
movwf PDC_TEMPL
movlw 0x00
movwf PDC_TEMPH
bra BBBBB
AAA
movlw 0x05
cpfsgt CX4
bra AAAA
movlw 0xbf
movwf PDC_TEMPL
movlw 0x00
movwf PDC_TEMPH
bra BBBBB
AAAA
movlw 0x03
cpfsgt CX4
bra AAAAA
movlw 0xdf
movwf PDC_TEMPL
movlw 0x00
movwf PDC_TEMPH
bra BBBBB
AAAAA
movlw 0x1f
movwf PDC_TEMPL
movlw 0x01
movwf PDC_TEMPH
BBBBB
bsf PWMCON1,UDIS ;Disable the PWM buffer update
movf PDC_TEMPH,W
movwf PDC0H
movwf PDC1H
movwf PDC2H
movwf PDC3H
movf PDC_TEMPL,W
movwf PDC0L
movwf PDC1L
movwf PDC2L
movwf PDC3L
bcf PWMCON1,UDIS ;Disable the PWM buffer update
RETURN
;*******************************************************************************
;This routine sends data to PC. Displayed on Hyper terminal
SEND_DATA_TO_PC
bcf FLAGS_SRLS,PC_COM
movlw 0xA ;new line
call SEND_BYTE_FROM_WREG
movlw 0xD ;carriage return
call SEND_BYTE_FROM_WREG
movf OVDCOND_TEMP,W
addlw 0x41
call SEND_BYTE_FROM_WREG
movf BEMF_ZC,W
addlw 0x41
call SEND_BYTE_FROM_WREG
return
;---------------------------------------------------------
DISPLAY_DIGITS
movf DISPLAY_TEMP1,W
andlw 0xF0
swapf WREG,W
addlw 0x30
call CHECK_39
call SEND_BYTE_FROM_WREG
movf DISPLAY_TEMP1,W
andlw 0x0F
addlw 0x30
call CHECK_39
call SEND_BYTE_FROM_WREG
RETURN
;------------------------------
CHECK_39
movwf DISPLAY_TEMP2
movlw 0x39
cpfsgt DISPLAY_TEMP2
bra LESS_39
movf DISPLAY_TEMP2,W
addlw 0x7
return
LESS_39
movf DISPLAY_TEMP2,W
return
;------------------------------
SEND_BYTE_FROM_WREG
btfss PIR1,TXIF
goto SEND_BYTE_FROM_WREG
movwf TXREG
return
;*******************************************************************************
;Delay routine.
;*******************************************************************************
Delay_300ms
movlw 0xff
movwf T
DEC1
movlw 0xff
movwf J
DEC2
decfsz J,F
goto DEC2
decfsz T,F
goto DEC1
return
DELAY
movlw DELAY_COUNT1
movwf COUNTER
dec_count
movlw DELAY_COUNT2
movwf COUNTER1
dec_count1
decfsz COUNTER1,F
goto dec_count1
decfsz COUNTER,F
goto dec_count
clrf COUNTER
clrf COUNTER1
return
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -