MICROCONTROLADOR PIC
En esta ocasión
utilizaremos el micro controlador 16f877A, que en el mercado Boliviano esta a
sus 30 a 40 Bs aproximadamente (depende
de que tan casero seas).
Los
microcontroladores PIC, tienen un uso industrial en sistemas electrónicos embedidos dedicados donde se requiera controlar procesos y
automatizar tareas. Por otro lado también hay microcontroladores de gama baja o
media que sirven para usos académicos y aplicaciones sencillas.
En resumen el
microcontrolador es un circuito integrado compuesto por un microprocesador y
componentes como memoria y ALU(Unidad Logico Aritmetica). Este conjunto puede ejecutar las
instrucciones guardadas en su memoria, claro estas instrucciones tienen que
estar grabadas en hexadecimal, algo como esto:
:1000000000308A0019280000223084008313000881
:10001000031918280130F800F701F70B0D28F80B29
:100020000C284A30F700F70B13281628800B0A28F3
:10003000080003081F398300FF30A00083161F1437
:100040009F141F159F1107309C00831300308600FA
:10005000FF3087008312A000831686018312860179
:1000600020142008831687008312071C4328831658
:100070000610831206140230A1009630A20004205C
:10008000A10B3D284E28831606108312061002305D
:10009000A1009630A2000420A10B4928302863005B
:02400E00713F00
:00000001FF
;PIC16F877A
;CRC=7B7F CREATED="31-jul-13 21:36"
Si esta explicación
no te satisface siempre puedes hecharle un ojo a Wikipedia:
http://es.wikipedia.org/wiki/Microcontrolador_PIC
http://es.wikipedia.org/wiki/Microcontrolador_PIC
PROGRAMACION DE
MICROCONTROLADORES (PIC)
Bueno, ya sabemos
lo que es un microcontrolador al menos superficialmente, y también sabemos que
podemos darle instrucciones que el ejecutara si le damos la condiciones
necesarias. Asi que ahora nos ocuparemos de la lógica bajo la que trabajara el
MICROCONTROLADOR PIC 16f877A.
Escogiendo un
lenguaje de programación.
Hay una gran variedad de opciones cuando tu quieras
programar un microcontrolador PIC. Estas son algunas.
- C --------------à CCS o C Microchip(Fabricante de PIC), o MicroC.
- Basic -----------à(Parecido al Visual Basic) En este caso PICBASIC
- Python ------------à (Muy Utilizado en entornos Linux)
Un lenguaje ni
tan difícil ni tan fácil considero que es el C en este caso CCS, del que puedes
encontrar bastante información y ayuda en foros de electrónica.
Entonces
necesitaremos este sofware PIC C Compiler:
Compilador C para convertir el archivo del programa en Hexadecimal, este
archivo hexadecimal se grabara en el microcontrolador. Editor de Codigo CCS,
con esta herramienta crearemos nuestro programa en un Lenguaje que nosotros
podamos entender.
Puedes descargarlo desde aca en
su versio 4.1.XXX
Aquí hay un chorro de info:
PROGRAMANDO EN
NUESTRO MICROCONTROLADOR
Cada
microcontrolador PIC puede ser usado para una inmensa cantidad de aplicaciones,
esta flexibilidad exije que profundizemos unos cuantos conocimientos acerca del
funcionamiento del PIC cuando a este se le energiza.
Como ya sabemos
el PIC tiene direcciones de memoria reservados para configurar el
funcionamiento y arranque. Por ejemplo el PIC 16f877A en la dirección 85h es
también llamada TRISA y con ella podemos informar al PIC que pines del puerto A
serán tratadas como salidas y que pines del puerto A serán tratada como entradas.
Pero para poder llamarla TRISA o PORTA y no 85h o XXh tenemos que incluir una librería
de nombres que nos permitirá además configurar muchos aspectos del
microcontrolador como ser el oscilador que usara, si se activara o no el
watchdog( perro guardián).
El Lenguaje CCS
tiene un archivo que nos ayudara a nombrar fácilmente a las muchas direcciones
de configuración que tiene el microcontrolador PIC llamado 16f877A.h. Como todo
lenguaje C soporta librerías asignaremos 16f877A.h en nuestro código.
PROGRAMACION
EN CSS PARA PIC 16F877A
Primero
ejecutamos nuestro Compilador C PIC
Una vez ahí empezamos
nuestro primer proyecto:
Buscamos un destino
donde colocar nuestro proyecto:
Bueno, después nos
aparecerá una ventana donde podemos configurar algunos aspectos importantes de
nuestro PIC, como ser la familia a la que pertenece y el tipo de Oscilador que
utilizara para calcular los ciclos reloj. Nosotros escogeremos el PIC 16f877A
con un Cristal de 4Mhz.
Bueno,
automáticamente se escribe una plantilla básica, y vemos en la cabecera que
esta incluido un archivo *.h, eso es una librería.

La librería se
llama como nuestro proyecto PruebaLed_16f877A.h y aquí esta el contenido de
ella:
Esta se encuentra situada en la misma carpeta de nuestro proyecto, y como pueden observar todas las configuraciones que predefinimos anteriormente se escriben en instrucciones aca.
Podemos usar este
asistente para realizar nuestro proyectos, como también escribir la configuración
en la cabecera de nuestro propio archivo PruebaLed_16f877A.c y sin usar este
archivo *.h.
Ahora empecemos
paso a paso cada parte de nuestro programa.
Como bien lo decía
al principio CCS tiene una librería que contiene tanto configuraciones y nombre
de direcciones de memoria reservadas del PIC, así que primero importaremos esa librería,
en este caso llamada 16f877A.h
Segundo paso #fuses
se refiere a algunos fusibles o banderas que podemos habilitar o deshabilitar según
requiramos en nuestro PIC.
Por ejemplo:
El "Watch
Dog Timer" o "Temporizador Perro guardián" es un artificio que
se utiliza de antiguo para evitar que los microprocesadores se queden
"colgados".
El WDT lo que
hace fundamentalmente es resetear el micro tras un periodo de tiempo
determinado. Su funcionamiento es similar a la Interrupción por Desbordamiento
de un Timer, que se produce cuando un Timer que es incrementado continuamente
pasa de su valor máximo al mínimo para comenzar de nuevo a contar. En el caso
del WDT en lugar de saltar una interrupción se genera un reset automático en el
momento de producirse dicho desbordamiento.
Por ahora no lo
usaremos asi que lo mantendremos asi:
Ahora tal y como
se quiso especificar en una librería a parte, definimos el tipo del oscilador
que se usara:
Al interior de la
instrucción delay puede especificarse HS, RC o Crystal y el valor de dicho
oscilador.
Hasta aquí el
encabezado necesario:
Agregamos un procedimiento
principal Main() clásico en el lenguaje C de la siguiente manera.
Configurando
puertos.- Tenemos que tomar en cuenta de que nuestro PIC puede exteriorizar
ordenes e interactuar con el exterior a través de sus puertos, cada PUERTO tendrá
una cantidad de PINES, a su vez cada PIN puede funcionar como una salida o
entrada para el PIC.
Este grafico nos
muestra una disposición común de un circuito con un 16f877A, como ven se tiene
4 PUERTOS, PORTA, PORTB, PORTC, PORTD y PORTE. Si se dan cuenta PORTA o RAX
solo tiene 6 PINES. La mayoría de los PINES de PORTA pueden ser usados para
leer valores analógicos. Desde AN0 a AN4, los demás puertos analógicos corresponderán
al PORTE. En esta practica solo haremos uso de dos puertos, PORTB y PORTC.
set_tris_B(0b00000000); se refiere a setear una dirección del PIC con
un byte de puros ceros, esto para definir como salidas los 8 PINES de PORTB.
set_tris_C(255);
se refiere a setear todos los PINES de PORTC con un valor de puros 1, en este
caso se hace a través de un valor de decimal 255.
Para no provocar
una salida de voltaje inesperado al inicio del funcionamiento del PIC ponemos
la instrucción:
output_B(0b00000000);
De esta manera
nos aseguramos que todos los PINES de PORTB estén en 0 logico.
Añadimos un bucle
infinito en el cual contendrá la lógica de nuestro programa, que no será mas
que una serie de instrucciones que se repetirán si cumplen las condiciones que instruyamos.
Primeramente
vamos a poner en un 1 lógico un PIN del puerto configurado como salidas en este
caso el PORTB con la siguiente instrucción:
Bueno, si
ejecutamos este código dentro el microcontrolador y pusiéramos un LED en el
PORTB el PIN 0, este no se prendería cuando se ejecute la instrucción de la línea
16.
La razón es
simple, el microcontrolador ejecuta ordenes a una razón de 4 millones de ciclos
por segundo, por tal motivo y para generar persistencia en el puerto tenemos
que agregar un tiempo de espera antes de cambiar nuevamente de estado el PIN 0
de PORTB.
Este programa tendrá
un PIN que expulsara un voltaje de 5 voltios o 1 lógico por el PORTB el PIN 0
de manera intermitente ya que aproximadamente cambiara de estado cada 300
milisegundos. Se dice aproximadamente porque cada instrucción que escribimos
ocupa algunos ciclos reloj en el tiempo de ejecución del PIC que para
cuestiones de precisión se tienen que tomar en cuenta.
Leyendo las
entradas del PIC, PORTC:
Ahora vamos a
leer una entrada en nuestro PIC, tal y como configuramos los puertos podemos
escoger cualquier PIN del PORTC desde RC0 hasta RC7:
Escogimos el PIN
0 del PORTC, asi que vamos a condicionar nuestra salida en el PORTB de la
siguiente manera:
Hasta aquí la programación, solo
nos queda compilar el programa.
Si todo va bien solo
nos falta verificar si genero los archivos que necesitamos para grabarlos en
nuestro microcontrolador PIC:
AHORA VAMOS A DISEÑAR LA SIMULACION EN PROTEUS 7.X:
En ISIS vamos a
crear un proyecto lo llamaremos como queramos y luego vamos a guardarlo en el
mismo directorio de nuestro proyecto CCS.
En el agregamos
cuatro componentes:
·
Una
resistencia genérica
·
Un
pulsador o Button
·
Un
Diodo de Luz LED
·
Un
microcontrolador PIC16f877A
Añadiendo el
pulsador
Añadiendo el
PIC16f877A:
Añades tambien una resistencia generica y un pulsador o "Button",
ARMANDO EL CIRCUITO:
Primeramente
vamos a explicar que la alimentación y tierra en un microcontrolador en PROTEUS
no mereció la pena el diseño o al menos eso es lo que parece pues las patillas
de alimentación 11 y 32 y las de tierra 12 y 31 no aparecen en el esquemático de
PROTEUS, eso no quiere decir que no estén presentes, sino solo que se obvia su conexión.
En este esquema si están presentes:
En este de Proteus no estan presentes los PINES de alimentacion
OTRO ASPECTO MUY
IMPORTANTE EN LOS PIC ES LA PATILLA VPP, esta PIN es muy importante en lo que
respecta al funcionamiento del PIC y se situa en el PIN #1 del 16f877A:
Si VPP esta en un estado de 0 Lógico o puesto a tierra(0 voltios), el PIC estará
en RESET y ninguna instrucción se ejecutara.
Si VPP esta en un estado de 1 Lógico o 5 Voltios aproximadamente, se dice
que el PIC esta habilitado para hacer correr el programa guardado de un
memoria.
Y si VPP tiene un valor de entrada de 12 Voltios aproximadamente, se dice
que el PIC esta en modo de programación, y que esta listo para que se graben
datos de programa en su memoria.
Para nuestra aplicación
definiremos el PIN VPP en estado 1 Lógico o 5 Voltios aprox, para que así corra
el programa que vamos a suministrarle mas adelante.
1.
Entonces
añadimos una fuente de alimentación PLACES>TERMINALS>POWER
2.
Modificamos
el valor de la alimentación con clic derecho > Edit Properties asignando “+5V”.
1.
Añadimos
una resistencia genérica entre la alimentación y el PIN VPP del PIC.
2.
Hacemos
las conexiones respectivas.
Bueno, si
intentas correr la animación no sucederá nada mas que un error indicándote que
no existe programa dentro el microcontrolador, así que te pido un poco mas de
paciencia que ya casi terminamos.
Ahora vamos a
incluir nuestro actuador, en este caso nuestro LED con su correspondiente
resistencia. Recordemos que el led tiene polaridad, la parte negativa de este tendrá
que dirigirse a TIERRA(GROUND) y la parte positiva con su resistencia
correspondiente dirigirse a un puerto de SALIDA que le suministre el voltaje y
corriente necesarios para su iluminación. El PIN que escogimos es el mismo que
en el programa en el PUERTOB el PIN 0, que es la patilla 33:
1.
Añadimos
una resistencia, cambiamos el valor de 10k por 300 (ohmios), que provoca una
corriente de casi 20 mA para hacer funcionar el LED.
2.
Añadimos
un LED, respetando su polaridad y lo ponemos en serie con la resistencia.
3.
Añadimos
una terminal PLACES>TERMINAL>GROUND, y hacemos las conexión necesarias
Eso en cuanto a
nuestra salida del microcontrolador.
En nuestro
programa también nos referimos a una entrada cuyo valor lógico verificábamos con
una condicional, esa condición tiene dos estados, 1 o 0, falso o verdadero y también
entendido como +5 Voltios o 0 Voltios(GROUND). Entonces necesitamos un
componente electrónico que nos de la capacidad de permutar entre esos dos
estados. Por ello seleccionamos nuestro Button y lo colocamos de la siguiente
manera:
1.
Añadir
el Button a el esquema cerca del PIN 15 correspondiente a PORTC 0.
2.
Crear
una fuente de “+5V” cerca suyo y hacer las siguientes conexiones.
Esto permitirá que fluya 5
Voltios con dirección hacia el PIN RC0 o patilla 15 del PIC. Pero no podemos
asegurar que como esta actualmente el circuito tendrá un real y verdadero 0 lógico,
ya que cuando el Button no estará apretado el PIN RC0 estará al aire, sin conexión
alguna. Por ello para que el PIN RC0 o patilla 15 este en cero Lógico se coloca
una resistencia en serie desde la patilla 15 hasta GROUND.
La resistencia
que acabamos de colocar se le denomina como PULLDOWN, y nos asegura un 0 lógico
mientras no este presionado el componente Button.
CIRCUITO
OSCILADOR.- Por ultimo vamos a agregar(aunque no es necesario en la simulación)
un oscilador de cristal de 4 Mhz que funciones como reloj de nuestro
microcontrolador.
Agregamos dos
componentes de nuestra librería:
CRYSTAL,
Osiclador de cristal de valor configurable.
ARMADO DE
CIRCUITO OSCILADOR:
1.
Añade
una PALCE>TERMINAL >GROUND.
2.
Añade
Dos Capacitores genéricos de 22 picofaradios cada uno.
3.
Añade
un Crystal y cambia el valor 4 Mhz.
4.
Haz
las conexiones respectivas.
Modificamos el
valor del CRYSTAL a 4 Mhz
Esto para que te
familiarices con el oscilador, repito este oscilador no es necesario para la simulacion. Ya que el microcontrolador tiene un campo donde puedes asignar esos 4 Mhz al propio PIC y no asi e este
circuito, Para ello te vas a Properties del microcontrolador y Modificas el
campo “Frecuency CLock”de 1 Mhz a 4 Mhz.
El Circuito quedaría
de la siguiente manera:
GRABACION DE
NUESTRO PROGRAMA EN EL PIC
Si este fuera un
verdadero PORTOBOARD nos veríamos en la necesidad de conseguir un GRABADOR de
PIC’s, para poder grabar el archivo hexadecimal que generamos desde CCS y
grabarlo en la memoria del PIC 16f877A. Por suerte nada de ello necesitamos por
el momento, ya que PROTEUS logra emular la interpretación del archivo
hexadecimal que tenemos y lo ejecuta como si estuviera grabado en la memoria
del microcontrolador, acaso no es fantástico.
Vamos a las
propiedades de nuestro MICROCONTROADOR y veremos algo como esto:
Vamos con el
explorador hasta nuestro directorio donde guardamos nuestro programa en CSS, en
dicho directorio se encontrara un archivo hexadecimal *.hex y otro *.cof, en
este caso el archivo COF es para uso de depuración, podemos en esta simulación usar
cualquiera de los dos como si estuviéramos grabando el microcontrolador.
Seleccionamos el
archivo y quedaría asi:
Esito seria,
ahora pónganle play a la animación y crucen los dedos.
El programa dice
que mientras esta apretado el Button, el LED pasara a estado HIGH(ALTO) que será
5 Voltios los cuales irán a la resistencia y al LED iluminándose como quisimos
desde un principio.
Si tienes alguna
Duda no olvides revisar la documentación que tiene CSS para su lenguaje.
Si no se enciende
el LED comprueba que este con una resistencia R2 mayor a 1 kiloOhmio.
Para el próximo tutorial
tenía previsto hacer el Puerto SERIAL pero , puerto serial es una tecnología en
extinción, así que ustedes propongan si quieren puerto SERIAL o ya se animan
por el puerto USB.