my old proteus can't sim that chip but a 16f1825 is ok
done like this the "remainder" is time between pulses in uS provided overflow is < 2
Code:
'****************************************************************
'* Name : 324_CCP1_Test.pbp *
'* Date : 09/30/20 *
'* Notes : TEST using 16F1825 *
'****************************************************************
'*THIS REV: timing perfect
#CONFIG
__config _CONFIG1, _FOSC_INTOSC & _WDTE_ON & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_ON & _CLKOUTEN_OFF & _IESO_ON & _FCMEN_ON
__config _CONFIG2, _WRT_OFF & _PLLEN_OFF & _STVREN_ON & _BORV_19 & _LVP_OFF
#ENDCONFIG
INCLUDE "DT_INTS-14.bas" ;
INCLUDE "ReEnterPBP.bas" ; Include for DT_INTS. ver 3.4
DEFINE OSC 8
PulseIn var PORTC.5 ' Monitor ECM tachometer signal
PulseFlag var byte ' register if CAPTURE Int was entered
Overflows VAR word ' count the times TMR1 overflows
Remainder VAR word ' remaining TMR1 ticks after last overflow
lastcount VAR word
ANSELA = 0 ' Set all digital
ANSELC = 0
CCP1CON = %00000101 ' On, Capture every + edge
'CCPTMRS = %01010101 ' ALL CCPS using TMR1 (already default)
'INTCON = %11000001
OSCCON=$70
T1CON = %00010001 ' 1:1 prescale, clock=Fosc/4, TMR1=on
T2CON = %00000100 ' 1:1 PRE and POST, ON
'********* USART ****************************************************
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 51 ' 9600 Baud @ 8MHz, 0.16%
SPBRGH = 0
BAUDCON.3 = 1 ' Enable 16 bit baudrate generator
HSEROUT ["324_CCP1_test",10,13]
pause 2000
;----[Interrupts]----------------------------------------
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler CCP1_INT, _Capture, PBP, yes ; WORKS
INT_Handler TMR1_INT, _Timer1, PBP, yes
endm
INT_CREATE ; Creates the High Priority interrupt processor
ENDASM
@ INT_ENABLE CCP1_INT ; enable Capture interrupts
@ INT_ENABLE TMR1_INT ; enable Timer 1 interrupts
Main:
IF PulseFlag = 1 THEN
' PULSOUT tachdrv, 50 '
HSEROUT ["OF= ",DEC Overflows," ,Ticks= ",DEC Remainder, 13,10]
PulseFlag = 0
Overflows = 0
PIR1.0 = 0 ' clear TMR1IF
ELSE
HSEROUT ["NoFlag", 13,10]
ENDIF
GOTO Main
'---[CCP1 - interrupt handler]------------------------------------------
Capture: ' Enter here with input Pulse (CCP1)
Remainder= TMR1 - lastcount
lastcount = TMR1
PulseFlag = 1 ' set flag to pulse out @ each +capture
@ INT_RETURN
''**** TMR *********
Timer1:
Overflows = Overflows + 1
@ INT_RETURN
END
Bookmarks