Programación de Odómetro con PIC

Ya probé el programa y la secuencia la hace bien, lo único que quedaría sería implementar el circuito para mostrarlo en el lcd. ¿Sugieres usar un codificador?



Listo terminé el programa, pero ahora me atoré en que me marca el siguiente error:
"Print format type is invalid"

Supongo que es porque int8 es un formato para las interrupciones, ahí tendría que guardarlo en otra variable? y después imprimirlo?

Anexo mi programa:
Código:
#include <16F628A.h>


#FUSES NOWDT, XT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD

#use delay(clock=4000000)
#include "lcd.c"

#byte porta = 0x05        
#byte portb = 0x06        

// ---------- Programa Principial ----------

void main()
{
   port_b_pullups(FALSE);                   // Sin resistencias pullups a las salidas del puerto B.
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Al no usar el TIMER configuramos lo más básico. 
   setup_comparator(NC_NC_NC_NC);           // Sin comparadores.
   setup_vref(FALSE);                       // Al no usar comparadores no necesitamos Vref.  
   
   //---- Fin de la configuración del 16F628A ----

   int8   x;    
   int8   enc;  
   int8   aux;  

   set_tris_a(0b11111);    
   set_tris_b(0b00000000);  
   
   portb=0;   
   x=0;      
   enc=0;    
   
   //iniciar el lcd
   lcd_init();
   lcd_putc("Bienvenido\n");
   lcd_putc("Odometro\n");
   delay_ms(2000);
   lcd_putc("\f");
   lcd_putc("La distancia\n");
   lcd_putc("Actual es\n");
   delay_ms(2000);
   lcd_gotoxy(14,2);
     
   
   While (true)
   {
   lcd_gotoxy(8,2);
   lcd_putc(" ");
   lcd_gotoxy(8,2);

          aux=enc;              
          enc=porta & 3;        
          If ((aux==2)&&(enc==3))
          {  
              x++;               
          }
          If ((aux==3)&&(enc==2))
          {  
              x--;               
          }
          
          portb = x;      
          printf(lcd_putc,"%02.1f",x); 
         delay_ms(1000);

   }
              
}

Ya lo solucioné, había que cambiar al final, en vez de:"printf(lcd_putc,"%02.1f",x); " había que poner :
printf(lcd_putc,"%u",x);

Pero sigue sin mostrarlo en el LCD, unicamente me marca los cuadros negritos.
¿Alguna idea de porque podría ser?
 
Última edición por un moderador:
Si de hecho ya lo arregle ahora el problema que tengo es mostrar numeros de con punto decimal y numeros arriba de 128, mide bien numeros enteros pero al momento de querer imprimirlos de tipo flotante lo hace mal. Me podrian ayudar ? Anexo mi codigo


Código:
#include <16F877a.h>


#FUSES NOWDT, XT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD

#use delay(clock=4000000)
#include "lcd.c"

#byte porta = 0x05        
#byte portb = 0x06        

// ---------- Programa Principial ----------

void main()
{
   port_b_pullups(FALSE);                   // Sin resistencias pullups a las salidas del puerto B.
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Al no usar el TIMER configuramos lo más básico. 
   setup_comparator(NC_NC_NC_NC);           // Sin comparadores.
   setup_vref(FALSE);                       // Al no usar comparadores no necesitamos Vref.  
   
   //---- Fin de la configuración del 16F628A ----

   int8   x; 
   int8   enc;  
   int8   aux;  

   set_tris_a(0b11111);    
   set_tris_b(0b00000000);  
   
   portb=0;   
   x=0;      
   enc=0;    
   //int cp=0;
   
  //iniciar el lcd
   lcd_init();
   lcd_putc("Bienvenido\n");
   lcd_putc("Odometro\n");
   delay_ms(2000);
   lcd_putc("\f");
   lcd_putc("La distancia\n");
   lcd_putc("Actual es\n");
   delay_ms(2000);
   lcd_gotoxy(14,2);
     
   
   While (true)
   {
   lcd_gotoxy(8,2);
   lcd_putc(" ");
   lcd_gotoxy(8,2);

          aux=enc;              
          enc=porta & 3;        
          If ((aux==2)&&(enc==3))
          {  
              x++;               
          }
          If ((aux==3)&&(enc==2))
          {  
              x--;               
          }
          
          
          
          portb = x;
          
          
        printf(lcd_putc,"%int",x); 
        

   }
              
}
 
Última edición por un moderador:
A qué no imprime números flotantes, como se ve aquí en el código lo tengo por interrupciones,entonces no me imprime números flotantes, ósea con punto decimal a eso me refiero
 
aux=enc;
enc=porta & 3;
If ((aux==2)&&(enc==3))
{
x++;
}
If ((aux==3)&&(enc==2))
{
x--;
}

Te repito que si nada más usas esas comparaciones en tu código estarás subutilizando el encoder.

Y sobre mostrar valores float en el lcd, no es tan sencillo como mostrar enteros, pero hay muy buenos ejemplos en el foro, utiliza el buscador.
 
Buenas tardes, nuevamente vuelvo al proyecto debido a que he realizado varias pruebas y la programación de mi odómetro ha quedado correctamente, sin embargo ahora lo cambié por un sensor que maneja 24 pulsos por vuelta, es decir que avanza 15 grados por cada pulso.

El motivo por el cual vuelvo a postear es debido a que cuando va lento no hay problema por el conteo, sin embargo cuando va un poco más rápido no cuenta bien, y quisiera saber si alguno de ustedes en base a su experiencia pudiera decirme que puedo hacer para poder corregir ese error.

Anexo mi código:

Código:
#include <16F877a.h>


#FUSES NOWDT, XT, PUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD

#use delay(clock=8000000)
#include "lcd.c"

#byte porta = 0x05        
#byte portb = 0x06        

// ---------- Programa Principial ----------

void main()
{
   port_b_pullups(FALSE);                   // Sin resistencias pullups a las salidas del puerto B.
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); // Al no usar el TIMER configuramos lo más básico. 
   setup_comparator(NC_NC_NC_NC);           // Sin comparadores.
   setup_vref(FALSE);                       // Al no usar comparadores no necesitamos Vref.  
   
  

   int16   x=0;
   float  y=0;
   int8   enc;  
   int8   aux;  
   

   set_tris_a(0b11111);    
   set_tris_b(0b11111111);  
   
   portb=0;   
   x=0;      
   enc=0;    
   //int cp=0;
   
  //iniciar el lcd
   lcd_init();
   lcd_putc("Bienvenido\n");
   lcd_putc("Odometro\n");
   delay_ms(2000);
   lcd_putc("\f");
   //lcd_putc("La distancia\n");
   //lcd_putc("Actual es\n");
   //delay_ms(2000);
  // lcd_gotoxy(14,2);
     
   
   While (true)
   {
   lcd_gotoxy(8,1);
   lcd_putc(" ");
  // lcd_gotoxy(8,2);*/

          
         aux=enc;              
          enc=porta & 3; 
          If ((aux==2)&&(enc==3))
          {  
              x++;               
          }
          If ((aux==3)&&(enc==2))
          {  
              x--;               
          }
         If((aux==2)&(enc==2))
         {
         x=x;
         }
         If((aux==3)&(enc==3))
         {
         x=x;
         }
          If (bit_test(portb,2 ) == 1)  
          {
          x=0;
          }
          If (x == 65535) 
          { x=0;
          }
   
         
          y=0.8333*x;
         
          if(y<0)
          {
          y=0;
          }
   
        printf(lcd_putc,"%4lu",x); 
         lcd_gotoxy(8,2);
        printf(lcd_putc,"%2.2f",y);
        delay_ms(5);

   }
}
 
Última edición por un moderador:
Atrás
Arriba