contador de frecuencia usando pic16f877a

0

Quiero contar los pulsos usando PIC16f877A. Los pulsos se están alimentando en el pin RA4. Quiero usar la interrupción del temporizador para que no se alteren otras funciones que realiza el microcontrolador. La frecuencia se muestra en una pantalla LCD.

Quiero entender la programación. ¿Qué sucede cuando un pulso de señal de frecuencia llega al pin T0CK1 del PIC16f877A? ¿Causará una interrupción? Entonces, ¿debo definir la interrupción para eso? Por favor ayúdame con el código Mikro C.

Aquí está el código tal como está:

//Timer 0 will count and Timer 1 will measure 1 second time using interrupts ; mikro=16f877a
// OUTPUTS

#define led PORTB.F2

sbit LCD_RS at RD5_bit;
sbit LCD_EN at RD4_bit;
sbit LCD_D4 at RC4_bit;
sbit LCD_D5 at RC5_bit;
sbit LCD_D6 at RC6_bit;
sbit LCD_D7 at RC7_bit;

sbit LCD_RS_Direction at TRISD5_bit;
sbit LCD_EN_Direction at TRISD4_bit;
sbit LCD_D4_Direction at TRISC4_bit;
sbit LCD_D5_Direction at TRISC5_bit;
sbit LCD_D6_Direction at TRISC6_bit;
sbit LCD_D7_Direction at TRISC7_bit;
//=======End LCD Connections=============================================
unsigned int x=0,frq=0, cnt=0;

void interrupt()
{
 if(PIR1.TMR1IF)
 {
 T1CON.TMR1ON=0; //stop
 TMR1L=0XEE; // <------------- reload the timer
 TMR1H=0X85;


 if(cnt>=4)
 {
 led=~led;
 frq=1;
 cnt=0;
 x=tmr0;
 tmr0=0;
 }



 //frq=1;
 PIR1.TMR1IF=0; // <------------- clear the timer interrupt flag
 }



}

void main()
{
 OPTION_REG=0xA0; // for timer 0; NO presscaller; counter mode at T0CKI
 T1CON=0X60; // 1:8 prescallar, timer off
 ADCON1=0x07; // adc reg initialization ; changes port a to digital I/O
 INTCON=0x80; // globle interrupt enabled
 TMR1L=0xEE;
 TMR1H=0x85;
 T1CON.TMR1ON=1; // timer on
 PIR1.TMR1IF=0;
 TRISA.f4=1;// making ra4 as input


 x=0;
 frq=0;
 lcd_init();
 Lcd_Cmd(_LCD_CLEAR); // Clear display
 Lcd_Cmd(_LCD_CURSOR_OFF);
 Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT); //*/

 Lcd_Out(1,1,"Frequency");
 while(1)
 {
 if(frq==1)
 {
 Lcd_Out(2,2,X);
 Lcd_Out_CP("Hz");
 frq=0;
 }
 }

}
    
pregunta qaisar

2 respuestas

3

Hay dos métodos comunes diferentes para medir la frecuencia con este PIC. El que sea apropiado depende de las cosas que no nos haya dicho, como la frecuencia mínima y máxima.

La forma conceptualmente simple es hacer un contador de frecuencia. El hardware puede ayudarlo aquí, ya que puede tener un temporizador de incremento de señal externo 0 o un temporizador 1. Luego, el firmware lee el temporizador a intervalos conocidos, y el resto es matemática simple. Tenga en cuenta que NO desea restablecer el temporizador después de cada lectura. Simplemente haga una resta de entero sin signo de la nueva lectura menos la anterior y obtendrá los conteos en el último intervalo.

Tienes que tener en cuenta el desbordamiento del temporizador. El temporizador 0 es de 8 bits y el temporizador 1 de 16 bits. Si utiliza el temporizador 0, por ejemplo, debe asegurarse de que el período de muestreo sea lo suficientemente corto para que haya menos de 256 ciclos por período en la frecuencia de entrada más alta. Con el temporizador 1 obtienes mucho más espacio, ya que tiene 16 bits de ancho. Por lo tanto, puede permitir hasta 65535 ciclos por período de muestreo.

La otra forma de medir la frecuencia es medir el período de ciclos individuales o grupos de ciclos. Esto se hace mejor usando uno de los módulos CCP en modo de captura. El temporizador 1 se configura como un temporizador de funcionamiento libre, y el módulo CCP toma una instantánea cada 1, 4 o 16 períodos de la señal externa. En la interrupción de PCC, restas la nueva lectura de captura menos la anterior para obtener la duración del período externo (o 4 o 16 períodos), y el resto es matemática.

El método de captura de PCC suele ser más preciso y sensible, pero más complicado de implementar y tratar con todos los casos de esquina. Con este método, debe preocuparse por el desbordamiento del temporizador para frecuencias de entrada bajas, no altas. Por lo general, trato con esto al tomar el valor del temporizador periódicamente más rápido de lo que puede ajustarse, y extender el temporizador de manera efectiva a un número arbitrario de bits en el firmware.

    
respondido por el Olin Lathrop
0

Hay un muy buen módulo incorporado de Captura y Comparación (CCP) en 16F877A, pero utiliza el pin RC2 / CCP1 como fuente de interrupción. Cuando ocurre un evento, el módulo de Captura, copia el valor actual del módulo TIMER1. Creo que esta es la mejor solución para un contador de frecuencia.

De la hoja de datos,

  

En el modo de captura, CCPR1H: CCPR1L captura el valor de 16 bits del TMR1   registrarse cuando ocurre un evento en el pin RC2 / CCP1. Un evento se define como   uno de los siguientes:

     

• Cada borde descendente

     

• Cada flanco ascendente

     

Cada cuarto borde ascendente

     

• Cada 16º flanco ascendente

     

El tipo de evento está configurado por bits de control, CCP1M3: CCP1M0   (CCPxCON < 3: 0 >). Cuando se realiza una captura, el indicador de solicitud de interrupción   bit, CCP1IF (PIR1 < 2 >), está establecido. La bandera de interrupción debe ser borrada en   software. Si se produce otra captura antes del valor en el registro CCPR1   se lee, el valor capturado antiguo se sobrescribe con el nuevo valor.

Ahora a tu pregunta,

El pin T0CK1 no debe interrumpir el programa. Se utiliza como el pulso de reloj del temporizador, lo que incrementa el valor del temporizador, y la interrupción se generará solo cuando el temporizador se desplace del máximo a 0 (0XFFF - > 0X0000)

    
respondido por el Saneesh A T

Lea otras preguntas en las etiquetas