@ __config _CONFIG1H, _FOSC_INTIO67_1H & _PLLCFG_ON_1H & _PRICLKEN_ON_1H & _FCMEN_OFF_1H & _IESO_OFF_1H
@ __config _CONFIG2L, _PWRTEN_ON_2L & _BOREN_SBORDIS_2L & _BORV_220_2L
@ __config _CONFIG2H, _WDTEN_OFF_2H & _WDTPS_32768_2H & _CCP2MX_PORTC1_3H & _PBADEN_OFF_3H
@ __config _CONFIG3H, _CCP3MX_PORTE0_3H & _HFOFST_OFF_3H & _T3CMX_PORTC0_3H & _P2BMX_PORTC0_3H & _MCLRE_INTMCLR_3H
@ __config _CONFIG4L, _STVREN_ON_4L & _LVP_OFF_4L & _XINST_OFF_4L & _DEBUG_OFF_4L
@ __config _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L & _CP1_OFF_5L & _CP2_OFF_5L & _CP3_OFF_5L
@ __config _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
@ __config _CONFIG6L, _WRT0_OFF_6L
@ __config _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
@ __config _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L & _EBTR2_OFF_7L & _EBTR3_OFF_7L
@ __config _CONFIG7H, _EBTRB_OFF_7H
INCLUDE "DT_INTS-18.bas" ; Base Interrupt System
INCLUDE "ReEnterPBP-18.bas" ; Include if using PBP interrupts
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler TMR0_INT, _SERVO_HANDLER, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor
ENDASM
Define OSC 64 ' Set clock speed
OSCCON.7 = 0
OSCCON.6 = 1
OSCCON.5 = 1
OSCCON.4 = 1
OSCCON.1 = 0
OSCCON.0 = 0
OSCTUNE.6 = 1
ANSELA = %00000000
ANSELB = %00000000
ANSELC = %00000000
ANSELD = %00000000
ANSELE = %00000000
TRISB = 0
PORTB = 0
TRISC = 0
PORTC = 0
TRISD = 0
PORTD = 0
TRISE = 0
PORTE = 0
TRISA = 0
ALOOP VAR WORD
SERVO1 VAR LATD.0
SERVO1POS VAR BYTE
PRELOAD1 VAR WORD
PRELOAD2 VAR WORD
PRELOAD3 VAR WORD
SERVOCMDMODE VAR BYTE
SERVOPWMCOUNTER VAR WORD
PRELOAD1 = 63556 ' 990us '63556
TMR0_CON_PL1 CON %10000010 ' 1:8
PRELOAD2 = 65528 ' 4us '65528
TMR0_CON_PL2 CON %10000010 ' 1:8
PRELOAD3 = 29556 ' 17990us '29556
TMR0_CON_PL3 CON %10000010 ' 1:8
@ INT_ENABLE TMR0_INT
TMR0L = PRELOAD3.LOWBYTE
TMR0H = PRELOAD3.HIGHBYTE
T0CON = TMR0_CON_PL3
SERVOCMDMODE = 1
MAIN:
SERVO1POS = 0
PAUSE 5000
SERVO1POS = 128
PAUSE 5000
SERVO1POS = 255
PAUSE 5000
GOTO MAIN
SERVO_HANDLER:
IF SERVOCMDMODE = 2 Then
IF SERVOPWMCOUNTER < 256 THEN
T0CON = TMR0_CON_PL2
TMR0L = PRELOAD2.LOWBYTE
TMR0H = PRELOAD2.HIGHBYTE
IF SERVO1POS < SERVOPWMCOUNTER THEN
SERVO1 = 0
LATD.1 = 0
LATD.2 = 0
LATD.3 = 0
ELSE
SERVO1 = 1
LATD.1 = 0
LATD.2 = 1
LATD.3 = 0
ENDIF
SERVOPWMCOUNTER = SERVOPWMCOUNTER + 1
ELSE
T0CON = TMR0_CON_PL3
TMR0L = PRELOAD3.LOWBYTE
TMR0H = PRELOAD3.HIGHBYTE
SERVO1 = 0
LATD.1 = 0
LATD.2 = 0
LATD.3 = 1
SERVOCMDMODE = 1
ENDIF
@ INT_RETURN
ENDIF
IF SERVOCMDMODE = 1 Then
T0CON = TMR0_CON_PL1
TMR0L = PRELOAD1.LOWBYTE
TMR0H = PRELOAD1.HIGHBYTE
SERVOCMDMODE = 2
SERVO1 = 1
LATD.1 = 1
LATD.2 = 0
LATD.3 = 0
SERVOPWMCOUNTER = 1
@ INT_RETURN
ENDIF
@ INT_RETURN
Bookmarks