Tutoriales de Electrónica Básica
MICROCONTROLADORES PIC:

En esta guía haremos una secuencia de 4 LED's, para ello recurriremos a la rutina de retardo del programa anterior, si no lo viste puedes regresar y consultarlo...

Antes de empezar

Si bien nos vamos a complicar con las siguientes lecciones, sería bueno que consultes el Set de instrucciones, así será mas fácil que comprendas cada línea de código que se escribe, ya que cada una está acompañada de su respectivo ejemplo, y una vez lo comprendas puedes quedarte con el resumen de instrucciones.

Lo que haremos ahora será un programa que encienda 4 LED's en forma secuencial, y para ello recurriremos a la rutina de retardo del programa anterior, que espero lo hayas comprendido, si no es así regresa y no vengas aquí hasta que lo entiendas :o))

Ok, sigamos. El circuito será el siguiente...

circuito para el control de 4 LED con el microcontrolador

Y el código que realiza la secuencia es el que viene a continuación.

  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. rotar   equ     0x0A        ; para desplazar el dato
  9. reg1    equ     0x0C        ; para hacer el retardo
  10. reg2    equ     0x0D
  11. reg3    equ     0x0E
  12. ;-------Configuración de puertos-------
  13. reset   org     0x00
  14.         goto    inicio      ; salta a "inicio"
  15.         org     0x05        ; aquí comienza el programa
  16. inicio  bsf     estado,5    ; configurando el puerto B
  17.         movlw   b'00000000'
  18.         movwf   TRISB
  19.         bcf     estado,5
  20. ;----Realiza la secuencia de LED's-----
  21. ahora   movlw   0x01        ; carga W con 00000001
  22.         movwf   rotar       ; lo pasa al registro rotar
  23. rotando movf    rotar,0     ; pasa el contenido de rotar a W
  24.         movwf   ptob        ; y de allí al puerto B
  25.                             ; encendiendo el LED correspondiente
  26.         call    retardo     ; llama a retardo
  27.         rlf     rotar,1     ; desplaza un bit el contenido
  28.                             ; de rotar y lo guarda.
  29.         btfss   rotar,4     ; prueba si se activa el 5to. bit
  30.                             ; si es así saltea una línea
  31.         goto    rotando     ; sino, sigue rotando
  32.         goto    ahora       ; repite todo de nuevo
  33. ;-----------Rutina de Retardo-----------
  34. retardo movlw   10          ; Carga los registros
  35.         movwf   reg1        ; reg1, reg2 y reg3
  36.                             ; con los valores 10, 20 y 30
  37. tres    movlw   20          ; respectivamente
  38.         movwf   reg2
  39. dos     movlw   30
  40.         movwf   reg3
  41. uno     decfsz  reg3,1      ; Comienza a decrementar
  42.         goto    uno         ; cuando termine
  43.         decfsz  reg2,1      ; regresará a la siguiente
  44.         goto    dos         ; línea de código
  45.         decfsz  reg1,1      ; de donde fue llamado
  46.         goto    tres
  47.         retlw   00
  48. ;------------------------------------------
  49.         end                 ; The End
  50. ;------------------------------------------

Todo está como antes, salvo lo que está en rojo. Veamos de que se trata eso de rotar y rotando.

  1. ;----Realiza la secuencia de LED's-----
  2. ahora   movlw   0x01        ; carga W con 00000001
  3.         movwf   rotar       ; lo pasa al registro rotar
  4. rotando movf    rotar,0     ; pasa el contenido de rotar a W
  5.         movwf   ptob        ; y de allí al puerto B
  6.                             ; encendiendo el LED correspondiente
  7.         call    retardo     ; llama a retardo
  8.         rlf     rotar,1     ; desplaza un bit el contenido
  9.                             ; de rotar y lo guarda.
  10.         btfss   rotar,4     ; prueba si se activa el 5to. bit
  11.                             ; si es así saltea una línea
  12.         goto    rotando     ; sino, sigue rotando
  13.         goto    ahora       ; repite todo de nuevo

rotar es el registro en el que almacenaré momentáneamente el valor del desplazamiento de los bit's. Así cuando llegue al 5to. no enviaré ese dato ya que se habrá activado el 4to. bit del puerto B del PIC (sería el 4to. LED), y entonces volveré a comenzar.

» Descripción del código:

Ok, voy a poner a 1 el primer bit del registro rotar a través de w, esto se hace en las dos primeras líneas.

rotando, es una subrrutina: Aquí se pasa el contenido del registro rotar o sea (00000001) a W (por eso el 0) para luego enviarlo al puerto B (portb), y encender el primer LED, luego llama al retardo, cuando regrese se encontrará con la siguiente instrucción.

rlf rotar,1 esto es como decirle, rota el contenido del registro rotar un lugar a la izquierda, y guarda el valor en el mismo registro rotar (por eso el 1). Es decir, que si antes rotar=00000001 luego de esta instrucción rotar=00000010. Ahora viene la verificación del 5to. bit, para saber si completó la rotación.

btfss rotar,4 es como si le preguntarías ¿oye, se activó tu 5to. bit?.

Ok...!!! ya se lo que estas pensando ¿como que el 5to. si aparece el 4?, bueno, es por que no estas siguiendo el tutorial, recuerda que el primer bit está en la posición 0 y por ende, el 5to. esta en la posición 4 ¿ahora esta bien?. Continuemos, si resulta ser que no, saltara hasta rotando y pasará el contenido del registro rotar a W nuevamente (recuerda que ahora rotar es 00000010 por aquello del desplazamiento). luego lo enviará al puerto B, llamará al retardo y rotará nuevamente.

Bien supongamos que ya paso todo eso y que ahora rotar tiene el valor 00001000 y estamos ubicados justo en la etiqueta rotando. Entonces pasará el valor a W y de allí al puerto B, luego llamará al retardo, cuando regrese, rotará el contenido del registro rotar una vez más y entonces su contenido será 00010000. Ahora viene la pregunta...

btfss rotar,4 ¿está activo el 5to. bit del registro rotar?, Siiiiii, si Sr. está activo..., Perfecto, entonces saltaré una línea, me encontraré con goto ahora y comenzaré de nuevo.

Eso es todo. Ahora veámoslo en forma gráfica para aclarar un poco las ideas.

rotación

Esa fue la idea, que veas como se hace la rotación, hay varias formas de hacerlo, yo aquí te mostré una, otras utilizan el carry del registro STATUS, otras no utilizan la rotación para hacer esta secuencia, sino van activando los bit's de a uno, en fin, tienes muchas opciones...

Fue todo por hoy, ahora nos tomamos un descanso y vemos que otras herramientas tenemos...



R-Luis...