En la siguiente actividad, vamos a poner a prueba a nuestro Programador PICKIT2, grabando un microcontrolador muy conocido y utilizado, debido a su simplicidad y practicidad. Estamos hablando del PIC16F84, un microcontrolador de 8 bits de Microchip.
El mismo cuenta con 18 pines; 2 puertos de entrada y salida, A y B respectivamente. El puerto A, cuenta con 5 pines, mientras que el B cuenta con 7. Es decir, que de 18 pines, tenemos 12 disponibles para nuestros propósitos.
Distribución de pines
Para grabar el programa, se utilizan 5 de los 6 pines que nos provee la salida del programador. Estos corresponden a los siguientes pines:
- VPP: La tensión de programación corresponde al pin MCLR del uC, es decir el pin 4.
- VDD: Va conectado directamente al pin 14 del uC.
- GND: Se conecta al pin 5 del uC (Vss).
- PGD: Se conecta al pin 7 del puerto B, es decir al pin 18 del uC.
- PGC: Se conecta al pin 6 del puerto B, es decir al pin 17 del uC.
Es importante no equivocarse en realizar esta conexión, ya que de lo contrario el software que utilicemos para grabar el microcontrolador no pueda grabarlo efectivamente en él, o peor aún puede dañar el uC.
El siguiente es un video demostrativo de como programar un microcontrolador con el PICKIT2.
Como lo muestra el video, en primer lugar leemos el dispositivo con el botón "Read", para comprobar efectivamente que el PIC16F84 está conectado. Luego de eso, importamos el archivo .hex, este representa al programa que queremos grabar en el uC. Este no puede ser editado directamente sin tener los códigos fuente con el que se produjo.
Luego de haber importado el .hex, procedemos a grabar el microcontrolador con el botón "Write". El tiempo que toma grabarlo está relacionado con la complejidad del .hex, de todas maneras suele ser un tiempo relativamente corto. Finalizada la grabación, nos debe aparecer un cartel verde diciendo "Programming Succesful", esto quiere decir que se dio por terminada la grabación y se puede desconectar el microcontrolador sin ningún problema.
Pero, a todo esto, ¿Cómo desarrollamos nuestro propio programa para grabarlo en el PIC?
En nuestro caso, utilizaremos dos de las múltiples opciones que hay. Usaremos el lenguaje ensamblador, y el lenguaje C, cada uno con su propio software. Para el lenguaje ensamblador usaremos el MPLab, mientras que para el C usaremos el PIC CCS.
Uso del PIC CCS Compiler
Para comenzar un nuevo proyecto con el Compilador PIC CCS, tendremos que utilizar el "PIC Wizard". Al seleccionar el icono, nos aparecerá una ventana que nos ayudará bastante para realizar las configuraciones iniciales, permitiendonos luego trabajar en el código. Esta parte es vital, ya que afecta al funcionamiento del microcontrolador, así como del código en si. Es muy importante tratar de crear una carpeta propia por cada proyecto, para así mantener un régimen de orden y no perdernos entre nuestros propios programas.
Seleccionamos la opción "PIC Wizard", creamos una nueva carpeta y nombramos al proyecto.
Seleccionamos el dispositivo a programar. Para el PIC16F84, las configuraciones básicas son las del oscilador, el WDT (Watch Dog Time), la protección del código y el Power Up Timer.
En Communications, destildamos la opción de usar el "RS-232", y en "I/O Pins", seteamos los pines de los puertos A y B.
Confeccionamos el código, y finalizado le damos a la opción "Build All". Esto junta al archivo .h (Header), con el .c, para generar los "Output Files"
Como vemos, abajo nos indica la cantidad de memoria ROM y RAM usada y la cantidad de errores y advertencias. Los "Output Files" son los mostrados en la imagen, véase que obtuvimos el famoso .hex, y con ese archivo luego vamos a grabar el microcontrolador.
Código fuente en C:
#include <Test.h>
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
while(true){
output_low(LED);
delay_ms(200);
output_high(LED);
delay_ms(200);
}
}
Uso del MPLAB
Para comenzar un nuevo proyecto en MPLAB, vamos a la barra de herramientas superior a la opción "File", y luego "New". Se nos abrirá una ventana del editor de texto, donde podremos escribir nuestro código. Luego de haberlo terminado, volvemos a "File", y le damos a "Save As..", creamos una nueva carpeta, y guardamos el archivo. En lo posible siempre guardaremos el archivo, la carpeta y sus ficheros con el mismo nombre, para evitar confusiones, y lo cambiaremos cada vez que realizamos un nuevo código, así como utilizar otra carpeta.
IMPORTANTE: Seleccionar la opción "Configure", y "Select Device", en la barra de herramientas, para elegir el microcontrolador con el que vamos a trabajar, para no tener problemas más tarde con el ensamblado y la grabación.
En mi caso, cree el directorio "Ejercicios", y en el guardamos el fichero fuente con el nombre "Ejercicio1.asm". Es importante que tenga la extensión .asm, para identificar al archivo y poder ensamblarlo correctamente.
Luego de haber guardado el archivo, vamos a la barra de herramientas nuevamente y ahora a la opción "Project", le damos a "New", y nos aparecerá una ventana para nombrar el proyecto y seleccionar la carpeta correspondiente. Le colocamos el nombre de "Ejercicio1", y seleccionamos la carpeta de "Ejercicios" que habíamos creado previamente para trabajar en ella.
Después de darle al "OK", se nos cerrarán todas las ventanas que estaban abiertas. Para este punto debemos ir a la barra de herramientas nuevamente, ir a "View" y "Project". Una pequeña ventana aparecerá, con varios directorios. Hacemos click derecho en el de "Source Files", y seleccionamos la opción de "Add File".
Seleccionamos el archivo fuente que habíamos creado anteriormente, y veremos como el código tomó distintos colores de acuerdo a las directivas, etiquetas, instrucciones, etc. Ahora procederemos a ensamblar el código, para ello vamos arriba a la barra de herramientas a "Project" y le damos a la opción "Build All". Nos aparecerá una nueva ventana (Output), en la cual nos aparecerá un log del proceso de ensamblado, para saber si hubo errores o si el .hex se generó correctamente.
Luego pasamos a la parte de simulación, vamos a la barra de herramientas en la opción "View", vamos abajo y seleccionamos "Watch". Se nos abre una pequeña ventana, donde podremos ver el estado de los SFR, agregamos los más importantes (PORTA, PORTB, TRISA y TRISB), y por sobre las columnas hacemos click derecho para seleccionar que datos deseamos ver del SFR, y seleccionamos "Symbol", "Value", "Decimal" y "Binary", para interpretarlos mejor.
Hecho esto, procedemos a abrir el simulador propiamente dicho. Vamos a la barra de herramientas en la opción "Debugger", vamos a "Select Tool" y "MPLAB SIM". Nos aparecerá una pequeña barra de herramientas en la parte superior, con varias opciones:
IMPORTANTE: Seleccionar la opción "Configure", y "Select Device", en la barra de herramientas, para elegir el microcontrolador con el que vamos a trabajar, para no tener problemas más tarde con el ensamblado y la grabación.
En mi caso, cree el directorio "Ejercicios", y en el guardamos el fichero fuente con el nombre "Ejercicio1.asm". Es importante que tenga la extensión .asm, para identificar al archivo y poder ensamblarlo correctamente.
Luego de haber guardado el archivo, vamos a la barra de herramientas nuevamente y ahora a la opción "Project", le damos a "New", y nos aparecerá una ventana para nombrar el proyecto y seleccionar la carpeta correspondiente. Le colocamos el nombre de "Ejercicio1", y seleccionamos la carpeta de "Ejercicios" que habíamos creado previamente para trabajar en ella.
Después de darle al "OK", se nos cerrarán todas las ventanas que estaban abiertas. Para este punto debemos ir a la barra de herramientas nuevamente, ir a "View" y "Project". Una pequeña ventana aparecerá, con varios directorios. Hacemos click derecho en el de "Source Files", y seleccionamos la opción de "Add File".
Seleccionamos el archivo fuente que habíamos creado anteriormente, y veremos como el código tomó distintos colores de acuerdo a las directivas, etiquetas, instrucciones, etc. Ahora procederemos a ensamblar el código, para ello vamos arriba a la barra de herramientas a "Project" y le damos a la opción "Build All". Nos aparecerá una nueva ventana (Output), en la cual nos aparecerá un log del proceso de ensamblado, para saber si hubo errores o si el .hex se generó correctamente.
Luego pasamos a la parte de simulación, vamos a la barra de herramientas en la opción "View", vamos abajo y seleccionamos "Watch". Se nos abre una pequeña ventana, donde podremos ver el estado de los SFR, agregamos los más importantes (PORTA, PORTB, TRISA y TRISB), y por sobre las columnas hacemos click derecho para seleccionar que datos deseamos ver del SFR, y seleccionamos "Symbol", "Value", "Decimal" y "Binary", para interpretarlos mejor.
Hecho esto, procedemos a abrir el simulador propiamente dicho. Vamos a la barra de herramientas en la opción "Debugger", vamos a "Select Tool" y "MPLAB SIM". Nos aparecerá una pequeña barra de herramientas en la parte superior, con varias opciones:
- Run: Ejecución continua del programa; los datos de Stimulus, por ejemplo, no se actualizan hasta detener esta acción.
- Animate: Ejecución continua y animada con constante actualización de datos.
- Halt: Se usa para detener una de las dos anteriores acciones.
- Step Into: Ejecución paso a paso manual, de esta forma se realiza solo una instrucción por vez y es más fácil leer los datos del Stimulus.
- Reset: Equivale a un reset por activación del MCLR.
Vamos a uno de los cuadros vacíos en la columna de "Pin / SFR", y agregamos una entrada. Si vemos todas las entradas, notaremos que corresponden a cada uno de los pines utilizables del PIC16F84A, el uC que estamos utilizando. Agregamos todas las entradas del puerto A, que vendrían a ser nuestras variables (RA0, RA1, etc.), y en la columna de Action, hay varias opciones para seleccionar:
- High: Nos entregará una entrada alta, "1" lógico, constante.
- Low: Nos entregará una entrada baja, "0" lógico, constante.
- Toggle: Al pulsar "Fire", variaremos entre entrada alta y baja. Por defecto es baja.
- Pulse High: Por defecto es una entrada baja. Al pulsar "Fire", nos entregará un pulso alto, y su período y unidad se puede configurar en las otras columnas.
- Pulse Low: Por defecto es una entrada alta. Al pulsar "Fire", nos entregará un pulso bajo, y su período y unidad se puede configurar en las otras columnas.
Terminado todo esto, vamos a simular un sencillo programa que se basa en lo siguiente:
"Por el Puerto B obtiene el dato del Puerto A, pero en la salida los bits pares se fijan siempre a "1". El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los pares el b6, b4, b2 y el b0."
Este problema se resuelve usando la función OR lógica y una máscara, como se podrá observar en la línea 25 del código. Utilizamos el simulador para comprobar su correcto funcionamiento, y pasamos a grabar el programa en el microcontrolador.
Para ello, tenemos que haber previamente conectado el programador a la PC. Vamos a la barra de herramientas en la opción "Programmer" > "Select Programmer", y seleccionamos el programador que estemos usando. Luego volvemos a "Programmer", y le damos a la opción "Program", para grabar nuestro programa en el uC.
Para ello, tenemos que haber previamente conectado el programador a la PC. Vamos a la barra de herramientas en la opción "Programmer" > "Select Programmer", y seleccionamos el programador que estemos usando. Luego volvemos a "Programmer", y le damos a la opción "Program", para grabar nuestro programa en el uC.
Simulación con Proteus (Isis)
Durante la instrucción "output_low(LED)", asignamos el valor lógico "0" al pin 7 del puerto B, por lo tanto, no enciende el LED.
Durante la instrucción "output_high(LED)", asignamos el valor lógico "1" al pin 7 del puerto B, por lo tanto, enciende el LED.
El siguiente, es el circuito del entrenador para PIC16F84A.
Nosotros utilizamos parte del circuito de un entrenador. Vamos a utilizar el pin 4 (MCLR), conectado a 5V mediante el resistor de 10K, y con el pulsador a masa por si deseamos resetear el programa (pulsando una vez), o detenerlo (mantentiendolo pulsado). Los pines del oscilador obviamente son necesarios y los de alimentación, y utilizaremos el pin RB7, conectando un LED con una resistencia de 470 ohm en serie. Si conectamos el ánodo al pin RB7, el resistor tendrá que estar conectado a masa, y en caso de conectar el cátodo, habrá que conectar el resistor a VDD (5 V).
Luego de haber grabado efectivamente el programa, realizamos la prueba del funcionamiento correcto del mismo, y obtuvimos la siguiente medición con el osciloscopio, colocando el canal A en el pin RB7:
Como se puede observar en la medición, el período dura 400 ms. Esto se debe a que en la instrucción "delay_ms", colocamos 200 ms entre las salidas alta y baja ("output_low" y "output_high"). Se observa que el microcontrolador tiene un "timing" perfecto. Subimos un video con la demostración del funcionamiento del mismo:
Componentes necesarios para realizar la práctica:
- Microcontrolador PIC16F84A
- Resistores de 10K y 470 Ohm
- Oscilador de 4 MHz
- Tact Switch (Pulsador)
- Capacitores de 15-33 pF
- LED verde o rojo común
- Cables del tipo telefónico para realizar conexiones
- Alimentación estable de 5V
No hay comentarios:
Publicar un comentario