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...
Y el código que realiza la secuencia es el que viene a continuación.
;---------------Encabezado-------------
LIST p=16f84
radix hex
;------------mapa de memoria---------
estado equ 0x03 ; Haciendo asignaciones
TRISB equ 0x06
ptob equ 0x06
rotar equ 0x0A ; para desplazar el dato
reg1 equ 0x0C ; para hacer el retardo
reg2 equ 0x0D
reg3 equ 0x0E
;-------Configuración de puertos-------
reset org 0x00
goto inicio ; salta a "inicio"
org 0x05 ; aquí comienza el programa
inicio bsf estado,5 ; configurando el puerto B
movlw b'00000000'
movwf TRISB
bcf estado,5
;----Realiza la secuencia de LED's-----
ahora movlw 0x01 ; carga W con 00000001
movwf rotar ; lo pasa al registro rotar
rotando movf rotar,0 ; pasa el contenido de rotar a W
movwf ptob ; y de allí al puerto B
; encendiendo el LED correspondiente
call retardo ; llama a retardo
rlf rotar,1 ; desplaza un bit el contenido
; de rotar y lo guarda.
btfss rotar,4 ; prueba si se activa el 5to. bit
; si es así saltea una línea
goto rotando ; sino, sigue rotando
goto ahora ; repite todo de nuevo
;-----------Rutina de Retardo-----------
retardo movlw 10 ; Carga los registros
movwf reg1 ; reg1, reg2 y reg3
; con los valores 10, 20 y 30
tres movlw 20 ; respectivamente
movwf reg2
dos movlw 30
movwf reg3
uno decfsz reg3,1 ; Comienza a decrementar
goto uno ; cuando termine
decfsz reg2,1 ; regresará a la siguiente
goto dos ; línea de código
decfsz reg1,1 ; de donde fue llamado
goto tres
retlw 00
;------------------------------------------
end ; The End
;------------------------------------------
Todo está como antes, salvo lo que está en rojo. Veamos de que se trata eso de rotar y rotando.
;----Realiza la secuencia de LED's-----
ahora movlw 0x01 ; carga W con 00000001
movwf rotar ; lo pasa al registro rotar
rotando movf rotar,0 ; pasa el contenido de rotar a W
movwf ptob ; y de allí al puerto B
; encendiendo el LED correspondiente
call retardo ; llama a retardo
rlf rotar,1 ; desplaza un bit el contenido
; de rotar y lo guarda.
btfss rotar,4 ; prueba si se activa el 5to. bit
; si es así saltea una línea
goto rotando ; sino, sigue rotando
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.
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...