Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

29/03/2014 #21


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?

---------- Actualizado después de 33 minutos ----------

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);

   }
              
}
---------- Actualizado después de 16 minutos ----------

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?
30/03/2014 #22

Avatar de Gudino Roberto duberlin

Hola el problema en el LCD puede que sea externo al software, seguramente el control de contraste está muy alto.
30/03/2014 #23


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); 
        

   }
              
}
31/03/2014 #24

Avatar de Gudino Roberto duberlin

Hola a que le llamas "hace mal en imprimir" num. float?
31/03/2014 #25


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
31/03/2014 #26


ThaConectted dijo: Ver Mensaje
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.
09/04/2014 #27


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);

   }
}
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.