viernes, 6 de enero de 2012

La función printf en PIC


Aquí va un corto pero interesante artículo acerca de cómo utilizar la función printf de C para escribir en un LCD utilizando el compilador HITECH-C Lite. No tengo intención ahora mismo de explicar el procedimiento para escribir en un LCD dado que necesitaría una entrada enorme. Por éso ésta entrada está orientada a todos aquellos programadores de PICs que al igual que yo se han topado con los problemas de escribir, por ejemplo, un numero decimal en un display LCD, 8 segmentos, puerto serie, etc.

En el C "de toda la vida", para imprimir algo en la salida estándar, la manera más común es echar mano de la librería stdio.h. Entre otras muchas funciones que define ésta librería se encuentra la función printf.

Un pequeño ejemplo:

#include <stdio.h>

void main(){

int miEdad = 22;

printf("Mi edad es %d", miEdad);

getchar(); // Paramos la ejecución hasta que se pulse una tecla
}


Lo que nos interesa de éste pequeño código es la línea 4. Es decir, la línea en la que aparece el printf de marras. El resultado de éste programa mostraría por pantalla el texto "Mi edad es 22".
Para refrescar la memoria de aquellos que no se acuerden del uso exacto de ésta función, como primer parámetro se envía la cadena con los tokens %, y los demás parámetros son los valores o variables que deseamos que aparezcan en lugar de cada token respectivamente. Así %d es substituido por el valor de la variable miEdad en nuestro programilla.

Una vez entendido ésto, si lo pasamos a PIC C (a partir de ahora haremos referencia de ésta manera al lenguaje utilizado para el compilador HITECH C) nos encontramos con que al compilar se muestra un error que nos viene a explicar que falta la función "putch".

Por lo que he podido deducir de mis escasas experiencias, la función printf() se encarga de construir la cadena, realizando los cálculos necesarios en los valores pasados como parámetro, y posteriormente los sustituye. Digamos que crea una cadena con el formato que queremos. A continuación, llama a la función putch() una vez por cada carácter de la cadena en cuestión. Y simplemente, la función putch() envía el carácter recibido a la salida estándar.

Aquí viene el meollo de la cuestión. En C normal, la salida estándar viene predefinida como la consola de dos, bash...etc. Generalmente es lo más común a la hora de probar los programas. Digamos que ya viene así montado, y si quieres que esa información se envíe a otro sitio tienes que modificar la salida.

En cambio, en PIC C, la función putch() viene definida como vacía. No tiene código. De ésta manera somos nosotros quienes al crear nuestro programa, decidimos a dónde van a parar nuestros datos.

Se deduce entonces de la información anterior, que para escribir (por ejemplo) en el puerto B, solo hay que hacer 3 cosas:


  1. Incluir la libreria stdio.h.
  2. Definir la función void putch(char c)
  3. Llamar a printf() de la forma normal.


Para terminar de aclarar todo ésto, un ejemplo:
/* LA IDEA ES IMPRIMIR LA CADENA "Mi edad es 22" MEDIANTE LA FUNCIÓN PRINTF EN UN LCD, Y UTILIZANDO EL FORMATO DE CADENAS TÍPICO DE C (%d) /*

#include <htc.h>
#include <stdio.h>

#define _XTAL_FREQ 8000000
#include "C:\users\Marcos\Electronica\lib\lcd.h"

void putch(char c){ // DEFINIMOS LA FUNCIÓN PUTCH
lcd_putc(c); // ENVIAMOS EL CHAR AL LCD
}

void main(void){

int miEdad = 22; // DECLARAMOS UNA VARIABLE

printf("Mi edad es %d", miEdad); // IMPRIMIMOS

while(1); // NO HACER NADA
}
Cuando utilicéis la función printf tened en cuenta que el uso de memoria se va a disparar. Sobre todo cuando
utilicéis impresión de datos en coma flotante (%f). Si teneis alguna pregunta no dudéis en guardar silencio comentar aquí abajo.

Un saludo!!

Marcos R. - @IAmRutiguer

1 comentario:

  1. si podes, seria bueno que colocaras el código de la función lcd_putc(c),

    ResponderEliminar