Page 1

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


secuenciador  

Los secuenciadores de Luces son muy populares entre los aficionados a la electrónica, lo mismo pueden encontrarse en series de foquitos navi...