Академический Документы
Профессиональный Документы
Культура Документы
PIC con C
Bliblioman
Programación C para microcontroladores PIC
www.aquihayapuntes.com
[Escribir el número de
teléfono]
17/02/2010
Programación PIC en C
¿Quien puede sacar provecho de este curso?. Este curso es para ti si:
2
Programación PIC en C
http://www.ccsinfo.com/ccsfreedemo.php
3
Programación PIC en C
Una vez que tenemos nuestro .HEX tendremos que comprobar que
funciona realmente para ello tenemos dos opciones:
4
Programación PIC en C
http://www.labcenter.co.uk/download/prodemo_download.cfm
Otra cosa que quiero aclarar es que el curso va a ser todo lo práctico
que pueda y la forma de proceder será
5
Programación PIC en C
Sentencias de salto.
Sentencias goto, break, continue.
Sentencia return.
Funciones.
Punteros.
Arrays.
Cadenas de caracteres.
Funciones para manipular cadenas de caracteres.
o Función strcyp (cadena 1, cadena 2).
o Función strcat (cadena 1, cadena 2).
o Función strlen (cadena).
o Función strcmp (cadena 1, cadena 2).
Arrays Multidimensionales.
Arrays de cadenas.
Punteros y Arrays.
Array de punteros.
Relación entre Arrays y Punteros.
Aritmética de Punteros y errores mas comunes.
Estructuras.
Estructuras y Punteros.
Paso de Estructuras como argumentos a funciones.
Uniones.
Enumeraciones.
Uso de la palabra clave typedef.
Campos de bits
6
Programación PIC en C
7
Programación PIC en C
8
Programación PIC en C
#use rs232
(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) esta
directiva es para la comunicación del PIC con otro dispositivo
vía RS232, por ejemplo un ordenador, en ella se encuentran
definidas los prototipos de las funciones de entrada y salida
como printf().
9
Programación PIC en C
10
Programación PIC en C
11
Programación PIC en C
De todos estos archivos los que mas nos interesa son los que están
marcados en la figura de arriba. El archivo Ejemplo1.hex es el que
tenemos que utilizar para programar el PIC y el que termina con
extensión .cof lo utilizaremos para cargarlo en el simulador Proteus y
poder simular el programa paso a paso, entre otras posibilidades muy
útiles a la hora de depurar nuestro código.
12
Programación PIC en C
13
Programación PIC en C
14
Programación PIC en C
15
Programación PIC en C
16
Programación PIC en C
Si ahora hacemos clic sobre el botón Play se nos abrirá una terminal
al estilo MSDos donde nos mostrará la salida de nuestro programa:
17
Programación PIC en C
18
Programación PIC en C
19
Programación PIC en C
20
Programación PIC en C
21
Programación PIC en C
Ahora nos queda añadir nuestro código fuente para ello vamos al
menú seleccionamos Source Add/Remove Source files…
22
Programación PIC en C
23
Programación PIC en C
int i;
int i=5;
tipo nombre_variable1,nombre_variable2,....;
Hay que tener en cuenta que la línea tiene que acabar en punto y
coma.
Los tipos de datos básicos que utiliza nuestro compilador son los
siguientes:
24
Programación PIC en C
Todos los tipos excepto float son por defecto sin signo, aunque
pueden llevar el especificador unsigned ó signed y su rango de
valores será el que corresponda a su tipo básico.
Estos son los tipos básicos, también están los tipos de datos
compuestos como Enumeraciones, Estructuras y Uniones que están
formados por una combinación de los básicos y que los veremos más
adelante.
Las variables según el lugar en que las declaremos pueden ser de dos
tipos: globales o locales.
25
Programación PIC en C
Bueno ya está bien de teoría vamos hacer un ejemplo donde vamos a declarar y a usar
varios tipos de variables:
26
Programación PIC en C
El compilador utiliza 8 bits para representar los números enteros sin signo con lo
cual podemos representar desde el 0 hasta el 255 que corresponde en binario al
número: 11111111. Por lo que al asignarle a la variable el valor 256 el
compilador no generará un error pero el dato guardado será erróneo, nos
mostrará 0 que es el siguiente valor a 255 en binario.
Para los números enteros con signo también se utilizan 8 bits pero el último bit
se reserva para el signo, con lo que se podrán representar los números desde: -
127 al 127.
El tipo short se utilizará para las variables de un bit y tendrán como valor 0 ó 1.
Para los números tipo long int se reservan 16 bits sin signo con lo que su rango
va de 0 a 65535
Para el tipo signed long se reservan también 16 bits pero se utiliza uno para el
signo, por lo que se tiene un rango que va desde -32767 a 32767.
El tipo float define un número de 32 bits en punto flotante. y con el podremos
representar los números reales.
El tipo char se utiliza para almacenar los caracteres, utiliza 8 bits sin signo
suficientes para representar los 256 caracteres del código ASCII.
Los símbolos %D, %lu, %ld, %c le indica a la función printf en que formato
tiene que representar el número. En la ayuda del compilador vienen los
diferentes especificadores que hay para los diferentes tipos de datos. A lo largo
de los siguientes ejemplos se irán mostrando algunos más.
27
Programación PIC en C
CONSIDERACIONES: Hay que intentar siempre utilizar el tipo de dato que menos
memoria ocupe dentro de los valores que pueda utilizar la variable. Si abusamos de los
tipos grandes para almacenar valores pequeños nos quedaremos sin memoria y en los
programas grandes es un dato que tenemos que tener en cuenta.
Nota: en los ejemplos que tengan poco código fuente como este y para que el formato
de texto salga con los mismos colores que utiliza el compilador utilizaré imágenes para
mostrar el código y en la sección de descargas iré incluyendo los ejemplos del curso
para que todo el que no quiera teclearlos a mano se los pueda descargar. Otra cosa no
incluiré el circuito en Proteus ya que es el mismo para todos los ejemplos a excepción
de que en algunos ejemplos pueda ir cambiando el tipo de PIC.
Poniendo doble barra (la que hay encima del 7), esta forma es
práctica para comentar una línea.
Ejemplo:
Ejemplo:
28
Programación PIC en C
Bueno, todo esto para el que tenga una idea de programación seguro
que ya lo sabe, pero como dije al principio voy ha intentar que este
curso le sirva también al que no tenga ni idea de programación
aunque, en este caso, hay que decir también si se es honesto, que
aprender un lenguaje de programación al igual que aprender un
idioma nuevo supone un esfuerzo considerable y no vasta con leerse
un libro de C y decir ¡ya soy un programador de C!, bajo mi modesta
opinión lo que hay que hacer es practicar mucho, es decir teclear
mucho código compilarlo y comprobar que funciona como nosotros
queremos que lo haga, al principio cometeremos muchos errores pero
el descubrir cual es la causa del error nos servirá para aprender mas
todavía y sobre todo no desanimarse a la primera de cambio cuando
algo no funcione. La constancia y la perseverancia son las claves del
éxito para conseguir cualquier objetivo, no solo el aprender a
programar PIC en C. Y ya está bien porque menudo rollo estoy
soltando, así que vamos a empezar con lo que era el tema de este
capitulo: las constantes.
Ejem:
29
Programación PIC en C
Ejem.
#define MAXIMO 30
#define MAXIMO = 30
Decimal
Ejemplo: 222
30
Programación PIC en C
Ejemplo: 0x2A
Ejemplo:
0b00001011
Este último formato es muy útil, por ejemplo el PIC dispone de unos
registros que sirven para configurar los puertos del PIC como
entradas de datos o salida de datos, por defecto vienen configurados
como entradas y si quiero utilizar algún pin como salida porque
quiero utilizarlo para encender un LED o lo que sea, tengo que poner
a cero dicho registro. En el formato binario se ve fácilmente que
valores se le va asignar al registro, teniendo en cuenta que los
registros empiezan por 0.
31
Programación PIC en C
32
Programación PIC en C
Como vemos aparte de poder ver el estado de los registros SFR del
PIC podemos ver el estado de la memoria EPROM del PIC, El
contenido de la memoria de programa (donde se encuentra grabado
de forma permanente nuestro programa ), el estado de PILA (útil
cuando se trabaja con interrupciones y funciones), otra ventana nos
muestra el estado de la memoria RAM reservada a los datos ó
registros de propósito general (GPR) en formato hexadecimal y otra
donde podemos ver el estado de las variables que tenemos activas en
ese momento, recordar que si utilizamos variables locales por
ejemplo dentro de una función, estás se destruirán al salir de la
función. Pero todo esto como he dicho lo tenemos cuando estamos
ejecutando nuestro programa en el modo paso a paso ó tenemos
nuestro programa en pausa.
33
Programación PIC en C
Pero Proteus nos proporciona otro método para ver el estado de las
variables cuando estamos ejecutando nuestro programa ya sea en
modo Run ó en modo paso, es la ventana Watch Window y podemos
acceder a ella por medio del menú Debug --> Watch Windows.
#include <16F84A.h>
#use delay(clock=4000000)
#fuses XT,PUT,NOWDT
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_B4,
RCV=PIN_B5)
int x;
int y;
void main() {
x,y=0;
34
Programación PIC en C
while(TRUE)
{
if (x<=9)
{
x++;
delay_ms(500);
//printf("x = %d.\r",x);
}
else
{
if (y<=9)
{
y++;
delay_ms(500);
//printf("y = %d.\r",y);
}
}
}
}
Esto hará que nos aparezca el archivo Symbol Map en modo lectura,
en este archivo podemos ver en qué posición de memoria se
guardarán las diferentes variables que tengamos declaradas en
nuestro programa, este archivo se actualizará en cada compilación
que hagamos.
35
Programación PIC en C
36
Programación PIC en C
Una vez añadidas las variables podemos ver el valor que van
tomando mientras ejecutamos nuestro programa en la ventana Watch
Windows, según se muestra en la figura de abajo:
37
Programación PIC en C
Descargas --> Apuntes --> Electrónica --> Proteus --> Uso de Watch Windows en
Proteus.zip
38
Programación PIC en C
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:
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.
39
Programación PIC en C
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:
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
40
Programación PIC en C
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.
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
41
Programación PIC en C
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
42
Programación PIC en C
Ejemplo:
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.
43
Programación PIC en C
Ver vídeo
2º Ejemplo
44
Programación PIC en C
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.
Vamos a continuar con las funciones disponibles en CCS para la entrada y salida de
datos a través del puerto serie RS-232. Hasta ahora solo hemos visto que con la función
printf(), podemos enviar datos formateados a través del pin que hayamos seleccionado
en la directiva:
#use RS232(BAUD=9600,BITS=8,PARITY=N,XMIT=PIN_D1,RCV=PIN_D2)
En este caso los datos saldrán por el pin RD1 del PIC. Pero ¿de que funciones
disponemos para recibir datos desde fuera hacia nuestro PIC?. El que haya programado
45
Programación PIC en C
Estas funciones esperan un carácter por la patilla del PIC que hayamos definido en la
directiva #use RS232 con el parámetro RCV. En el caso del ejemplo de arriba, los datos
serán recibidos por el pin RD2 del PIC.
Pues vamos a ver nuestro primer ejemplo acerca del uso de estas funciones:
Comentario:
46
Programación PIC en C
ch=getch()
Que esperará hasta que pulsemos una tecla y almacenará su valor en la variable ch.
La siguiente instrucción:
Después se repite el proceso dos veces más, pero esta vez utilizando las
funciones getc() y getchar()
Al utilizar solo la variable ch, el valor de la nueva tecla pulsada sobrescribirá el valor
anterior de la variable.
47
Programación PIC en C
Bien, hay que decir que el programa finalizará al llegar a la última sentencia incluida en
la función main(). Para que el programa termine cuando nosotros queramos tenemos
que incluir como mínimo un bucle y establecer una condición para que podamos salir de
él, vamos a ver esto con otro ejemplo:
En este ejemplo se irán mostrando en la terminal las teclas que vayamos pulsando por el
teclado hasta que pulsemos la tecla „n‟ momento en el cual finalizará el programa.
48
Programación PIC en C
49
Programación PIC en C
Comentario
char nombre[9];
valor = nombre[0];
50
Programación PIC en C
…….. = ……..[.];
valor = nombre[8];
51
Programación PIC en C
“Microcontroladores PIC”
Microcont
52
Programación PIC en C
Y obtendremos lo siguiente:
Consideraciones:
53
Programación PIC en C
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.
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.
54
Programación PIC en C
Operador Descripción
+ Suma
- Resta
* Multiplicación
/ División
% Módulo (Resto de una división entera)
++ Incrementa en uno el valor del operando
Decrementa en uno el valor del
--
operando
Operador Descripción
< Menor que
> Mayor que
<= Menor o igual que
>= Mayor o igual que
== Igual a
¡= Distinto de
Operador Descripción
+= Asignación de suma. x+=y es lo mismo que x=x+y
-= Asignación de resta. x-=y es lo mismo que x=x-y
*= Asignación de multiplicación. x*=y es lo mismo que x=x*y
/= Asignación de división. x/=y es lo mismo que x=x/y
55
Programación PIC en C
Operador Descripción
! NO lógico
&& Y lógico
|| O lógico
Operador Descripción
Negación de bits (complemento a
~
1)
& Y de bits (AND)
| O de bits (OR)
^ O exclusivo de bits (XOR)
>> Desplazamiento a la derecha
<< Desplazamiento a la izquierda
56
Programación PIC en C
Operador Descripción
& Operador de dirección
* Operador de inderección
-> Acceder a los miembros de una estructura por medio de punteros
Ejemplo:
57
Programación PIC en C
Ejemplo:
a*b+c/d-e
58
Programación PIC en C
1. a*b resultado = x
2. c/d resultado = y
3. x+y resultado = z
4. z-e
Ejemplo:
a*(b+c)+d
1. b+c resultado = x
2. a*x resultado = y
3. y+d
Para conocer bien los resultados que se obtienen al utilizar cada uno
de los operadores, lo mejor es practicar con ellos. Vamos a ver un
ejemplo donde se muestra el uso de algunos de ellos:
59
Programación PIC en C
60
Programación PIC en C
Para saber el rango de valores admisible por cada función repasa los
tipos de datos
á \xa0
é \x82
í \xa1
ó \xa2
ú \xa3
Á \xb5
É \x90
Í \xd6
61
Programación PIC en C
Ó \xe0
Ú \xe9
ñ \xa4
Ñ \xa5
¿ \xa8
SENTENCIAS REPETITIVAS:
62
Programación PIC en C
63
Programación PIC en C
Evalúa la expresión.
Si es falsa, continua la ejecución tras el bloque de sentencias.
Si es verdadera entra en el bloque de sentencias asociado al
while.
Ejecuta dicho bloque de sentencias, evaluando de nuevo la
expresión y actuando en consecuencia.
64
Programación PIC en C
Comentario
65
Programación PIC en C
66
Programación PIC en C
Comentario
true es una constante booleana que equivale a 1 ó verdadero. Por tanto la evaluación del
bucle siempre será cierta y no habrá manera del salir de él. El programa estará siempre
esperando a que pulses una tecla y mostrará el valor de la tecla pulsada en la terminal.
Bucle for()
67
Programación PIC en C
68
Programación PIC en C
Comentario
1º bucle for:
69
Programación PIC en C
2º bucle for
Bucle for con varias variables de control, las variables tienen que ir
separadas por comas. En este caso tenemos las variables x e y,
aunque podemos poner todas las que queramos, ambas variables son
inicializadas dentro de la sentencia for.
3º bucle for
Cuando el bucle for se escribe sin cuerpo sirve por ejemplo para
generar retardos, esta posibilidad la utilizaremos poco con este
compilador ya que incluye funciones específicas de retardo.
4º bucle for
70
Programación PIC en C
5º bucle for
71
Programación PIC en C
Bucle do-while()
72
Programación PIC en C
Comentario
Fijaros en la orden if que aparece dentro del cuerpo del bucle. Esto
se permite porque las estructuras de control se pueden anidar unas
dentro de otras.
73
Programación PIC en C
If
74
Programación PIC en C
if (x=1)
Sentencia If…Else
75
Programación PIC en C
Ejemplo:
Comentario
76
Programación PIC en C
77
Programación PIC en C
78
Programación PIC en C
79
Programación PIC en C
Sentencia switch
80
Programación PIC en C
81
Programación PIC en C
82
Programación PIC en C
Comentario
83
Programación PIC en C
84
Programación PIC en C
www.aquihayapuntes.com
85