En el tutorial de MPLAB ya vimos un pequeño ejemplo de un programa que encendía un led, ahora vamos a empezar con el primer tutorial de microcontroladores pic. Vamos a hacer algo sencillo, encender y apagar leds. Así, vamos a empezar por lo más básico para ir aprendiendo las instrucciones del micro y ver mas a detalle el funcionamiento del PIC.

Tutorial 1.1 - Encendiendo y apagando LED's

Ya vimos como encender un led, ahora veamos también como apagarlo. Este programa lo que hace es encender ocho leds conectados al puerto B del micro y después apagarlos. El código es el siguiente (descargar código):


Las primeras líneas son directivas al ensamblador. LIST p=16F628a define el micro que se utilizará, radix hex define la raíz numérica por defecto, en este caso será hexadecimal, esto significa que cualquier número que se escriba en el código y no se especifíque que raíz tiene será tomado como hexadecimal. En ensamblador los números se pueden representar en forma decimal, hexadecimal y binaria de la siguiente manera:

  • decimal: .14
  • hexadecimal: 0x0E ó 0Eh
  • binario: b'00001110'
En el código la raíz definida es hexadecimal, si quisieramos que fuera decimal tendriamos que escribir dec, para binaria bin y para octal oct. Después de la definición de la raíz está la directiva __config que se utiliza para definir la configuración del microcontrolador. La palabra de configuración 0x3D18 define que se utilizará el reloj interno del micro, se deshabilitará el watchdog, así como el reset y la protección de código. Más adelante se hablará más a detalle sobre la configuración del pic.

Después se declaran algunas constantes, para esto se utiliza la directiva equ. La sintaxis de la directiva es <nombre_de_la_constante> equ <valor> y lo que hace esta directiva es que cada vez que en el código se escriba la constante definida se tome el valor de constante, por ejemplo "RP0 equ 5", cada vez que en el código aparezca RP0 el valor que se tomará será 0x05.

Después viene el programa principal. Es muy importante comenzar el programa siempre con la  directiva org en la dirección 0x00 ya que esta directiva define la dirección en la que se comenzará a escribir el código. Al momento de encender el micro o al hacer un reset lo primero que el microcontrolador hace es leer la dirección 0x00, si no hay nada en esa dirección lo más probable es que el micro se cicle. Otra cosa importante que debemos tomar en cuenta es que la memoria de programa del PIC 16F628A comienza en la dirección 0x05, es por eso que debemos poner también un org 0x05 para que el código comienze a escribirse a partir de esa dirección.

Ahora si, veamos que instrucciones tenemos. Al inicio, después de org 0x00 tenemos un goto Inicio, goto hace es un salto incondicional hacia la dirección que se le indique, en este caso la dirección es la etiqueta Inicio. bsf se utiliza para cambiar el estado lógico de un bit de un registro a un nivel alto, la sintáxis es bsf f,b donde f es el registro y b el bit que se quiere cambiar (bsf STATUS,RP0), lo que hace esa línea es seleccionar el banco de memoria 1, el micro tiene 4 bancos de memoria y en esos 4 bancos estan repartidos todos los registros (en realidad la mayoria estan repartidos en 2 bancos, los 2 ultimos sirven de espejo a los 2 primeros. En el banco 0 se encuentra el registro STATUS y dentro de ese registro están los bits de selección de banco. Debemos cambiar al banco 1 ya que ahí se encuentra el registro de configuración del puerto B (TRISB) que dependiendo de la configuración que tenga hará que el puerto B se comporte como entrada o como salida. Una vez en el banco 1 configuramos el puerto B como salida, de eso se encarga clrf, esta instrucción borra el contenido de un registro, al estar en el banco 1 clrf PORTB hace que todos los bits del registro TRISB se pongan en un nivel bajo, configurando así el puerto B como salida. Después regresamos de nuevo al banco 0 con bcf STATUS,RP0. bcf realiza la acción contraria de bsf, pone a 0 un bit del registro específicado. Con eso termina la configuración del puerto B.

De las demás instrucciones la única "desconocida" es nop, esta instrucción sólo sirve para consumir un ciclo de instruccion ya que su definición es no realizar ninguna operación. Los nop en el código estan para que las salidas en el puerto B creen una señal cuadrada. Lo que hace la ultima parte del código es primero cargar 0xFF al registro W, luego pasar ese valor al puerto B para poner las salidas en alto, luego limpia el puerto B para tener la salida en bajo y el ultimo goto hace que el ciclo se esté repitiendo y repitiendo.

Al implementar este ejemplo vemos que los leds no encienden y apagan sino que se quedan encendidos y no cambian nunca de estado. Esto no es del todo cierto. Encienden y apagan pero tan rápido que no nos damos cuenta. De eso trata la segunda parte del tutorial.