?? sensrles_cln.asm
字號:
movlw 0xD8
addwfc PRODH,F
movff PRODH,VELOCITY_READH
movff PRODL,VELOCITY_READL
return
;******************************************************************
FAULTA_PROCESS
bsf LED1
bsf LED2
bsf LED3
bsf FLAGS,FLAG_FAULT
call STOP_MOTOR
bcf FLTCONFIG,FLTAS
bcf FLT_FLAGS,OCUR
bcf FLAGS1,KEY_PRESSED
bcf FLAGS1,KEY_RS
bcf FLAGS1,RUN_STOP
return
;******************************************************************
;Peripherals are initialized in this routine
;ADC,PWM, IC, ports and interrupts etc are initialized
INIT_PERPHERALS
;Initialize ADC
movlw b'00010001'
movwf ADCON0
movlw b'00010000'
movwf ADCON1
movlw b'00110010'
movwf ADCON2
movlw b'10000000'
movwf ADCON3
movlw b'00000000'
movwf ADCHS
movlw b'00000011'
movwf ANSEL0
movlw b'00000000'
movwf ANSEL1
;-----------------------------------------------------------------
;Initialize PWM
movlw b'00000000'
movwf PTCON0
movlw 0x37 ; 20KHz = 0xFA ;20KHz of PWM frequency
movwf PTPERL ;16KHz = 0x137
;12KHz = 0x1A0
movlw 0x01
movwf PTPERH
movlw b'01001111' ;PWM0-5 enabled in independent mode
movwf PWMCON0
movlw b'00000001' ;Output overides synched wrt PWM timebase
movwf PWMCON1
movlw b'00000000' ;
movwf DTCON
movlw b'00000000' ;PWM0-5 PWM Duty cycle on overide
movwf OVDCOND
movlw b'00000000' ; All PWMs = 0 on init
movwf OVDCONS
movlw b'10110011' ;Faults on
movlw b'10000000' ;Faults on
movwf FLTCONFIG
movlw 0x00
movwf SEVTCMPL
movlw 0x00
movwf SEVTCMPH
clrf PDC0L
clrf PDC1L
clrf PDC2L
clrf PDC3L
clrf PDC0H
clrf PDC1H
clrf PDC2H
clrf PDC3H
movlw b'10000000' ;PWM timer ON
movwf PTCON1
;-----------------------------------------------------------------
;init Hall @ IC1/IC2/IC3, Timer5
bsf TRISA,2
bsf TRISA,3
bsf TRISA,4
movlw b'00000001' ;1:1
movwf T5CON
movlw b'00000010'
movwf CAP1CON
movlw b'00000000'
movwf CAP2CON
movlw b'00000000'
movwf CAP3CON
movlw b'00111010'
movwf DFLTCON
movlw b'00000000' ;Disable QEI
movwf QEICON
;-----------------------------------------------------------------
;init PORTC
movlw b'10110010'
movwf TRISC
;-----------------------------------------------------------------
;init Timer1
movlw b'10000001'
movwf T1CON
movlw 0xC3 ;0xC350 = 10mSec@20MHz
movwf TMR1H
movlw 0xFF
movwf TMR1L
;-----------------------------------------------------------------
LOAD_SEQUENCE_TABLE
;Forward sequence
movlw POSITION01
movwf POSITION_TABLE_FWD
movlw POSITION61
movwf POSITION_TABLE_FWD+1
movlw POSITION51
movwf POSITION_TABLE_FWD+2
movlw POSITION41
movwf POSITION_TABLE_FWD+3
movlw POSITION31
movwf POSITION_TABLE_FWD+4
movlw POSITION21
movwf POSITION_TABLE_FWD+5
movlw POSITION11
movwf POSITION_TABLE_FWD+6
movlw POSITION71
movwf POSITION_TABLE_FWD+7
;Reverse sequence
movlw POSITION71
movwf POSITION_TABLE_REV
movlw POSITION21
movwf POSITION_TABLE_REV+1
movlw POSITION41
movwf POSITION_TABLE_REV+2
movlw POSITION61
movwf POSITION_TABLE_REV+3
movlw POSITION11
movwf POSITION_TABLE_REV+4
movlw POSITION31
movwf POSITION_TABLE_REV+5
movlw POSITION51
movwf POSITION_TABLE_REV+6
movlw POSITION01
movwf POSITION_TABLE_REV+7
;-----------------------------------------------------------------
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
btfsc FLAGS1,DEBOUNCE
return
call KEY_DEBOUNCE
btfss FLAGS1,DEBOUNCE
return
bsf FLAGS1,KEY_RS
return
CHECK_FWD_REV_KEY
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
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
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
bsf LED1
movlw 0x80
cpfsgt ADRESH
return
bsf LED2
movlw 0XD0
cpfsgt ADRESH
return
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 POSITION1
movwf OVDCOND
movwf OVDCOND_TEMP
btg LED1
return
NEXT_TEST1
movf TABLE_OFFSET,W
sublw 0x1
btfss STATUS,Z
bra NEXT_TEST2
movlw POSITION3
movwf OVDCOND
movwf OVDCOND_TEMP
btg LED1
return
NEXT_TEST2
movf TABLE_OFFSET,W
sublw 0x2
btfss STATUS,Z
bra NEXT_TEST3
movlw POSITION2
movwf OVDCOND
movwf OVDCOND_TEMP
btg LED1
return
NEXT_TEST3
movf TABLE_OFFSET,W
sublw 0x3
btfss STATUS,Z
bra NEXT_TEST4
movlw POSITION6
movwf OVDCOND
movwf OVDCOND_TEMP
btg LED1
return
NEXT_TEST4
movf TABLE_OFFSET,W
sublw 0x4
btfss STATUS,Z
bra NEXT_TEST5
movlw POSITION4
movwf OVDCOND
movwf OVDCOND_TEMP
btg LED1
return
NEXT_TEST5
movf TABLE_OFFSET,W
sublw 0x5
btfss STATUS,Z
return
movlw POSITION5
movwf OVDCOND
movwf OVDCOND_TEMP
btg LED1
return
;*******************************************************************************
;This routine sets PWM duty cycles for open loop while starting the motor from stand still
OPEN_LOOP_PWM
movlw 0x64
cpfslt SPEED_REFH
bra AAAAA
clrf PDC_TEMPL
clrf PDC_TEMPH
bra BBBBB
AAAAA
movlw 0xA5
movwf PDC_TEMPL
movlw 0x03
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
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 + -