Hey Ken, OK, now I understand your project, and the use of the PicKit's!
Well, I was able to correct my servo jitter, an error on my part of course.
Here is some code for a single servo channel pass through, using DT_INTS. Next I will try adding the other CCP pin.
WalterCode:define OSC 20 DEFINE LOADER_USED 1 DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1 DEFINE HSER_CLROERR 1 ' Clear overflow automatically DEFINE HSER_SPBRG 42 ' 115200 Baud @ 20MHz, 0.94% SPBRGH = 0 BAUDCON.3 = 1 ' Enable 16 bit baudrate generator LED0 var portb.0 LED1 var portb.1 LED2 var portb.2 halftime_bit var bit adcon1=15 ;sets all to digital TRISA=%00000000 ' Set PORTA TRISB=%01110000 ' Set PortB switch inputs (not used) TRISC=%10000100 ' Set PortC.2 to input for ccp1 ' set portC.7 to input for serial port INCLUDE "DT_INTS-18.bas" ; Base Interrupt System include "sub16.inc" ; subtract 16 bit macro LED1=1 ; Set to Output Low LED0=0 led2=1 portb.3 = 0 servo_out var portb.3 risetime var word ;used for pulse width measure start of pw falltime var word ;time at end of pulse width timer0 var word ;used to load tmr0l and h bytes falltime_l var falltime.byte0 falltime_h var falltime.byte1 risetime_l var risetime.byte0 risetime_h var risetime.byte1 pause 1000 ASM INT_LIST macro ; IntSource, Label, Type, ResetFlag? ;INT_Handler TMR1_INT, ToggleLED1, ASM, yes INT_Handler TMR0_INT, _PWMout, ASM, yes INT_Handler CCP1_INT, PWMeasure, ASM, yes INT_Handler TMR2_INT, _twentyMs, ASM, yes endm INT_CREATE ; Creates the interrupt processor ENDASM T0CON = %00000001 T1CON = %00000001 T2CON = %01011111 CCP1CON = %00000101 ;@ INT_ENABLE TMR1_INT ; Enable Timer 1 Interrupts @ INT_ENABLE TMR0_INT @ INT_ENABLE CCP1_INT @ INT_ENABLE TMR2_INT Main: NOP GOTO Main twentyMs: ;really 10ms, but only acted on half the time toggle halftime_bit if halftime_bit = 1 then ;only perform this every other time this is called timer0 = falltime/4 ;measured pulse length, send to ;hserout [dec timer0,",",dec falltime,10,13] tmr0h = 255 - timer0.byte1 tmr0l = 255 - timer0.byte0 T0CON.7 = 1 ;start t0 servo_out = 1 ;set servopin high endif @ INT_RETURN PWMout: T0CON.7 = 0 servo_out = 0 ;at completion of timer set servo pin low @ NOP @ INT_RETURN asm PWMeasure BTFSS CCP1CON, CCP1M0 ; Check for falling edge watch GOTO FALL_EDGE ; Go pick up the falling edge MOVF CCPR1L,W ; else store leading edge value MOVWF _risetime_l ; into 16 bit word risetime MOVF CCPR1H,W MOVWF _risetime_h BCF CCP1CON, CCP1M0 ; Now capture the trailing edge GOTO ISR_2 ; Exit the interrupt service routine FALL_EDGE: BSF CCP1CON, CCP1M0 ; Re-set for trailing edge capture MOVF CCPR1L,W ; Store the captured value into MOVWF _falltime_l ; falltime_l and ... MOVF CCPR1H,W MOVWF _falltime_h ; ... falltime_h ; ; 16 bit subtract ; falltime = falltime - risetime ; SUB16 _falltime, _risetime ISR_2 INT_RETURN endasm





Bookmarks