Autor Tema: 16f628A contador de pulsos  (Leído 7803 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado estalli2

  • PIC10
  • *
  • Mensajes: 12
16f628A contador de pulsos
« en: 09 de Abril de 2010, 13:10:42 »
Hola a todos, estoy investigando y haciendo mis primeros pasos en Pic con el compilados Css y un 16f628A.
Como meta empece con un proyecto de armar un frecuencimetro que despues de haber leido vi que generalmente el proceso que todos utilizan es de usar el tmr1 para contar el tiempo y haciendo interrupciones mediante Rb0.
Para mi que recien estoy empezando a entender e interpretar Css y despegandome del ASM se me convierte todo a muy complejo y me enriedo facil. :huh: :huh: :huh:
Asi que pido por aqui una mano para la base de mi idea
dejo el primer codigo que no me da errores de compilacion, pero en proteus no me grafica nada, no se si hay algo mal :(
Gracias de antemano a todos!
Código: [Seleccionar]
#include <16f628a.h> //pic a utilizar
#fuses XT,NOWDT,NOPROTECT,PUT,NOLVP //ordenes para el programador
#use delay (clock=4000000) //Fosc=4Mhz
#define use_porta_lcd TRUE //definir portb lcd
#include<lcd_mio.c> //libreria manejo lcd


float const uSxTick = 1;                  // Microsegundos por Tick de TMR1 a 4 Mhz

 
int1  flagToggleFlanco=0;                   // Flag para cambiar de flanco
int16 t1=0x00,t2=0x00,tt=0x00;              // Variables para guardar estados de ...
float st=0.0;                               // TMR1 en cada flanco y hacer la resta
int1  flagHayDatos=0;                       // Flag para indicar que ya hay datos de ..
int1  flagHayTransmitir=0;                                             // dos flancos (de subida y bajada)



#int_ext
void handle_ext_int(){
 
  if(flagToggleFlanco==0){                 // He recibido Flanco de Subida
   
     t1=get_timer1();                      // Guardo en t1 el valor de TMR1 al Flanco de Subida
     ext_int_edge(0,H_TO_L);               // Configuro para capturar siguiente flanco de Bajada
     flagToggleFlanco=1;                   // Indico que el siguiente flanco será de Bajada
 
  } else {                                 // He recibido Flanco de Bajada
 
     t2=get_timer1();                      // Guardo en t2 el valor de TMR1 al Flanco de Bajada
     ext_int_edge(0,L_TO_H);               // Configuro para capturar siguiente flanco de subida
     flagToggleFlanco=0;                   // Indico que el siguiente flanco será de Subida
     set_timer1(0);                        // Reinicio TMR1
     if(flagHayDatos==0){                  // Si los datos anteriores han sido procesados ...
        flagHayDatos=1;                    // Indico que ya hay nuevos datos de flancos para calcular

     }
  }
}


void main() {

set_tris_b(0b1111110);                  // Habilito como entrada RC7 para canal RS232
                                           
  ext_int_edge(0,L_TO_H);                  // Configuro captura de 1er flanco de subida
  flagToggleFlanco = 0;                    // inicializo el Flag para cambiar de flanco
 
  enable_interrupts(int_rda);              // Habilito las interrupciones necesarias
  enable_interrupts(int_ext);
  enable_interrupts(global);



do {

     if(flagHayDatos==1){                  // Detecto que ya hay datos de flancos ...
        if(t2 > t1){                       // Compruebo que estoy en la misma vuelta de TMR1
           tt = t2 - t1;                   // Calculo en Tick's de TMR1 el tiempo entre flancos
           st = uSxTick * tt;              // Calculo en uS el tiempo.
           flagHayTransmitir=1;            // Indico que tengo nuevo valor para transmitir
        }
        flagHayDatos=0;                    // Indico que ya han sido procesados los datos.
     }
     
lcd_init();
lcd_gotoxy(5,1);   //salto a columna 4, fila 2
Lcd_putc (" valor");
  lcd_gotoxy(5,2);   //salto a columna 4, fila 2
  Lcd_putc( st);


  } while (TRUE);


Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: 16f628A contador de pulsos
« Respuesta #1 en: 09 de Abril de 2010, 16:47:08 »
A simple vista detecto un par de cositas mal.

Cuando hacés
Código: C
  1. set_tris_b(0B11111110);
Estás configurando a B0 como salida, con lo cual nunca podría contar los pulsos de entrada.
Y otra cosita es que Lcd_init() lo tenés dentro del ciclo do-while, con lo cual estás inicializando el display constantemente.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: 16f628A contador de pulsos
« Respuesta #2 en: 10 de Abril de 2010, 15:32:28 »
Hola estalli2, como dice angelgris, tienes lcd_init(); dentro del bucle infinito, esto significa que el lcd estara iniciando siempre y no funcionara correctamente, sacalo de alli y ponlo antes del bucle infinito, ademas para no estar siempre enviando datos al lcd, bastara con que envies dato cada vez que se activa el flagHayDatos, otra cosa es que el flaghaydatos lo limpies dentro de la condicional if(flaghaydatos)lo coloques dentro de la condicional, existe la posibilidad de que flagHayDatos=1; se dé justo despues de la condicional y se borre el flag sin que hayas mostrado el valor, tu codigo quedaria mas o menos asi;
Código: C
  1. void main() {
  2.  
  3. set_tris_b(0b1111110);                  // Habilito como entrada RC7 para canal RS232
  4.                                            
  5.   ext_int_edge(0,L_TO_H);                  // Configuro captura de 1er flanco de subida
  6.   flagToggleFlanco = 0;                    // inicializo el Flag para cambiar de flanco
  7.  
  8.   enable_interrupts(int_rda);              // Habilito las interrupciones necesarias
  9.   enable_interrupts(int_ext);
  10.   enable_interrupts(global);
  11.  
  12. lcd_init();
  13.  
  14.  
  15. do {
  16.  
  17.      if(flagHayDatos==1){                  // Detecto que ya hay datos de flancos ...
  18.         if(t2 > t1){                       // Compruebo que estoy en la misma vuelta de TMR1
  19.            tt = t2 - t1;                   // Calculo en Tick's de TMR1 el tiempo entre flancos
  20.            st = uSxTick * tt;              // Calculo en uS el tiempo.
  21.            flagHayTransmitir=1;            // Indico que tengo nuevo valor para transmitir
  22.  
  23.  
  24. lcd_gotoxy(5,1);   //salto a columna 4, fila 2
  25. Lcd_putc (" valor");
  26. lcd_gotoxy(5,2);   //salto a columna 4, fila 2
  27. Lcd_putc( st);        
  28. flagHayDatos=0;                    // Indico que ya han sido procesados los datos.}
  29.      }
  30.   } while (TRUE);

Además supngamos que trabajas con bajas frecuencias, el timer1 estara pasando de 65535 a 0 sin que te des cuenta y al llegar la interrupcion de RB0 no obtengas el tiempo real del pulso, esto lo solucionas con un contador en cada flanco para saber cuantas veces se desbordo el timer, al contador lo multipicas por 65536 y le sumas el valor obtenido del timer1 al momento de la interrupcion RB0.

Espero se entienda.

Saludos


A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado estalli2

  • PIC10
  • *
  • Mensajes: 12
Re: 16f628A contador de pulsos
« Respuesta #3 en: 09 de Agosto de 2010, 22:20:33 »
Muchas gracias por las respuestas!!!
Volvi despues de mucho tiempo de estar con muy oco tiempo, pero ya volvi con un poco mas de claridad en el css y pics.
 :-/ muchas gracias por las respuestas muy buenos datos.!!!
ahora vengo renegando con un proyecto mas sencillo pero gracias a esos reniegues vengo aprendiendo mas y haciendome tiempo por ganas a que funcione la cosa!
ahora armo otro post para mantener el orden del foro.
infinitas gracias a todos!!!
 :mrgreen:


 

anything