TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores ARM => Mensaje iniciado por: hernanutn en 30 de Diciembre de 2012, 16:51:07

Título: imprimir carateres en display 16x2
Publicado por: hernanutn en 30 de Diciembre de 2012, 16:51:07
hola mi consulta si alguien sabe como mandar caracteres sin convertir previamente en asccii como por ej en el pic usan esto:
  printf(lcd_putc,"%1.2f voltios", voltios ); es decir quiero mandar numeros mayores a 9. uso el keil uvision 4 para programar. gracias
Título: Re: imprimir carateres en display 16x2
Publicado por: elgarbe en 30 de Diciembre de 2012, 17:08:15
y que librería para manejo de LCD usas?

Saludos
Título: Re: imprimir carateres en display 16x2
Publicado por: hernanutn en 30 de Diciembre de 2012, 17:10:47
y que librería para manejo de LCD usas?

Saludos

 esta libreria:

#include "lcd.h"
#include "lpc21xx.h"
//#include "lpc210x.h"

  #define lcd_line_two 0x40

void lcd_wait(){
      int loop=5000;  //more than enough
      //busy loop
      while(loop--);
}

void lcd_out_data4(unsigned char val){
     IOCLR0 |= (LCD_DATA);
     IOSET0 |= (val<<4);
}

 void lcd_write_nibbles(unsigned char val){

     //higher-order byte
     lcd_en_set();
     lcd_out_data4((val>>4)&0x0F);
     lcd_en_clr();

     lcd_wait();

     //lower-order byte
     lcd_en_set();
     lcd_out_data4((val)&0x0F);
     lcd_en_clr();
     
     lcd_wait();
}

void lcd_write_control(unsigned char val){
     lcd_rs_clr();
     lcd_write_nibbles(val);
}

void lcd_init(){

      PINSEL0 &= (~LCD_GPIO_SEL0);
      PINSEL1 &= (~LCD_GPIO_SEL1);
        /* we only work on OUTPUT so far */
        IODIR0 |= LCD_IOALL;
       
        /* IO init complete, init LCD */

       /* init 4-bit ops*/
       lcd_rs_clr();
       lcd_rw_clr();
       lcd_en_clr();


       //wait VDD raise > 4.5V
       lcd_wait();
       
       //dummy inst
       lcd_write_nibbles(0x30);
       lcd_write_nibbles(0x30);
       lcd_write_nibbles(0x30);

       //FUNCTION SET
       //001DL  N F XX
       //DL=1: 8bit
       //DL=0: 4bit
       //N=0: 1 line display
       //N=1: 2 line display
       //F=0: 5x7 dots
       //F=1: 5x10 dots

       //our case:
       //0010 1000
       lcd_en_set();
       lcd_out_data4(0x2);
       lcd_en_clr();
       lcd_wait();

       lcd_write_nibbles(0x28);
       
       //LCD ON
       lcd_write_nibbles(0x0E);

       //Clear Display
       lcd_write_nibbles(0x01);

       //Entry mode
       lcd_write_nibbles(0x06);

}

void lcd_putchar(unsigned char c){

      lcd_rs_set();
         switch (c) {
     case '\f'   : lcd_write_control(0x01);         //borra la pantalla
                  // delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,2);        break;   //   Salta al comienzo de la segunda línea.
     case '\b'   : lcd_write_control(0x10);  break;     // Retrocede una posición.
     default     :   lcd_write_nibbles(c);   break;
     }
       
       
}

void lcd_print(unsigned char *str)
{
      int i;


      //limit 1 line display for prints
        for (i=0;i<32 && str!=0;i++){
                lcd_putchar(str);
        }

}

 
   
     
void lcd_gotoxy( unsigned char x, unsigned char y) {
   char address;   
  if(y!=1)
    address=lcd_line_two;
  else
    address=0;
  address+=x-1;
  lcd_write_control(0x80|address);
}


Título: Re: imprimir carateres en display 16x2
Publicado por: elgarbe en 30 de Diciembre de 2012, 17:19:37
Mi error... el tema es la funcion printf, es esa la que se encarga de formatear la cadena cambiando %f1.2 con el contenido de voltios y la cadena resultante enviarla a la funcion lcd_putc.
Podrías probar de declarar un array de char y luego hacer:
printf(mi_array_de_char,"%1.2f voltios", voltios );

si en mi_array_de_char obtienes la cadena formateada, entonces debería funcionar bien. Sino, sería un problema de printf y deberías ver como hacer para que funcione. en uvision no sé como sería, yo uso CodeRed y las librerías CMSIS y la verdad... nunca use el printf...
tambien puedes investigar el sprintf

Me interesa si encuentras la forma, sino puedes avisa que veo si puedo probar algo....

Saludos
Título: Re: imprimir carateres en display 16x2
Publicado por: hernanutn en 30 de Diciembre de 2012, 17:26:00
Mi error... el tema es la funcion printf, es esa la que se encarga de formatear la cadena cambiando %f1.2 con el contenido de voltios y la cadena resultante enviarla a la funcion lcd_putc.
Podrías probar de declarar un array de char y luego hacer:
printf(mi_array_de_char,"%1.2f voltios", voltios );

si en mi_array_de_char obtienes la cadena formateada, entonces debería funcionar bien. Sino, sería un problema de printf y deberías ver como hacer para que funcione. en uvision no sé como sería, yo uso CodeRed y las librerías CMSIS y la verdad... nunca use el printf...
tambien puedes investigar el sprintf

Me interesa si encuentras la forma, sino puedes avisa que veo si puedo probar algo....

Saludos

voy a probar, pero lo que quiero es por eje imprimir el 15 y lo debo convertir en ascii ala decena y la unidad cargarlo a un vector y mandarlo con lcd_print pero lo q busco mandarlo de una.
Título: Re: imprimir carateres en display 16x2
Publicado por: elgarbe en 30 de Diciembre de 2012, 17:33:02
y que problema te da ese printf? error de compilacion? o de ejecucion?
Título: Re: imprimir carateres en display 16x2
Publicado por: elgarbe en 30 de Diciembre de 2012, 17:39:22
fijate en esto:

http://www.keil.com/support/man/docs/ca/ca_sprintf.htm
Título: Re: imprimir carateres en display 16x2
Publicado por: hernanutn en 30 de Diciembre de 2012, 17:56:51
fijate en esto:

http://www.keil.com/support/man/docs/ca/ca_sprintf.htm


use esto y anda:
 sprintf(subir,"%d",t);
   lcd_print(subir); 
donde "subir" lo declare como array de 3 elementos y "t" como char, es para q mediante un pulsador voy incrementando la variable q en este caso es "t" y lo imprimo en el lcd para preseleccionar una temperatura x y utilizarlo con un sensor. gracias por la ayuda
Título: Re: imprimir carateres en display 16x2
Publicado por: elgarbe en 30 de Diciembre de 2012, 19:38:43
Muy bueno que haya funcionado!

Seré curioso, que micro estas utilizando? o es una placa de desarrollo?

Saludos!
Título: Re: imprimir carateres en display 16x2
Publicado por: hernanutn en 30 de Diciembre de 2012, 19:58:41
Muy bueno que haya funcionado!

Seré curioso, que micro estas utilizando? o es una placa de desarrollo?

Saludos!

el micro nxp lpc2114
Título: Re: imprimir carateres en display 16x2
Publicado por: elgarbe en 30 de Diciembre de 2012, 20:01:37
y estas haciendo todo el hardware? podría saber de que se trata el proyecto?

Saludos!
Título: Re: imprimir carateres en display 16x2
Publicado por: hernanutn en 30 de Diciembre de 2012, 20:27:01
y estas haciendo todo el hardware? podría saber de que se trata el proyecto?

Saludos!

es un kit echo en la utn de cordoba : http://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/HerramientasProgramacion/PlacasARM
son 2 sensores de temp, q mediante pulsadores configuro una temp y cuando el sensor sobrepase dicha temp q configure se activa por ej para refrigerar una habitacion o calentar la misma.
Título: Re: imprimir carateres en display 16x2
Publicado por: Suky en 30 de Diciembre de 2012, 21:25:34
En keil uvision para redireccionar es sencillo:

Código: C
  1. #include "stdio.h"
  2. struct __FILE {int handle;};
  3. FILE __stdout;
  4.  
  5.  
  6. int fputc(int ch, FILE *f){    
  7.        
  8.         // Aquí llamar a la función correspondiente, en este caso seria:
  9.         return(lcd_putchar(ch));
  10.  
  11. }

Así usas printf directamente.

Saludos!
Título: Re: imprimir carateres en display 16x2
Publicado por: elgarbe en 30 de Diciembre de 2012, 22:00:00
y estas haciendo todo el hardware? podría saber de que se trata el proyecto?

Saludos!

es un kit echo en la utn de cordoba : http://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/HerramientasProgramacion/PlacasARM
son 2 sensores de temp, q mediante pulsadores configuro una temp y cuando el sensor sobrepase dicha temp q configure se activa por ej para refrigerar una habitacion o calentar la misma.

Que interesante la placa!

Para programar el micro usan un LPC-Link o tienen una placa propia?

Saludos!
Título: Re: imprimir carateres en display 16x2
Publicado por: hernanutn en 31 de Diciembre de 2012, 00:20:22
y estas haciendo todo el hardware? podría saber de que se trata el proyecto?

Saludos!

es un kit echo en la utn de cordoba : http://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/HerramientasProgramacion/PlacasARM
son 2 sensores de temp, q mediante pulsadores configuro una temp y cuando el sensor sobrepase dicha temp q configure se activa por ej para refrigerar una habitacion o calentar la misma.

Que interesante la placa!

Para programar el micro usan un LPC-Link o tienen una placa propia?

Saludos!

ahi en el link la placa del 2010 es la q uso, una es la placa base con el micro y las salidas y la otra va montada sobre la anterior para grabarla
Título: Re: imprimir carateres en display 16x2
Publicado por: hernanutn en 31 de Diciembre de 2012, 00:21:09
En keil uvision para redireccionar es sencillo:

Código: C
  1. #include "stdio.h"
  2. struct __FILE {int handle;};
  3. FILE __stdout;
  4.  
  5.  
  6. int fputc(int ch, FILE *f){    
  7.        
  8.         // Aquí llamar a la función correspondiente, en este caso seria:
  9.         return(lcd_putchar(ch));
  10.  
  11. }

Así usas printf directamente.

Saludos!

gracias,pero no comprendo donde deberia ponerlo,xq pongo el printf y compila, pero a la hora de simular el display queda en blanco, pero con el sprintf no me pasa eso.
Título: Re: imprimir carateres en display 16x2
Publicado por: hernanutn en 31 de Diciembre de 2012, 12:23:59
En keil uvision para redireccionar es sencillo:

Código: C
  1. #include "stdio.h"
  2. struct __FILE {int handle;};
  3. FILE __stdout;
  4.  
  5.  
  6. int fputc(int ch, FILE *f){    
  7.        
  8.         // Aquí llamar a la función correspondiente, en este caso seria:
  9.         return(lcd_putchar(ch));
  10.  
  11. }

Así usas printf directamente.

Saludos!



gracias,pero no comprendo donde deberia ponerlo,xq pongo el printf y compila, pero a la hora de simular el display queda en blanco, pero con el sprintf no me pasa eso.
Título: Re: imprimir carateres en display 16x2
Publicado por: Suky en 31 de Diciembre de 2012, 12:34:26
Dentro del main.c o creas otro archivo .c

Por ejemplo:
Código: C
  1. #include "stm32f10x.h"
  2. #include "LCD.h"
  3. #include "stdio.h"
  4. struct __FILE {int handle;};
  5. FILE __stdout;
  6.  
  7.  
  8. int fputc(int ch, FILE *f){    
  9.        
  10.         // Aquí llamar a la función correspondiente, en este caso seria:
  11.         return(lcd_putchar(ch));
  12.  
  13. }
  14.  
  15. int main(void){
  16.         vInitSystem();
  17.         InitLCD();
  18.  
  19.         printf("Probando");
  20.         while(1){              
  21.         }
  22. }
Título: Re: imprimir carateres en display 16x2
Publicado por: elgarbe en 31 de Diciembre de 2012, 13:50:53
y estas haciendo todo el hardware? podría saber de que se trata el proyecto?

Saludos!

es un kit echo en la utn de cordoba : http://ciii.frc.utn.edu.ar/TecnicasDigitalesII/WebHome/HerramientasProgramacion/PlacasARM
son 2 sensores de temp, q mediante pulsadores configuro una temp y cuando el sensor sobrepase dicha temp q configure se activa por ej para refrigerar una habitacion o calentar la misma.

Que interesante la placa!

Para programar el micro usan un LPC-Link o tienen una placa propia?

Saludos!

ahi en el link la placa del 2010 es la q uso, una es la placa base con el micro y las salidas y la otra va montada sobre la anterior para grabarla

Ah! ahí vi todos los link. Graban por serie, por lo que veo.
Muy interesante, estaba buscando algún grupo en alguna facultad que esté trabajando con ARM como para intercambiar ideas...
Bueno, cualquier cosa ya sabes, estamos por aca...

Saludos!
Título: Re: imprimir carateres en display 16x2
Publicado por: hernanutn en 31 de Diciembre de 2012, 16:21:16
Dentro del main.c o creas otro archivo .c

Por ejemplo:
Código: C
  1. #include "stm32f10x.h"
  2. #include "LCD.h"
  3. #include "stdio.h"
  4. struct __FILE {int handle;};
  5. FILE __stdout;
  6.  
  7.  
  8. int fputc(int ch, FILE *f){    
  9.        
  10.         // Aquí llamar a la función correspondiente, en este caso seria:
  11.         return(lcd_putchar(ch));
  12.  
  13. }
  14.  
  15. int main(void){
  16.         vInitSystem();
  17.         InitLCD();
  18.  
  19.         printf("Probando");
  20.         while(1){              
  21.         }
  22. }


andubo de maravilla gracias, otra consulta como hago para mostrar valores float xq los enteros lo muestra y lo float no.
Título: Re: imprimir carateres en display 16x2
Publicado por: hernanutn en 02 de Enero de 2013, 19:14:44
andubo de maravilla, gracias suky , otra consulta como hago para mostrar valores float xq los enteros lo muestra y lo float no.