Programación PIC en C

 

Volver al índice

 

 

Un par de funciones mas que se pueden utilizar en la entrada y salida de datos serie RS232 son las funciones gets() y puts().

 

gets(string): esta función lee los caracteres que se introducen por el teclado hasta que encuentra un retorno de carro (tecla Enter). El pin asignado para la lectura de los caracteres es el que hayamos configurado en RCV. En el ejemplo de abajo el pin RD5.

 

puts(string): esta función envía la cadena de texto contenida dentro de los paréntesis al pin que hayamos configurado en el parámetro XMIT de la directiva #use RS232, en el ejemplo de abajo el pin RD4. Una vez enviada la cadena añade un retorno de carro.

 

#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_D4, RCV=PIN_D5)

 

Vamos a ver un ejemplo sencillo que utilice estas dos funciones:

 

 

 

Ejemplo uso de las funciones gets() y puts()

 

 

Comentario

En este ejemplo se ha declarado un tipo de dato que todavía no hemos visto, un array de caracteres:

 

char nombre[9];

 

Aunque veremos los tipos de datos compuestos más adelante, podemos adelantar que un array es un conjunto de variable del mismo tipo de datos. Cada una de esas variables se coloca de forma consecutiva en la memoria RAM del PIC y se les llama elementos del array. Los elementos del array se enumeran empezando por el 0, (es una característica del lenguaje C). En el ejemplo de arriba se ha declarado un array de caracteres (tipo char) y el número máximo de elementos que podemos almacenar en el es de 9. Sus elementos estarán numerados del 0 al 8. Y podemos acceder a ellos de la siguiente forma:

 

valor = nombre[0];

 

…….. = ……..[.];

 

valor = nombre[8];

 

 

El ejemplo lo único que hace es enviar un mensaje a la terminal diciéndonos que introduzcamos nuestro nombre (puede ser también una password o lo que queramos). Cuando introduzcamos el nombre y pulsemos la tecla Enter, la cadena de caracteres será guardada en el array que hemos declarado previamente y luego con la primera función prinf() mostramos el valor de la cadena de texto guardada en el array, con la segunda función prinf() mostramos el tercer carácter del nombre introducido (nombre[2]). Este será la salida de nuestro programa:

 

 

Salida de las funciones gets() y puts()

 

 

Si intentamos introducir una cadena más larga, el valor se mostrará en la terminal pero truncado.

 

Por ejemplo si intentamos introducir la cadena:

 

“Microcontroladores PIC”

 

La terminal nos mostrará:

 

Microcont

 

 

Como he dicho antes los elementos del array se almacenan en posiciones consecutivas de la memoria RAM del PIC. Esto lo gestiona automáticamente el compilador, lo mismo que cuando haces un programa en C ó en otro lenguaje de alto nivel para un PC de escritorio el programador no está preocupado de en qué posición de la memoria RAM se almacenarán las variables que declara. Pero si a pesar de ello quieres saberlo haces lo siguiente:

 

Después de compilar el ejemplo, te vas al menú compile –> Symbol Map y nos aparecerá la ventana de abajo:

 

 

Mapeo en memoria del Array

 

Donde vemos las posiciones de memoria donde se han mapeado nuestras variables. Como vemos nuestro array ha ocupado las posiciones de memoria de la 0x21 a la 0x29 de los registros GPR del PIC (en total 9 bytes), ya que los elementos que componen el Array son de tipo char que son de un byte (8 bits) cada uno.

 

Si queremos ver los valores que va tomando cada uno de los elementos del Array en tiempo de ejecución. Lo podemos hacer por medio de la ventana Watch Windows en Proteus. Si no te acuerdas de cómo se hace míralo aquí

 

Y obtendremos lo siguiente:

 

 

Valores de los elementos del Array

 

Consideraciones:

En C existe el concepto de memoria dinámica. La memoria dinámica es aquella que se puede reservar y liberar en tiempo de ejecución, es decir, durante la ejecución del programa se liberará y se asignará memoria para optimizar los recursos de la CPU, para ello se dispone de funciones como malloc() y free(). El compilador CCS también admite este tipo de funciones, para utilizarlas debemos de incluir el archivo de cabecera stdlibm.h, ya veremos un ejemplo sobre la asignación de memoria dinámica, si no utilizamos estas funciones la reserva de memoria es estática, es decir, si declaramos un array de nueve elementos el compilador le reservará memoria contigua a dicho array al compilar el programa en los registros de propósito general (GPR). Esa memoria se reserva cuando el PIC empieza a ejecutar su programa y permanece reservada hasta que desconectamos el PIC. Con todo esto quiero decir que tenemos que tener siempre claro de la memoria RAM de que disponemos, según el modelo de microcontrolador que utilicemos en nuestro proyecto, si no lo sabes consulta el data sheet del PIC que estés utilizando. Por ejemplo si en el PIC del ejemplo que hemos hecho (16f877) en vez de un array de 9 elementos declaramos uno de 100 elementos el compilador nos mostrará el siguiente error al compilar:

 

 

Salida de errores compilador CCS

 

Y como ya he dicho en alguna ocasión, utiliza el tipo de datos más pequeño posible, en el ejemplo que he puesto he declarado un array de nueve elementos, para introducir el nombre “Antonio” que tiene seis caracteres, con lo cual estoy desperdiciando dos bytes de memoria RAM, eso en un ordenador de escritorio es insignificante pero en un microcontrolador si que es importante y puede que nos quedemos sin memoria suficiente para declarar todas las variables de nuestro programa.

 

El código del ejemplo lo tenéis aquí

 

Aunque existen algunas funciones más para la entrada y salida de datos serie, las que llevamos vistas hasta ahora son las más importantes, así que el próximo día empezaremos con los operadores, indispensables para hacer operaciones con los datos que introduzcamos en nuestro programa.

 

No os olvidéis de comentar el artículo y de participar en el foro.

Un saludo y hasta el próximo día.

 

Volver al índice

 

© 2007-2017 AquiHayapuntes.com