;========================================================================================================== ; ; Wingman MainMotorDriver copyright 2005 v1.0 (2005-04-22) ; ; Name: Christoffer Martinsson ; E-mail: cm@wsm.se ; ; ;========================================================================================================== include P16F684.INC ; Temp-registers W_TEMP EQU 0x20 ; TempRegister for interrupt-routine STATUS_TEMP EQU 0x21 ; TempRegister for interrupt-routine DivRegH EQU 0x22 ; TempRegister for div-routine DivRegL EQU 0x23 ; TempRegister for div-routine SetPWM_Temp EQU 0x24 ; Time-definitions minPulseValue =.20000 maxPulseValue =.40000 ms1Value =.20000 ms05Value =.10000 ;========================================================================================================== ; Reset- and Interrupt-vectors ;========================================================================================================== ORG 0x0000 GOTO Main ;Reset-vector ORG 0x0004 GOTO Interrupt ;Interrupt-vector ;========================================================================================================== ; Macro ;========================================================================================================== ;---------------------------------------------------------------------------------------------------------- ; StoreWregInTemp ; ; Description: Store Status and working-register in temp-registers ; ; Input: - ; ChangedReg: W_TEMP,STATUS_TEMP ; UsedReg: W,STATUS,W_TEMP,STATUS_TEMP ;---------------------------------------------------------------------------------------------------------- StoreWregInTemp MACRO MOVWF W_TEMP ;Copy W to TEMP register SWAPF STATUS,W ;Swap status to be saved into W CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0 MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register ENDM ;---------------------------------------------------------------------------------------------------------- ; RestoreWregFromTemp ; ; Description: Restore Status and working-register from temp-registers ; ; Input: - ; ChangedReg: W,STATUS ; UsedReg: W,STATUS,W_TEMP,STATUS_TEMP ;---------------------------------------------------------------------------------------------------------- RestoreWregFromTemp MACRO SWAPF STATUS_TEMP,W ;Swap STATUS_TEMP register into W (sets bank to original state) MOVWF STATUS ;Move W into Status register SWAPF W_TEMP,F ;Swap W_TEMP SWAPF W_TEMP,W ;Swap W_TEMP into W ENDM ;---------------------------------------------------------------------------------------------------------- ; Sub16L ; ; Description: Subtract literal from 16bit-register. Reg = Reg - Number, WITH VALID CARRY ; ; Input: RegH, RegL, Number ; ChangedReg: C ; UsedReg: W ;---------------------------------------------------------------------------------------------------------- Sub16L MACRO RegH, RegL, Number MOVLW low Number SUBWF RegL MOVLW high Number ;BTFSS STATUS,C ;INCFSZ high Number,W SUBWF RegH ENDM ;---------------------------------------------------------------------------------------------------------- ; Set16L ; ; Description: Sets 16bit-register to literal. Reg = Number ; ; Input: RegH, RegL, Number ; ChangedReg: C ; UsedReg: W ;---------------------------------------------------------------------------------------------------------- Set16L MACRO RegH, RegL, Number MOVLW low Number MOVWF RegL MOVLW high Number MOVWF RegH ENDM ;---------------------------------------------------------------------------------------------------------- ; Clear16 ; ; Description: Clear 16bit-register. ; ; Input: RegH, RegL ; ChangedReg: ; UsedReg: ;---------------------------------------------------------------------------------------------------------- Clear16 MACRO RegH, RegL CLRF RegH CLRF RegL ENDM ;---------------------------------------------------------------------------------------------------------- ; Comp16L ; ; Description: Compare one 16bit-registers to literal if Reg1=Number then Z=1. ; if Reg1 maxPulseValue (~2ms) ; GOTO Mainloop ; then goto Mainloop Sub16L TMR1H,TMR1L,ms1Value ; else counter-value - 1ms Comp16L TMR1H,TMR1L,ms05Value BTFSS STATUS,C ; If counter > 0,5ms GOTO PWM_Fwr ; then goto PWM_forward GOTO PWM_Rev ; else goto PWN_reverse PWM_Fwr: BCF CCP1CON,P1M1 ; Set H-bridge in forward-mode Sub16L TMR1H,TMR1L,ms05Value ; counter-value - 0,5ms GOTO PWM_SetVal ; goto PWM_SetValue PWM_Rev: BSF CCP1CON,P1M1 ; Set H-bridge in reverse-mode MOVLW 0xFF XORWF TMR1H,F ; Invert counterH XORWF TMR1L,F ; Invert counterL Sub16L TMR1H,TMR1L,(0xFFFF-ms05Value) ; Inverted counter-value - (65535-0,5ms) PWM_SetVal: MOVF TMR1H,W ; Divide by 79... MOVWF DivRegH ; Load div-routine with countervalue MOVF TMR1L,W MOVWF DivRegL ; Load div-routine with countervalue MOVLW ((ms05Value/0xFF)+1) ; Load div-routine with divide-value CALL Div16byL ; Divide! SetPWM DivRegL GOTO Mainloop END ;========================================================================================================== ; END ;==========================================================================================================