Secuenciador de Luces PARA PIC16F84 Los secuenciadores de Luces son muy populares entre los aficionados a la electrónica, lo mismo pueden encontrarse en series de foquitos navideños o en grandes sistemas de iluminación para discotecas. El principio de programación es el mismo. En este artículo se presenta un programa para un Secuenciador de Luces de ocho canales. El objetivo es ejercitarnos en el Lenguaje de programación dejando a la imaginación y conocimientos del lector la aplicación final. Por esta razón se utilizará la tarjeta Entrenador de PIC16F84 (clave 502) para probar el programa. Las herramientas que se utilizan en esta práctica son: - MPLAB como ambiente de desarrollo para Editar el programa. - MPASAM para Compilar - El grabador de programas Prog2 (Clave 501) para Grabar el PIC16F84. - El Entrenador PIC16F84 (Clave 502) para Probar el programa.
1.- Luces.asm A continuación se transcribe el programa Luces.asm mismo que será explicado más adelante. ;=============================luces.asm==========12 de Mayo del 2001===== ;PARA SER USADO EN LA TARJETA Test1, Entrenador de PIC16F84 ;------------------------------------------------------------------------portb equ 0x06 ncount mcount pcount
equ equ equ
0x0c 0x0d 0x0e
;registro interno de paus_100ms ;registro externo de paus_100ms ;registro de npause_100ms
rcount scount tcount
equ equ equ
0x0f 0x10 0x11
;registro mas interno de paus_1s ;registro medio de paus_1s ;registro externo de paus_1s
ucount
equ
0x12
;registro de npaus_1s
count1 count2 count3 count4 count5
equ equ equ equ equ
0x13 0x14 0x15 0x16 0x17
;registro mas interno de paus_1m ;registro medio de paus_1m ;registro externo de paus_1m ;registro mรกs externo de paus_1m ;registro de npaus_1m
veces equ 0x18 ;registro que repite n veces un programa ;---------------------------------------------------------------------------;MACROS ;---------------------------------------------------------------------------Minutos macro min movlw min movwf count5 call npaus_1m endm Segundos
macro
seg
movlw movwf call endm
seg ucount npaus_1s
Miliseg
macro movlw movwf call endm
miliseg miliseg pcount npaus_100ms
Timer
macro if min>0 Minutos endif
min,seg,miliseg
if seg>0 Segundos endif if miliseg>0 Miliseg endif endm OutPuerto movwf
Repite movlw movwf
; d'1'< min < d'255'
; d'1'< seg < d'255'
; d'1'< m iliseg < d'255'
min
seg
miliseg
macro movlw portb endm
SalidaGeneral SalidaGeneral
;SalidaGeneral b'00000000'
macro Repeticiones veces
Repeticiones
;Carga veces ;1< Repeticiones <255
endm
RepitiendoDesde
macro Etiqueta decfsz veces,f goto Etiqueta endm ;---------------------------------------------------------------------------org movlw tris
0x000 b'000000 portb
;Define como salida al PuertoB
clrf
portb
;Apaga el puerto B
goto Programa ;---------------------------------------------------------------------------;SUBRUTINAS ;---------------------------------------------------------------------------;paus_100ms es una pausa de 100 mili segundos = a .1 seg paus_100ms movlw 0x82 movwf mcount loadn movlw 0xff movwf ncount decn decfsz ncount,f goto decn decfsz mcount,f goto loadn return ;---------------------------------------------------------------------------;npause_100ms repite 100ms las veces que contenga el registro pcount ;antes de entrar cargar el registro pcount con el numero deseado npaus_100ms call paus_100ms decfsz pcount,f goto npaus_100ms return ;---------------------------------------------------------------------------;paus_1s es una pausa de 1 segundo paus_1s movlw 0x0a ;carga movwf tcount ;tcount loads movlw 0x82 ;carga movwf scount ;scount loadr movlw 0xff ;carga movwf rcount ;rcount decr decfsz rcount,f ;decrementa r goto decr ;again decfsz scount,f ;decrementa s goto loadr ;again decfsz tcount ;decrementa t goto loads return
;---------------------------------------------------------------------------;npause_1s repite 1s las veces que contenga el registro ucount ;antes de entrar cargar el registro pcount con el numero deseado npaus_1s call paus_1s decfsz ucount,f goto npaus_1s return ---------------------------------------------------------------------------;paus_1m es una pausa de 1 minuto paus_1m movlw 0x3c ;carga 60 decimal movwf count4 ;count4 load3 movlw 0x0a ;carga movwf count3 ;count3 load2 movlw 0x82 ;carga 82 se ADELANTA .060 movwf count2 ;count2 load1 movlw 0x00 ;carga movwf count1 ;count1 dec1 decfsz count1,f ;decrement 1 goto dec1 ;again decfsz count2,f ;decrement 2 goto load1 ;again decfsz count3 ;decrement 3 goto load2 ;again decfsz count4 ;decrement 3 goto load3 ;again return ;done ;---------------------------------------------------------------------------;npause_1m repite 1m las veces que contenga el registro count5 ;antes de entrar cargar el registro count5 con el numero deseado npaus_1m call paus_1m decfsz count5,f goto npaus_1m return ;---------------------------------------------------------------------------;---------------------------------------------------------------------------Programa ;-------Prog1 Repite
5
;Repite 5 veces
Prog1Step1 OutPuerto b'11111111' Timer 0,0,2 OutPuerto b'00000000' Timer 0,0,2 RepitiendoDesde Prog1Step1
;min,seg,miliseg
;Repite este programa desde
Prog1Step1 FinProg1 ;-------Prog2 Repite
5
;Repite 5 veces
Prog2Step1 OutPuerto Timer
b'00000001' 0,0,5
OutPuerto Timer
b'00000010' 0,0,5
OutPuerto Timer
b'00000100' 0,0,5
OutPuerto Timer
b'00001000' 0,0,5
OutPuerto Timer
b'00010000' 0,0,5
OutPuerto Timer
b'00100000' 0,0,5
OutPuerto Timer
b'01000000' 0,0,5
Prog2Step8 OutPuerto Timer
b'10000000' 0,0,5
Prog2Step2
Prog2Step3
Prog2Step4
Prog2Step5
Prog2Step6
Prog2Step7
RepitiendoDesde Prog2Step1
;Repite este programa
Repite
8
;Repite 8 veces
OutPuerto Timer OutPuerto Timer
b'11111111' 0,0,5 b'00000000' 0,0,2
FinProg2 ;-------Prog3
Prog3Step1
RepitiendoDesde Prog3Step1
;Repite este programa desde
Repite Prog4Step1 OutPuerto Timer
;Repite 2 veces
FinProg3 ;-------Prog4 4 b'11000000' 0,0,5
Prog4Step2 OutPuerto Timer
b'01100000' 0,0,5
OutPuerto Timer
b'00110000' 0,0,5
OutPuerto Timer
b'00011000' 0,0,5
OutPuerto Timer
b'00001100' 0,0,5
OutPuerto Timer
b'00000110' 0,0,5
Prog4Step3
Prog4Step4
Prog4Step5
Prog4Step6
Prog4Step7 OutPuerto b'00000011' Timer 0,0,5 RepitiendoDesde Prog4Step1
;Repite este programa desde
FinProg4 ;---------------------------------------------------------------------------FinProgramas goto Prog1 end
1.1- Equ Sintaxis <etiqueta>
equ
<expresi贸n>
Descripci贸n El valor de <expresi贸n> es asignado a <etiqueta> Ejemplo portb
equ
0x06
El valor num茅rico hexadecimal 0x06 es asignado a la etiqueta portb 1.2.- Macro Sintaxis
<etiqueta>
macro ... ... endm
[<arg>, ... ,<arg>]
Descripción Una macro es un conjunto de instrucciones que puede ser insertada en el programa simplemente llamándola por su <etiqueta>. Una macro puede tener uno o más argumentos <arg>. La lista de instrucciones debe terminar con la palabra endm. La macro OutPuerto OutPuerto
macro movlw movwf endm
SalidaGeneral SalidaGeneral portb
En este caso OutPuerto es el nombre de esta macro y tiene un argumento: SalidaGeneral. Cuando se llama a esta Macro se escribiría OutPuerto
b’00001111’
Esto es equivalente a: movlw
b’00001111’
;se carga b’00001111’ en el
movwf
portb
;se manda este patrón de bits a los
acumulador pines ;de salida Que al ejecutarse encienden los Pines RB0, RB1, RB2, y RB3 . La macro Segundos Es un grupo de instrucciones que generan una pausa en segundos. Por ejemplo si escribimos Segundos
3
El resultado es que el Pic hace una pausa de 3 segundos. De igual manera se generan las macros Miliseg y Minutos.
La macro Timer Finalmente Timer se define como una macro que agrupa a Minutos, Segundos y Miliseg Para llamarla escribiríamos. Timer
1,5,1
Que quiere decir, “pausa de 1 minuto, 5 segundos y .1 segundos” Ahora si escribimos: OutPuerto Timer OutPuerto Timer
b’11111111’ 1,0,0 b’00000000’ 0,5,0
Quiere decir que todas las salidas de Puerto B se encienden, durante un segundo y después todas apagan durante 5 segundos. De esta manera ya podemos controlar las salidas que deseamos encender y el tiempo que se van a mantener encendidas. La macro Repite Esta macro carga en el registro: “veces el numero de Repeticiones”. Por ejemplo: Repite
5
Carga en el registro veces el numero 5. La macro RepitiendoDesde Esta macro decrementa en uno el registro veces, si el valor obtenido es cero entonces manda a ejecutar las instrucciones a partir de la Etiqueta: Veamos un ejemplo Repite
5
... ... ... RepitiendoDesde
Ciclo
Ciclo
Esto quiere decir simplemente que las instrucciones contenidas entre Ciclo RepitiendoseDesde se van a ejecutar 5 veces.
y
1.3 Org org
0x000
Define la dirección de la memoria de programación a partir de la cual se escribe el programa 1.4 Tris Con las siguientes instrucciones se especifica que los pines del Puerto B van a ser consideradas como salidas. Entonces en el Entrenador (clave 502) los puentes correspondientes al puerto B deben ser conectados en la posición “O” (salidas). movlw tris
b'00000000' portb
clrf
portb
1.5 Clrf
Se apagan todos los pines del Puerto B 1.6 Goto Esta instrucción envía la secuencia de ejecución del programa a la etiqueta Programa, saltando todas la subrutinas. goto Programa ;---------------------------------------------------------------------------;SUBRUTINAS ;---------------------------------------------------------------------------... ... ... ... ... ;---------------------------------------------------------------------------Programa .... ... ... ... end
1.7 Subrutinas Las subrutinas son un grupo de instrucciones que comienzan con una etiqueta y debe de terminar con la palabra return. Las subrutinas se llaman con call, entonces el programas se salta a ejecutar la subrutina, cuando llega a la palabra return regresa a la instrucci贸n siguiente desde donde fue llamada. Todas las subrutinas se pueden poner juntas, una despu茅s de la otra para facilitar su lectura. Por ejemplo .... call ....
paus_100ms
;se va a ejecutar esta subrutina ;regreso de la subrutina
Las subrutinas de este programa son seis: paus_100ms
Es una pausa de 100 milisegundos es decir .1 seg.
npause_100ms
Repite varias veces la pausa de 100 milisegundos
paus_1s
Es una pausa de un segundo
npaus_1s
Repite varias veces la pausa de un segundo
paus_1m
Es una pausa de un minuto
npaus_1m
Repite varias veces la pausa de un minuto
1.8 Prog1 Prog1 es la etiqueta de la primer Secuencia. Todas las luces encienden durante 200 milisegundos, se apagan durante 200 miliseg y esta secuencia se repite 5 veces .
Prog1 Repite Prog1Step1 OutPuerto Timer OutPuerto Timer
5 b'11111111' 0,0,2 b'00000000' 0,0,2
RepitiendoDesde Prog1Step1 Prog1Step1 FinProg1
;Repite 5 veces
;min,seg,miliseg
;Repite este programa desde
Las instrucciones que se encuentran dentro de Repite y RepitiendoDesde Prog1Step1 se ejecutan 5 veces. 1.9 Prog2 En esta Secuencia primero se enciende RB0, 500 milisegundos después se apaga RB0 y se enciende RB1, así hasta terminar con RB7. Este ciclo se repite 5 veces. Como se puede observar hacer las secuencias es muy fácil. Una combinación de OutPuerto y Timer en forma consecutiva. OutPuerto Timer
b'00000001' 0,0,5
Que se repite varias veces con ayuda de las macro Repite y RepitiendoDesde 2. Para editar y compilar este programa es conveniente usar MPLAM y MPASAM respectivamente. Si se desea también se puede bajar el file luces.zip de la dirección de Internet www.prodigyweb.net.mx/wgb/articulos. 3.- El Grabador de Programas (Clave 501) y el Entrenador (Clave 502) El Grabador de Programas y el Entrenador se pueden interconectar para contar con un conjunto más amigable y rápido. El único ajuste que requiere el Entrenador es el de colocar los puentes del Puerto B en la posición de salida “O”. Fig. 3.1
Fig. 3.1 El Programador y el Entrenador