Autor Tema: diferencia entre printf(lcd_putc"") y lcd_putc("")  (Leído 23448 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
diferencia entre printf(lcd_putc"") y lcd_putc("")
« en: 08 de Junio de 2010, 17:26:04 »
hola, les comento que:

resulta que me encuentro desarroyando un proyectito en el cual me paso algo muy raro segun yo  :oops:, bueno resulta que tengo 2 funciones en las cuales en ambas utilizo switch y sus cases, en el primer switch utilizo 8 cases y en la segunda funsion solo 3 cases. bueno en estos switch utiliso el manejo de la LCD con sus respectivo lcd_gotoxy(x,y). esto es para cada case de los 2 switch, pero al escrivir el ultimo case del switch que tiene solo 3 de estos me salio que no se podia compilar, devido a algo me me desia de la ROM. pero lo raro de todo esto es que yo utilisava para el manejo del a lcd la forma de printf(lcd_putc"");, pero al cambiar unos 5 printf(lcd_putc""); a la forma lcd_putc(""); el problema se avia solucionado. por que abra pasado esto ??????

un ejemplo de lo que digo:

Código: [Seleccionar]
(void)funcion_uno(void){
switch (a){
case 0:lcd_gotoxy(1,2)
          printf(lcd_putc"");
          lcd_gotoxy(1,3)
          printf(lcd_putc"");
case 1:lcd_gotoxy(1,2)
          printf(lcd_putc"");
          lcd_gotoxy(1,3)
          printf(lcd_putc"");
case 2:lcd_gotoxy(1,2)
          printf(lcd_putc"");
          lcd_gotoxy(1,3)
          printf(lcd_putc"");
case 3:lcd_gotoxy(1,2)
          printf(lcd_putc"");
          lcd_gotoxy(1,3)
          printf(lcd_putc"");
case 4:lcd_gotoxy(1,2)
          printf(lcd_putc"");
          lcd_gotoxy(1,3)
          printf(lcd_putc"");
case 5:lcd_gotoxy(1,2)
          printf(lcd_putc"");
          lcd_gotoxy(1,3)
          printf(lcd_putc"");
case 6:lcd_gotoxy(1,2)
          printf(lcd_putc"");
          lcd_gotoxy(1,3)
          printf(lcd_putc"");
          }}
(void)segunda funcion(void){
switch (b){
case 0:lcd_gotoxy(1,2)
          printf(lcd_putc"");
          lcd_gotoxy(1,3)
          printf(lcd_putc"");
case 1:lcd_gotoxy(1,2)
          printf(lcd_putc"");
          lcd_gotoxy(1,3)
          printf(lcd_putc"");
case 2:lcd_gotoxy(1,2)
          printf(lcd_putc"");
          lcd_gotoxy(1,3)
          printf(lcd_putc"");
}}

asi no me dejava compilar el programa dando un problema de espasio de ROM segun el mensaje.
pero al cambiarlo a la forma:

Código: [Seleccionar]
(void)funcion_uno(void){
switch (a){
case 0:lcd_gotoxy(1,2)
          lcd_putc("");
          lcd_gotoxy(1,3)
          lcd_putc("");
case 1:lcd_gotoxy(1,2)
          lcd_putc("");
          lcd_gotoxy(1,3)
          lcd_putc("");
case 2:lcd_gotoxy(1,2)
          lcd_putc("");
          lcd_gotoxy(1,3)
          lcd_putc("");
case 3:lcd_gotoxy(1,2)
          lcd_putc("");
          lcd_gotoxy(1,3)
          lcd_putc("");
case 4:lcd_gotoxy(1,2)
          lcd_putc("");
          lcd_gotoxy(1,3)
          lcd_putc("");
case 5:lcd_gotoxy(1,2)
          lcd_putc("");
          lcd_gotoxy(1,3)
          lcd_putc("");
case 6:lcd_gotoxy(1,2)
          lcd_putc("");
          lcd_gotoxy(1,3)
          lcd_putc("");
          }}
(void)segunda funcion(void){
switch (b){
case 0:lcd_gotoxy(1,2)
          lcd_putc("");
          lcd_gotoxy(1,3)
          lcd_putc("");
case 1:lcd_gotoxy(1,2)
          lcd_putc("");
          lcd_gotoxy(1,3)
          lcd_putc("");
case 2:lcd_gotoxy(1,2)
          lcd_putc("");
          lcd_gotoxy(1,3)
          lcd_putc("");
}}
con esto el error se avia hido y me dejo compilar bien.

estoy ocupando CCS C y el pic 16f877a
y solo ocupa mi programa el 52% de la memoria ROM y un 30% de la RAM...... bueno o algo asi  :oops:
« Última modificación: 08 de Junio de 2010, 17:28:49 por japifer_22 »

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #1 en: 08 de Junio de 2010, 20:25:02 »
Hola, en principio lcd_putc() sirve para enviar un sólo caracter a la LCD y printf(lcdputc,"") para enviar una cadena de caracteres.

El error que tienes es que printf(lcdputc"") está mal escrito, debe ser printf(lcdputc,"").

Te aconsejo que leas el manual de CCS en la parte de lcdputc o la librería lcd.c para que comprendas mejor la diferencia.

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7918
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #2 en: 08 de Junio de 2010, 21:50:13 »
Agregarle como diferencia que el uso de Lcd_putc() dentro del printf permite disponer de todos los modificadores de formato de printf().
Por ejemplo si queremos mostrar un numero float o en decimal con coma fija.
Esos formatos no sirven para Lcd_putc(). :mrgreen:
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #3 en: 08 de Junio de 2010, 23:16:24 »
Sería bueno que pongas el error que te dio el compilador. Textual. ;-)
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Cryn

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4169
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #4 en: 09 de Junio de 2010, 17:21:18 »
Creo que lcd_putc tabién envía cadenas, solo cadenas, sin modificadores %

ya que se puede hacer:

lcd_putc("\fHola Mundo");

Y va bien.
.

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #5 en: 26 de Agosto de 2010, 14:04:19 »
Saludos cordiales Cryn

Espero pueda usted ayudarme.
Tengo el problema de que no puedo mostrar en la LCD con la linea de código printf, en cambio, von la linea de codigo Lcd_putc, pues si puedo, eso sombinando con gotoxy, para cambio de linea y demás, osea, si solamente utilizo Lcd_putc combinando gotoxy, da como se quiere, pero si combino con printf, o solamente utilizo printf, pues no consigo que muestre lo que quiero, en si, no me muestra nada.

Dipongo de una libreria modificada que es "LCD4x20.c" la cual ya modifique, para utilizar una LCD 4x20

Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD4x20.C>

void main()
{
   int16 q;
   float p;
   setup_adc_ports(AN0);
   lcd_init();
   while(1)
   {
      set_adc_channel(0);
      delay_us(10);
      q = read_adc();
      p = 5.0 * q/1024.0;
      printf(lcd_putc, "\fADC = %4ld", q);
      //Lcd_gotoxy(1,2);
      printf(lcd_putc, "\nVoltaje = %01.2fV", p);
      //Lcd_gotoxy (1,3);
      //Lcd_putc ("otro mensaje");
      //Lcd_gotoxy (1,4);
      //Lcd_putc ("mensaje ultimo");
      delay_ms(1000);
      //Lcd_putc ("\f");
   }
}

este código que pongo aqui, es una prueva, aun tengo que hacer que me muestre en la LCD y en el puerto serial, pero ni esto funciona bien.

Muchas gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #6 en: 26 de Agosto de 2010, 14:27:06 »
Te refieres a que si utilizas printf(lcd_putc,"Hola\nhola de buebo\nChau") no pasa a las siguientes lineas? Si es el caso la función putc de la librería está mal implementada, ésta debe detectar que recibe los caracteres especiales \f, \n para tomar una decisión.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #7 en: 26 de Agosto de 2010, 14:41:51 »
Saludos Suky, muchas gracias por responder.

El problema que tengo es que no muestra nada en la LCD, nada de nada, esto es con la línea "printf", solamente utilizando la línea lcd_putc más gotoxy, pues la cosa cambia, muestra lo que quiero en las 4 líneas, pero eso no me sirve de mucho, ya que solamente se puede mandar datos de tipo char, y no float, que es lo que quiero.

En cuanto a lo que planteas, no lo comprendo muy bien, si conoces de algun foro donde pueda informarme más al respecto de \n y demás, o es que la libreria LCD420.c esta mal???

gracias nuevamente.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #8 en: 26 de Agosto de 2010, 14:48:22 »
Adjunta la librería para darle una mirada.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #9 en: 26 de Agosto de 2010, 14:58:50 »
bueno.

la libreria que modifique para poder conectar en el puerto B de la forma que yo quiero.

Código: [Seleccionar]
struct lcd_pin_map {      // This structure is overlayed
           BOOLEAN unused1;      // on to an I/O port to gain
           BOOLEAN unused2;      // access to the LCD pins.
           BOOLEAN rs;               // RB2
           BOOLEAN enable;        // RB3
           int     data : 4;             // RB4 - RB7
        } lcd;

#byte lcd = 6                        // This puts the entire structure
                                     // on to port B (at address 6)

#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 lines


BYTE const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0xc, 1, 6};
                             // These bytes need to be sent to the LCD
                             // to start it up.


                             // The following are used for setting
                             // the I/O port direction register.

struct lcd_pin_map const LCD_WRITE = {0,0,0,0,0}; // For write mode all pins are out
struct lcd_pin_map const LCD_READ = {0,0,0,0,15}; // For read mode data pins are in


BYTE lcdline;

BYTE lcd_read_byte() {
      BYTE low,high;

      set_tris_b(LCD_READ);
      //lcd.rw = 1;
      delay_cycles(1);
      lcd.enable = 1;
      delay_cycles(1);
      high = lcd.data;
      lcd.enable = 0;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(1);
      low = lcd.data;
      lcd.enable = 0;
      set_tris_b(LCD_WRITE);
      return( (high<<4) | low);
}


void lcd_send_nibble( BYTE n ) {
      lcd.data = n;
      delay_cycles(1);
      lcd.enable = 1;
      delay_us(2);
      lcd.enable = 0;
}


void lcd_send_byte( BYTE address, BYTE n ) {

      lcd.rs = 0;
      while ( bit_test(lcd_read_byte(),7) ) ;
      lcd.rs = address;
      delay_cycles(1);
      //lcd.rw = 0;
      delay_cycles(1);
      lcd.enable = 0;
      lcd_send_nibble(n >> 4);
      lcd_send_nibble(n & 0xf);
}


void lcd_init() {
    BYTE i;

    set_tris_b(LCD_WRITE);
    lcd.rs = 0;
    //lcd.rw = 0;
    lcd.enable = 0;
    delay_ms(15);
    for(i=1;i<=3;++i) {
       lcd_send_nibble(3);
       delay_ms(5);
    }
    lcd_send_nibble(2);
    for(i=0;i<=3;++i)
       lcd_send_byte(0, LCD_INIT_STRING[i]);
}


void lcd_gotoxy( BYTE x, BYTE y) {
   BYTE address;

   switch(y) {
     case 1 : address=0x80;break;
     case 2 : address=0xc0;break;
     case 3 : address=0x94;break;
     case 4 : address=0xd4;break;
   }
   address+=x-1;
   lcd_send_byte(0,address);
}

void lcd_putc( char c) {
   switch (c) {
     case '\f'   : lcd_send_byte(0,1);
                   lcdline=1;
                   delay_ms(2);
                                           break;
     case '\n'   : lcd_gotoxy(1,++lcdline);        break;
     case '\b'   : lcd_send_byte(0,0x10);  break;
     default     : lcd_send_byte(1,c);     break;
   }
}

char lcd_getc( BYTE x, BYTE y) {
   char value;

    lcd_gotoxy(x,y);
    lcd.rs=1;
    value = lcd_read_byte();
    lcd.rs=0;
    return(value);
}

Cuando hago de la forma siguiente, pues el caracter especial  \f es aceptado, se borra la pantalla.

Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD4x20.C>

void main()
{
   int16 q;
   float p;
   setup_adc_ports(AN0);
   lcd_init();
   while(1)
   {
      Lcd_putc ("primer mensaje");
      Lcd_gotoxy(1,2);
      Lcd_putc ("segundo mensaje");
      Lcd_gotoxy (1,3);
      Lcd_putc ("otro mensaje");
      Lcd_gotoxy (1,4);
      Lcd_putc ("mensaje ultimo");
      delay_ms(1000);
      Lcd_putc ("\f");
   }
}


y cuando aumento lineas de código con printf, pues......  :?

Muchas gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #10 en: 26 de Agosto de 2010, 15:09:22 »
No veo anda raro en la librería  :? haces exactamente esto:

Código: [Seleccionar]
printf(lcd_putc,"primer mensaje");

A printf hay que indicarle cual función utilizar para enviar los datos formateados.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #11 en: 26 de Agosto de 2010, 15:32:10 »
Saludos.

Hice lo indicado, pero sin ningun resultado.

Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD4x20.C>

void main()
{
   int16 q;
   float p;
   setup_adc_ports(AN0);
   lcd_init();
   while(1)
   {
      set_adc_channel(0);
      delay_us(10);
      q = read_adc();
      p = 5.0 * q/1024.0;
      printf(lcd_putc, "Primer mensaje");
      delay_ms(1000);
      Lcd_putc ("\f");
   }
}

tambien por este lado

Código: [Seleccionar]
#include <16F877A.h>
#device adc = 10
#FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
#include <LCD4x20.C>

void main()
{
   int16 q;
   float p;
   setup_adc_ports(AN0);
   lcd_init();
   while(1)
   {
      set_adc_channel(0);
      delay_us(10);
      q = read_adc();
      p = 5.0 * q/1024.0;
      printf(lcd_putc, "Primer mensaje\n");
      printf(lcd_putc, "Segundo mensaje\n");
      printf(lcd_putc, "Tercer mensaje\n");
      printf(lcd_putc, "Ultimo mensaje");
      delay_ms(1000);
      Lcd_putc ("\f");
   }
}

seguramente no entendi su explicacion, porfavor, algun otro ejemplo, por que necesito mostrar variables float y caracteres concatenados.

Código: [Seleccionar]
printf(lcd_putc, "\nVoltaje = %01.2fV", p);
muchas gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #12 en: 26 de Agosto de 2010, 15:42:14 »
Como no detectaba ningún problema, lo simulé:

Código: C
  1. #include <16F877A.h>
  2. #device adc = 10
  3. #FUSES XT, NOWDT, NOPROTECT, NOPUT, NOBROWNOUT
  4. #use delay(clock=4000000)
  5. #use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N)
  6. #include <LCD4x20.C>
  7.  
  8. void main()
  9. {
  10.    int16 q;
  11.    float p;
  12.    setup_adc_ports(AN0);
  13.    lcd_init();
  14.    printf(lcd_putc,"\fPrimer mensaje");
  15.    while(1)
  16.    {
  17.      
  18.    }
  19. }


Funciona, es otro el problema  :? Con Proteus puedes hacer un debug y ver a que función llama cuando se utiliza printf.
No contesto mensajes privados, las consultas en el foro

Desconectado Lord_Duran

  • PIC12
  • **
  • Mensajes: 76
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #13 en: 26 de Agosto de 2010, 16:33:46 »
Saludos Suky

despues de muchas pruevas, puse el código exactamente como lo pusiste, fuera del ciclo repetitivo, pues fucniona, lo que no entiendo es por que no funciona dentro del ciclo, que es lo que necesito.

Muchas gracias.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: diferencia entre printf(lcd_putc"") y lcd_putc("")
« Respuesta #14 en: 26 de Agosto de 2010, 16:48:16 »
Comienza con printf(lcd_putc,"\f....")

Para que se borre y el cursor se coloque en la primer posición. Luego al final dale cierto tiempo como para lograr visualizar el texto, y debería de funcionar.


Saludos!
No contesto mensajes privados, las consultas en el foro


 

anything