Implementando la captura de entrada correctamente en un PIC

1

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

    
pregunta Osagie Igbeare

1 respuesta

1

La función CCP1 se asigna por defecto a RB3. Para reasignarlo a RB0, se debe establecer el bit CCP1SEL en el registro APFCON0.

Se puede usar la activación de puerta para medir el tiempo de encendido o apagado, pero no es necesario para la medición del período.

    
respondido por el venny

Lea otras preguntas en las etiquetas