Tutoriales de Electrónica Básica
MICROCONTROLADORES PIC:

AL fin comenzaremos programando el hola mundo de los microcontroladores. Cómo configurar y encender un Led (nuestro primer programa)…

Programando en serio - Programando un LED

Debo confesar que el programa anterior aunque parezca una burrada, lo utilizaremos de tiempo completo, y lo único que cambiaremos serán los pines de entrada y salida.

Te recuerdo que lo que hicimos hasta ahora, solo fue configurar los puertos, pero no genera ninguna señal ni nada por el estilo.

Ahora si programaremos en serio. Encenderemos un LED, lo mantendremos encendido por un tiempo, luego lo apagaremos y haremos que se repita todo de nuevo. Recuerda ponerle un nombre, aquí lo llamaré LED1.asm (no olvides el .asm)

» Comencemos
  1. ;---------------Encabezado-------------
  2.         LIST    p=16f84
  3.         radix   hex
  4. ;------------mapa de memoria---------
  5. estado  equ     0x03         ; Haciendo asignaciones
  6. TRISB   equ     0x06
  7. ptob    equ     0x06
  8. reg1    equ     0x0C         ; Estos 3 registros los utilizaré
  9. reg2    equ     0x0D         ; para hacer el retardo
  10. reg3    equ     0x0E
  11. ;-------Configuración de puertos-------
  12. reset   org     0x00         ; origen del programa, aquí comenzará
  13.                              ; siempre que ocurra un reset
  14.         goto    inicio       ; salta a "inicio"
  15. inicio  bsf     estado,5     ; pone rp0 a 1 y pasa al banco1
  16.         movlw   b'00000000'  ; carga W con 00000000
  17.         movwf   TRISB        ; y pasa el valor a trisb
  18.         bcf     estado,5     ; pone rp0 a 0 y regresa al banco0
  19. ;----Aquí enciende y apaga el LED-----
  20. ahora   bsf     ptob,0       ; pone un 1 en RB0 (enciende el LED)
  21.         call    retardo      ; llama al retardo
  22.         bcf     ptob,0       ; pone a 0 RB0 (apaga el LED)
  23.         call    retardo      ; llama al retardo
  24.         goto    ahora        ; repite todo de nuevo
  25. ;-----------Rutina de Retardo-----------
  26. retardo movlw   10           ; Aquí se cargan los registros
  27.         movwf   reg1         ; reg1, reg2 y reg3
  28.                              ; con los valores 10, 20 y 30
  29. tres    movlw   20           ; respectivamente
  30.         movwf   reg2
  31. dos     movlw   30
  32.         movwf   reg3
  33. uno     decfsz  reg3,1       ; Aquí se comienza a decrementar
  34.         goto    uno          ; Cuando reg3 llegue a 0
  35.         decfsz  reg2,1       ; le quitare 1 a reg2
  36.         goto    dos          ; cuando reg2 llegue a 0
  37.         decfsz  reg1,1       ; le quitare 1 a reg1
  38.         goto    tres         ; cuando reg1 llegue a 0
  39.         retlw   00           ; regresare al lugar
  40.                              ; de donde se hizo la llamada
  41. ;------------------------------------------
  42.         end                  ; se acabó
  43. ;------------------------------------------
» Descripción del código:

No te asustes por el tamaño del código, que aunque parezca difícil todo está igual que el código anterior, por lo que sólo describiré los cambios... (lo que está en rojo)

Se agregaron 3 registros mas (reg1, reg2 y reg3), éstos vendrían a ser como variables ubicadas en sus respectivas posiciones (0x0C, 0x0D, 0x0E,) y son registros de propósito general (recuerda que para el PIC16F84 son 68, puedes elegir cualquiera).

A demás se agregó ptob, etiqueta que corresponde a la dirección del puerto B

Analicemos lo que sigue..., que éste es el programa en sí:

  1. ;----Aquí enciende y apaga el LED-----
  2. ahora   bsf     ptob,0       ; pone un 1 en RB0 (enciende el LED)
  3.         call    retardo      ; llama al retardo
  4.         bcf     ptob,0       ; pone a 0 RB0 (apaga el LED)
  5.         call    retardo      ; llama al retardo
  6.         goto    ahora        ; repite todo de nuevo

La etiqueta "ahora" es el nombre de todo este procedimiento o rutina, de tal modo que cuando quiera repetir el procedimiento solo saltare a "ahora".

bsf es poner a uno un bit, en este caso al primer bit (el bit 0) del puerto B (ptob).

call es una llamada, en este caso llama a la rutina de retardo, cuando regrese, continuará con el código.

bcf es poner a cero un bit, en este caso al primer bit (bit 0) del puerto B (ptob). y luego llama al retardo, cuando regrese se encontrará con la instrucción goto obligándolo a saltar a la etiqueta ahora para que se repita todo de nuevo. Eso es todo...!!!.

» Rutina de retardo

Esta es la parte más difícil, pero trataré de hacerlo sencillo así puedes continuar con lo que sigue y no te trabas en esta parte. Primero veremos como se cargan los registros para el retardo. Veamos el código...

  1. ;-----------Rutina de Retardo-----------
  2. retardo movlw   10           ; Aquí se cargan los registros
  3.         movwf   reg1         ; reg1, reg2 y reg3
  4.                              ; con los valores 10, 20 y 30
  5. tres    movlw   20           ; respectivamente
  6.         movwf   reg2
  7. dos     movlw   30
  8.         movwf   reg3

Recordemos que en el mapa de memoria los registros 0x0C, 0x0D y 0x0E fueron nombrados como reg1, reg2 y reg3 respectivamente. Ahora simularemos los tres registros para ver como se cargan mediante el registro de trabajo W, (utilizamos W por que los valores 10, 20 y 30 son valores constantes). Repito, esto es una simulación bien a lo bruto, así que vamos a suponer que en vez de 10 cargo 1, en lugar de 20 cargo 2 y en lugar de 30 cargo 3, hago esto, solo con fines didácticos así podrás comprenderlo mejor, ok?.

Rutina de retardo

Lo que acabas de ver, fue la carga de los registros reg1, reg2 y reg3. Ahora verás como se comienza a decrementar cada uno de esos registros, primero reg3, luego reg2 y finalmente reg1.

  1. tres    movlw   20           ; respectivamente
  2.         movwf   reg2
  3. dos     movlw   30
  4.         movwf   reg3
  5. uno     decfsz  reg3,1       ; Aquí se comienza a decrementar
  6.         goto    uno          ; Cuando reg3 llegue a 0
  7.         decfsz  reg2,1       ; le quitare 1 a reg2
  8.         goto    dos          ; cuando reg2 llegue a 0
  9.         decfsz  reg1,1       ; le quitare 1 a reg1
  10.         goto    tres         ; cuando reg1 llegue a 0
  11.         retlw   00           ; regresare al lugar
  12.                              ; de donde se hizo la llamada

Veamos, decfsz reg3,1 esto es, decrementa reg3, si al decrementar te da cero saltéate una línea. El 1 que sigue a reg3, indica que guarde el valor de reg3 decrementado en el mismo reg3, es comoooo.... contador=contador-1 (se entiende...?)

goto, es saltar y goto uno es saltar a la etiqueta uno. En esta pequeña vuelta estoy decrementando reg3 hasta que se haga cero.

Cuando reg3 llegue a 0 decrementaré reg2 en una unidad, volveré a cargar reg3 y lo decrementaré nuevamente para recién restarle otra unidad a reg2, y así... hasta que reg2 se haga cero. Cuando eso ocurra decrementaré reg1 en una unidad, cargaré nuevamente reg2 y reg3, para luego decrementarlos de nuevo, todo esto ocurrirá hasta que reg1 se haga igual a cero.

Rutina de retardo

Esta rutina de retardo, aunque parezca absurda y larga nos permite ver como se enciende y se apaga el LED, de lo contrario no podríamos notar la diferencia, o lo veríamos apagado o encendido, ya que la velocidad es demasiado alta si estamos trabajando con un XT de 4 MHz.

Finalmente nos queda la última instrucción:

  1. ;------------------------------------------
  2.         end                  ; se acabó
  3. ;------------------------------------------

Sin palabras.

Una vez cargado el programa en el PIC, necesitarás ver el programa funcionando, por lo que deberás armar este circuito.

Circuito para el control de un led con el pic 16f84

El pin 4 (MCLR) está conectado por lo del Reset, para que se estabilicen los niveles de tensión.

Eso fue todo, buena suerte...!!!

R-Luis...