Programación PIC en C

Volver al índice

 

Aunque no hemos visto el tema de las funciones todavía,  pero ya que estamos utilizando esta función muy a menudo, vamos a ver alguna de las posibilidades que nos ofrece. El que tenga conocimientos del lenguaje C sabrá que para utilizar esta función que pertenece al estándar ANSI de C hay que incluir previamente el archivo de cabecera #include <stdio.h>, pero esto con el compilador PCW de CCS no funciona, en este compilador esta función está definida en la directiva:


#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_B1,RCV=PIN_B2)

 

Esto quiere decir que cada vez que queramos utilizar la función printf tenemos que haber incluido previamente esta directiva, que posibilita la comunicación del PIC con otro dispositivo utilizando el protocolo de comunicación serie RS232, además de la función printf esta directiva permite el uso de otras funciones para la entrada y salida de datos serie como: getc, getchar, gets, puts y kbhit que iremos viendo poco a poco, pero la más importante para la salida de datos sin duda es printf, porque nos permite formatear la salida de esos datos de la forma que nosotros queramos.

 

Como vemos la directiva #use RS232 admite una serie de parámetros que son los que van entre paréntesis separados por comas, estos son los siguientes:

 

  • BAUD con este parámetro establecemos la velocidad en baudios a la que queremos que se transmitan los datos por el puerto serie, 9600 es lo normal.
  • BITS número de bits que utilizaremos en la transmisión, el estándar establece que pueden ser 8 ó 9, para la comunicación con microcontroladores con 8 son suficientes.
  • PARITY nos permite utilizar un bit de paridad para la comprobación de errores, está opción la dejamos a No.
  • XMIT está opción nos configura porque patilla del PIC saldrán los datos, está opción junto con la siguiente sí que la tendremos que cambiar a nuestras necesidades.
  • RCV nos configura porque patilla del PIC se recibirán los datos. En el ejemplo, los datos se transmiten por el PIN RB1 y se reciben por RB2.

 

La forma de hacer la llamada a la función printf es la siguiente:

 

printf(Nombre Función, Cadena de caracteres , valores);

 

Como vemos la función printf también admite parámetros que podremos utilizar para formatear el texto de salida. Vamos a ver cuáles son:

 

El primero es opcional y es el nombre de una función, si no lo ponemos los datos se transmitirán vía RS232 a través de los pines que hayamos configurado en la directiva #use RS232.

El segundo parámetro es una cadena de caracteres encerrada entre comillas dobles.

Y el tercero son datos o nombres de variables cuyo valor queremos que se muestren. Vamos a ver todo esto con ejemplos que es como mejor se ven las cosas:

 

1º Ejemplo:

 

#include <16F877.h>
 #use delay(clock=4000000)
 #include <LCD.C>
 #use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_B1,RCV=PIN_B2)
void main()
 {
 int i1=9;
 lcd_init(); //función de inicialización del LCD
//Mostramos una cadena en la terminal
 printf("Esto es una cadena\r");
 
 //Mostramos una cadena de texto junto con el valor de una variable    
 //en la terminal.
 printf("El valor de la variable i1 es: %d",i1);
 
 //Mostramos el valor de la variable por el LCD
 printf (lcd_putc,"El valor de i1 es: %d",i1);

 }

Comentario:

En este primer ejemplo vamos a ver el uso de la función printf utilizando diferentes parámetros. Como vamos a utilizar la librería que incluye el compilador para el manejo de un LCD tenemos que incluir la directiva:

 

#include <LCD.C>

 

Declaramos una variable i1 de tipo entero que nos va a servir para mostrar su valor en la terminal y en un LCD.

Cuando utilicemos la librería LCD.C y antes de utilizar cualquier otra función incluida en la librería tenemos que llamar a la siguiente función que sirve para inicializar el LCD.

 

lcd_init();

 

En la primera llamada a la función printf como parámetros solo incluimos una cadena de caracteres constante que termina en (\r), esa barra invertida junto con la r se le llama secuencia de escape y le está diciendo al compilador que al final de la cadena introduzca un retorno de carro (tecla enter). Las secuencias de escape se utilizan para representar caracteres o acciones especiales.

 

printf("Esto es una cadena\r");

 

En la tabla de abajo se muestran las secuencias de escape que tenemos disponibles para utilizar con la función printf:

 

\r
Retorno de carro
\t
Tabulador
\'
Comilla simple
\"
Comillas dobles
\\
Barra invertida
\?
Símbolo de interrogación
\0
Caracter nulo
\%
Símbolo Tanto por ciento
\b
Retroceder un caracter

 

Vamos con la segunda llamada a la función:

 

printf("El valor de la variable i1 es: %d",i1);

 

En este caso tampoco está definido el primer parámetro, por tanto, al igual que en la primera llamada a la función, los datos se enviaran por el puerto serie al pin que hayamos definido en la directiva #use RS232, en esta llamada vemos que tenemos la cadena de caracteres limitada por las comillas dobles y separado por una coma, como tercer parámetro el nombre de la variable i1 que habíamos declarado previamente. En la cadena de caracteres vemos que aparece el carácter de % seguido de la letra d, ese es un carácter especial para la función y lo que le indica a la función es que en esa posición muestre el valor de la variable i1, la d le indica a la función que represente ese valor en formato de número entero. Podemos representar el valor de la variable en diferentes formatos según se muestra en la tabla de abajo:

 

c
Caracter
s
Cadena ó caracter
u
Entero sin signo
d
Entero con signo
Lu
Entero largo sin signo
Ld
Entero largo con signo
x
Entero Hexadecimal (minúsculas)
X
Entero Hexadecimal (mayúsculas)
Lx
Entero largo Hexadecimal (minúsculas)
LX
Entero largo Hexadecimal (mayúsculas)
f
Número real en coma flotante con truncado
g
Número real en coma flotante con redondeo
e
Número real en formato exponencial
w
Entero sin signo con decimales insertados. Especifica dos números para n. La 1ª cifra indica el total y la 2ª el número de decimales

 

Si quisiésemos mostrar el valor de más de una variable lo haríamos de la siguiente forma:

 

printf("El valor i1 es: %d el de i2: %d y el de i3: %d",i1,i2,i3);

 

Vamos con la última llamada a la función del 1º ejemplo:

 

printf (lcd_putc,"El valor de i1 es: %d",i1);

 

En esta llamada hemos incluido el primer parámetro y hemos puesto el nombre de la función lcd_putc, está función está definida en la librería LCD.C que trae el compilador para ayuda del manejo de los dispositivos LCD y que hemos incluido en nuestro programa por medio de la directiva #include <lcd.c>, vemos que la librería está encerrada entre los símbolos de <> esto le indica al compilador que busque la librería en el directorio en que se instalo el compilador, si copiáramos esa librería en otro directorio tendríamos que indicarle la ruta completa, pero esta vez encerrada entre comillas dobles.

 

 

Ejemplo:

 

#include “C:\Ejemplos de C\lcd.c”

 

Pues bien ahora la función printf no enviará los datos al puerto serie, sino a la función lcd_puct  que será la encargada de enviárselos al LCD, esta función por defecto envía los datos al puerto D del PIC, pero accediendo a la librería se puede modificar el puerto fácilmente.

 

Aquí tenéis un video demostrativo del ejemplo:

 

 

 

2º Ejemplo

 

2 Ejemplo sobre el uso de la función prinf()

 

Salida del programa:

 

 

Circuito ejemplo 2 función printf()

 

Comentario del programa:

  • El especificador de formato %x indica al sistema que escriba en hexadecimal (base 16) el valor sustituido.
  • El ejemplo también escribe el carácter 'A', apoyándose en cuatro formas distintas de representaciones iníciales. En todos los casos se almacenará el mismo valor numérico, pero son diferentes las representaciones usadas.
  • El carácter (A) sale en la terminal en una línea diferente cada vez que se imprime, eso es debido a la secuencia de escape (\r) utilizada.
  • Observar que el ejemplo se ha hecho sobre el PIC 16f84 que no dispone de una USART hardware para la comunicación serie , pero sin embargo el programa se ha ejecutado correctamente, eso es debido a que la comunicación serie se ha establecido por software  por medio de las librerías implementadas en el compilador PCW.

 

Volver al índice

 

© 2007-2017 AquiHayapuntes.com