TODOPIC

Otros Microcontroladores / Dispositivos programables => Microcontroladores 8 bits => Mensaje iniciado por: micro_pepe en 01 de Febrero de 2015, 18:57:02

Título: Libreria para LCD con 3 pines y AVRStudio
Publicado por: micro_pepe en 01 de Febrero de 2015, 18:57:02
Buenas,

estoy traduciendo una libreria  (http://www.todopic.com.ar/foros/index.php?topic=27011.0)  que encontré en el foro para PIC, a lenguaje C de AVRStudio, y ocurre lo que comento ahora.

Si en el Main pongo esto, funciona:

Código: [Seleccionar]
lcd_gotoxy(1,  1);
lcd_putc('\f');
lcd_putc('H');
lcd_putc('o');
lcd_putc('l');
lcd_putc('a');
lcd_putc('!');
lcd_putc('!');
lcd_putc('!');
lcd_putc('\n');
lcd_putc('M');
lcd_putc('u');
lcd_putc('n');
lcd_putc('d');
lcd_putc('o');

Pero si hago uso de printf, no funciona:

Código: [Seleccionar]
printf(lcd_putc,"\f-LCD 3 pin Mode-\n* !.|.|..|.|.! *");

Dejo adjuntas las dos librerias (original y la modificada) y el proyecto en VS.

Saludos!!!
Título: Re: Libreria para LCD con 3 pines y AVRStudio
Publicado por: KILLERJC en 01 de Febrero de 2015, 19:58:31
2 cosas para decir....

Puede que tu "printf" no sea el mismo "printf" que el otro compilador.
Buscando por el printf de stdio.h

int printf ( const char * format, ... );

es decir no se le pasa una funcion. ahi debe estar el problema.
proba hacer:

int8_t variable = printf(lcd_putc,"\f-LCD 3 pin Mode-\n* !.|.|..|.|.! *");

Y fijate el valor de variable.
Citar
On success, the total number of characters written is returned.
If a writing error occurs, the error indicator (ferror) is set and a negative number is returned.

Mi segunda cosa a decir es que a pesar que pide definir el tipo de lcd ( me refiero a la cantidad de lineas ) no hay restriccion en el gotoxy, es decir podes seleccionar para 1 linea, pero si por casualidad pones un gotoxy a la segunda linea, va a intentar grabar en la segunda, creo que con un ifdef/ifndef podrias salvarlo o preguntando por la constante, total luego el compilador al optimizarlo va a sacar el codigo.
Título: Re: Libreria para LCD con 3 pines y AVRStudio
Publicado por: micro_pepe en 01 de Febrero de 2015, 20:33:17
2 cosas para decir....

Puede que tu "printf" no sea el mismo "printf" que el otro compilador.
Buscando por el printf de stdio.h

int printf ( const char * format, ... );

es decir no se le pasa una funcion. ahi debe estar el problema.
proba hacer:

int8_t variable = printf(lcd_putc,"\f-LCD 3 pin Mode-\n* !.|.|..|.|.! *");

Y fijate el valor de variable.
Citar
On success, the total number of characters written is returned.
If a writing error occurs, the error indicator (ferror) is set and a negative number is returned.


Pues retorna -1, parece que no se puede usar de esa forma.

Mi segunda cosa a decir es que a pesar que pide definir el tipo de lcd ( me refiero a la cantidad de lineas ) no hay restriccion en el gotoxy, es decir podes seleccionar para 1 linea, pero si por casualidad pones un gotoxy a la segunda linea, va a intentar grabar en la segunda, creo que con un ifdef/ifndef podrias salvarlo o preguntando por la constante, total luego el compilador al optimizarlo va a sacar el codigo.

Lo tendré en cuenta.

Saludos!!!
Título: Re: Libreria para LCD con 3 pines y AVRStudio
Publicado por: KILLERJC en 02 de Febrero de 2015, 06:01:24
Puede que sirva...

https://github.com/adamcohen/uart-printf/blob/master/UART%20Printf/tinyprintf.c

No posee flotante, lo cual seria bueno implementarlo es agregar un nuevo case y transformar la variable de flotante a un numero legible, creo que hay codigos dentro de todos cortos para eso.
Y la otra modificar el puts de cada funcion dentro por alguna que tengas o realizar un nuevo puts

Por si se presentan dudas sobre que es el va_arg/va_start

Citar
void va_start (va_list ap, paramN);
Initialize a variable argument list
Initializes ap to retrieve the additional arguments after parameter paramN.

Citar
type va_arg (va_list ap, type)
Retrieve next argument

En fin dejo eso... Estuve viendo la libreria de TI y posee un codigo similar, nomas que agrega la posibilidad de tener un %%

Código: C
  1. case '%':
  2.                 {
  3.                     //
  4.                     // Simply write a single %.
  5.                     //
  6.                     UARTwrite(pcString - 1, 1);
  7.  
  8.                     //
  9.                     // This command has been handled.
  10.                     //
  11.                     break;
  12.                 }
Título: Re: Libreria para LCD con 3 pines y AVRStudio
Publicado por: micro_pepe en 02 de Febrero de 2015, 14:35:51
OK, muchas gracias  ;-) con ese codigo para hacer nuestro printf a medida funciona bien, lo dejo adjunto.

Faltaria hacer el float, y lo que me comentaste del lcd_gotoxy no lo tengo muy claro, he puesto ifndef, pero creo que no van por hay los tiros.

Saludos!!!