Estoy usando un PIC16LF1827 con el compilador XC8 en MPLAB X . Necesito almacenar el tiempo entre los pulsos que vienen de un sensor de humedad externo. La cantidad de tiempo se correlaciona con la medida de humedad.
Estoy utilizando la captura de entrada para capturar el borde descendente de los pulsos. Creo que he configurado los bits adecuados en los registros apropiados, pero mi pin de depuración "SightPin_A3" (cambia el estado del pin cada vez que se llama la función) no cambia el valor. No puedo entender por qué no se está ingresando esa sección del vector de interrupción.
Una posibilidad es que no entiendo bien qué pin del puerto está conectado al modo de captura, pero de acuerdo con la hoja de datos (foto de abajo), debería ser el pin P1A (también conocido como pin 0, puerto B) desde los bits 3 y 2 de CCPxM son 01 (necesario para configurar el PCC en modo de captura).
Aquí está el código a continuación:
void InitTimers()
{
T1CON = 0b00000011; /********************************************
bits <7:6>(TMR1CS) = 00; TMR1 clk source is instruction clk
bits <5:4>(T1CKPS) = 00; divide by 1 prescale
bit 3 (T1OSCEN)= 0; TMR1 oscillator disabled
bit 2 (T1SYNC) = 0; synchronize external clk with
sys clock
bit 1 = unimplemented
bit 0 (TMR1ON)= 1; TMR1 on
*******************************************/
T1GCON = 0b10000100; /********************************************
bit 7(TMR1GE) = 1; TMR1 contolled by gate function
bit 6(T1GPOL) = 0; TMR1 gate active low
bit 5(T1GTM) = 0; gate toggle is disabled
bit 4(T1GRPM) = 0; single pulse mode disabled
bit 3(T1GGO) = 0; clear when bit 4 is clear
bit 2(T1GVAL) = read only
bit <1:0>(T1GSS) = 00; TMR1 gate pin
*******************************************/
CCP1CON = 0b0110100; //capture mode: every falling edge
T2CON = 0b01111110; // Fosc / (4 instruct * 16 prescale * 16 postscale * 60 PR2) = 65 Hz
PR2 = 1;
}
void InitInterrupts()
{
PIE1 = 0b00000110; // Enable TMR2IE, interrupt when Timer 2 matches PR2
// Enable CCP1 interrupt
CCP1IF = 0;
INTCON = 0b11000000; // Enable GIE, Enable PEIE
}
Este es el vector de interrupción:
void interrupt ISR()
{
counter++;
if (TMR2IF)
{
if ((counter % 2) != 0)
{
PORTA |= BIT2HI;
}
else
{
PORTA &= BIT2LO;
counter = 0;
}
TMR2IF = 0; // clears the TIMR2IF (timer 2 interrupt flag)
}
if (CCP1IF)
{
static unsigned int uLastEdge;
char highByte;
char lowByte;
int CCPR1_Snapshot;
SightPin_A3();
highByte = CCPR1H;
lowByte = CCPR1L;
CCPR1_Snapshot = (highByte<<8) | lowByte;
uPeriod = CCPR1_Snapshot - uLastEdge;
uLastEdge = CCPR1_Snapshot;
CCP1IF = 0;
}
}
RESOLUCIÓN: Esta es la comida para llevar después de haber estado en el teléfono con microchip
(1) el pin de captura de entrada se establece en el valor predeterminado RB3 no RB0
(2) en el registro T1CON si los bits 6 y 7, los bits TMR1CS, son claros (lo que establece el clik TMR1 en el reloj de instrucciones (Fosc / 4)), entonces el bit T1OSCEN (bit 3) debe configurarse
(3) El bit T1OSCEN puede estar despejado, si los bits 7 y 6 se establecen en 0 y 1, respectivamente
la captura de entrada ahora funciona correctamente