Circuito de Semaforo
Circuito de Semaforo
Circuito de Semaforo
Introduccin Se propone realizar un semforo controlado por PIC lo que hace posible cambiar algunos parmetros de funcionamiento sin necesidad de intervenir el circuito, slo se modifica el programa para que la aplicacin se comporte como deseamos. Materiales Resistencias, condensadores, diodos, leds y pulsadores segn esquema del circuito propuesto. Fuente de poder de 3V. Programador de PIC PIC 12F629 o equivalente Set de herramientas Protoboard o placa impresa.
Desarrollo 1. Prepare la placa impresa o el protoboard para armar el circuito. 2. El circuito propuesto es el siguiente
3. Cargue el programa en el PIC. Si desea ver el cdigo del programa puede usar el MPLAB. Siga los pasos siguientes:
4. 5. 6.
7. 8.
a. Abra el archivo con: FILE e IMPORT b. Lea el cdigo con el comando: WIEW y PROGRAM MEMORY Puede imprimir el archivo y escribirlo en MPASS Energice y pruebe el circuito. Si tiene el programa en assembler puede modificarlo para cambiar algunos parmetros. a. Cambie los tiempos de la secuencia b. Cambie la secuencia de las luces Anote sus observaciones. Confeccione y entregue el informe.
Cuestionario 1. Se puede cambiar la secuencia de encendido de las luces? Por ejemplo, rojo, verde amarillo. 2. Se puede cambiar el tiempo de la secuencia de encendido? 3. Escriba un nuevo programa para esta aplicacin. Piense que el circuito enciende y apaga dos LEDs a la vez de acuerdo al programa cargado en el PIC.
Introducci? n.
Este es un acercamiento muy lineal a la escritura de un programa. Muchos escriben y producen unas subrutinas muy peque? con saltos as (GOTO's) de una subrutina a otra, de modo que los productos saltan por todas partes como 'palomitas de ma? El micro es capaz, perfectamente z'. capaz de saltar por un programa, sin embargo este tipo de disposici? es n muy dif? de seguir por un lector. cil
EXPERIMENTO 1.
Los comienzos siempre son muy simples, luego gradualmente se hacen
m? y m? complejos. Para seguir los experimentos que se describen en s s estas p? ginas se recomienda montar el proyecto "Tarjeta de Pruebas " siguiendo las indicaciones que se dan en dicho art? culo, aunque naturalmente el lector puede realizar su propio desarrollo o bien usar un protoboard, a su elecci? n. Una vez dispongamos de dicho soporte, las 4 pilas de 1'5V y el chip 'F84A, debemos copiar y pegar el c? digo que hay debajo, para poder completar nuestro primer experimento, al que daremos el nombre ejem01.asm y usando el ensamblador gratuito de Microchip MPLAB, pasarlo a exadecimal (.hex) con el cual tratamos de encender un LED. No hace nada m? El objetivo de este programa es mostrar las pocas l? s. neas de c? digo, necesarias para que el PIC haga esta tarea. Ver el listado:
;******************************************************************^ ; T? tulo: ejem01.asm ^ ; Autor: V. Garcia ^ ; Date: 12012006 ^ ; Deben documentarse todas las rutinas y el motivo de ser ^ ; (Las tildes estan omitidas de manera intencionada) ^ ;_________________________________________________________________ ^ ; Recordar que con: 0 se designa al registro W y con ^ ; 1 se designa al archivo f ^ ; ^ ; Que hace => Encender LED 1 ^ ; ^ ; PIC16F84A ^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; ;--------------- Encabezado ------------Start: ORG 0x00 BSF STATUS,5 MOVLW h'00' MOVWF h'05' MOVWF h'06' BCF STATUS,5 ;Ir a pagina1 a fijar los puertos ;pon 00 en W ;haz todas las l? neas RA salida ;haz todas las l? neas RB salida ; Ir a pagina0 para seguir el programa ;pon 1111 1110 en W ;conecta el primer LED ; lazo a LED_EN
El siguiente es el listado en exadecimal, si no dispone de un ensamblador, puede copiar y pegar en su editor de texto y gu? rdelo como ejem01.hex para usar con el 'quemador' de chips y comprobar que hace lo que se espera.
:1000000083160030850086008312FF308600FE30A4 :040010008600072837 :00000001FF
memoria requieren de m? bits de control en el mismo registro STATUS. s Esto, en esencia significa que, el programa para encender un LED realmente consiste en tres l? neas, la primera l? nea en la etiqueta LED_EN MOVLW h'254', pone el valor FEh en el registro de trabajo W, la segunda l? nea MOVWF h'06' copia el valor en W al Puerto B (06). Este puerto es de salida (en realidad es un puerto de Entrada/Salida) cuando el primer bit del Puerto B pase a ALTO, el LED se iluminar? como el programa es muy , r? pido, se apagar? de inmediato y no podremos saber si funciona el programa, entonces, entra en acci? la tercera l? n nea del programa. La tercera l? nea GOTO LED_EN (del ingl? GO TO, ir a), es la instrucci? s n que env? el puntero del programa a la direcci? de la etiqueta LED_EN, es a n el lazo que mantiene el LED encendido por el programa al repetir la secuencia, ya que como se ha dicho, el micro debe estar (corriendo) todo el tiempo, incrementando el programa. Ahora, puede que sea algo confuso lo descrito, sin embargo a medida que avance en estos art? culos podr? comprobar que es sencillo y f? cil.
El circuito.
Como se aprecia en el esquema, el circuito anterior (Tarjeta de Pruebas) se compone de un microcontrolador PIC16F84, ocho diodos LED y unos pocos componentes adicionales. El Puerto B del PIC tiene un LED conectado a cada una de sus ocho l? neas. El circuito m? simple y sencillo s se puede ver a continuaci? n.
Todo lo descrito hasta aqu? es cierto, si bien hay otras formas de lograr el , mismo resultado, una de las formas es cambiando el sentido del LED, en cuyo caso se debe modificar el valor de la salida del puerto B, donde hab? a un 0 ahora debe presentar un 1, lo que obliga a conectar el ? nodo a la salida y la resistencia a la l? nea de masa (GND), con esto se ha modificado el programa y sigue mostrando el mismo resultado que el anterior. Entonces, porque se ha usado el primer m? todo. No ha sido al azar, tengamos en cuenta que el consumo del conjunto LED m? resistencia normalmente no supera los 20mA y como la patilla del s puerto, admite una corriente mayor, no causar? ning? contratiempo, ya que n el drenador de salida del puerto soporta dicha carga mejor que tener que aportar dicha corriente que supone un mayor consumo y el consiguiente aporte de calor, este ha sido el principal motivo de usar este m? todo. Este m? todo debe ser considerado por el t? cnico para reducir consumos innecesarios en los proyectos. Este criterio es el que seguiremos aqu? . La operaci? del circuito se basa en un programa y este programa est? n contenido en el chip. Cuando se aplica la energ? el micro empieza en la a, primera posici? de memoria y ejecuta el programa. El programa ser? n guardado en la memoria del micro, durante el "quemado" y en ese ? nico momento est? disponibles un n? n mero de opciones de oscilador, osc RC (oscilador Res. / Cond.) que debe ser seleccionado y el chip estar? listo para ese tipo de oscilador elegido, t? ngase en cuenta que el montaje s? lo responder? al sistema de oscilador en la palabra de configuraci? que n haya elegido al 'quemar', si es RC, LP, TX, etc. Otras opciones disponibles del F84A a configurar son: PWRTE, CP, WDT, las cuales dependen del dispositivo en uso (se recomienda leer el DataSheet correspondiente). Debido a que el chip puede ser programado y reprogramado de nuevo, lo cierto es que est? garantizado por m? de 1.000 veces, esto lo hace ideal s para la experimentaci? n.
EXPERIMENTO 2.
Este experimento es similar al anterior, mediante unas pocas l? neas
a? adidas al contenido del programa anterior, hacemos que el LED ahora se encienda y se apague en una secuencia sin fin. El circuito que se usa, es el mismo del ejercicio anterior. Esto se consigue de esta forma: a? adimos en la tercera l? nea, una instrucci? CALL (Llamada) que env? al programa a la n a subrutina con etiqueta 'Delay' y luego se hace un nuevo lazo, veamos. Se trata de conseguir un retardo 'Delay' con el que poner el estado del LED en un bucle de espera, esta subrutina la llama el programa principal con la instrucci? CALL Delay, esto mantiene encendido el LED, cuando n termina el bucle, el micro retorna a la l? nea siguiente donde esta el CALL, en el programa principal MOVLW h'FF' que, carga el literal FF en el registro W y lo pone con la instrucci? MOVWF 06, en el Puerto B (salida) y salta de n nuevo a la etiqueta Delay (retardo) para esta vez mantener apagado un tiempo el LED. Al volver del retardo se establece un nuevo lazo, ser? conveniente volver a a empezar esta parte del programa para repetir los mismos pasos y esto se logra con un lazo que une este punto con el principio mediante el GOTO LED_EN. V? ase el listado. En cuanto a la rutina 'Delay' en s? lo que ocurre es que, empieza por , DECFSZ 1Bh (DECrement File Register Skip If Zero) decrementa una unidad el archivo 1Bh, si no es cero, sigue en la instrucci? GOTO Delay n para volver a decrementar que devuelve el programa a la instrucci? n anterior, para decrementarlo una nueva unidad, esto lo hace cada vez que pasa por la instrucci? DECFSZ 1Bh. n Cuando el archivo 1Bh llega a 0, entonces salta la instrucci? GOTO n Delay a la instrucci? que sigue que, es otro DECFSZ pero esta vez el n archivo es 1Ch y empieza a decrementarlo de uno en uno avanzando la rutina, luego se reinicia la instrucci? DECFSZ 1Bh, a la que le sigue el n decremento DECFSZ 1Ch, decremento de la instrucci? a instrucci? hasta n n llegar a la instrucci? (RETURN) de retorno al programa principal. Esto se le n llama instrucciones anidadas, ya se tratar? en m? detalle. n s
. . . . . . LED_EN MOVLW h'FE' MOVWF h'06' CALL Delay MOVLW h'FF' MOVWF 06 CALL Delay GOTO LED_EN Delay
;pon 1111 1110 en W ;conecta el primer LED ;Salta al retardo ;carga W con FF y ;apaga el LED ;Salta al retardo ; lazo a LED_EN
DECFSZ h'1B',1 ; Retardo GOTO Delay DECFSZ h'1C',1 GOTO Delay RETURN
END
Se muestran s? los cambios que nos permiten producir lo previsto en el lo enunciado. Observar que no se usan los pulsadores, para estos experimentos. A continuaci? se presenta el listado en hex para que si no n puede ensamblarlo lo copie y pegue en su editor de texto y gu? rdelo como ejem02.hex para el posterior 'quemado' del chip.
:1000000083160030850086008312FF308600FE30A4 :1000100086000E20FF3086000E2007289B0B0E283E :060020009C0B0E280800F5 :00000001FF
EXPERIMENTO 3.
En este experimento, proponemos encender el LED 1 de una fila de 8 LEDs, lo apagaremos y encenderemos el siguiente LED 2 esto lo repetiremos en una secuencia hasta llegar al LED 8 con una cadencia de 2Hz, para volver a empezar por el LED 1, esto es todo lo que hace este experimento. El circuito que usaremos es similar al usado en el experimento 1, al que a? adimos 7 series LED+R. Lo que m? cambiar? s es el listado del programa que, en este caso, tendr? que sufrir algunas modificaciones como veremos. Este puede ser una modificaci? del n esquema en el caso de no usar la tarjeta descrita.
En el esquema del principio, los cinco pines RA0 a RA4 (puerto A) se usan como pines de entrada, estos son forzados a alto con resistencias a positivo de 10kohms, de modo que cuando los pulsadores no est? pulsados la n entrada se hace alta (+5V) y cuando uno se pulsa pasa a nivel bajo (0V). El fen? meno de rebote producido, no se contempla esta vez ya que, cuando el programa detecta que el pulsador est? cerrado, el tratamiento de parpadeo de los LED's se ejecuta una vez en el tiempo y es m? largo que el rebote. s No se usan pulsadores en este ejercicio, de modo que no se contemplar? n. Los ocho pines RB0 a RB7 (puerto B) se usan como salida, los ? nodos de
los LED's se conectan al +5V y cada c? todo es controlado por la resistencia v? PIC, de modo que cuando la salida del PIC es nivel alto (+5V), el LED a implicado no luce y cuando el PIC entrega un nivel bajo (0V), lucir? el LED, esto reduce la corriente en el chip. Se usar? LED's de alto brillo con poca n corriente de flujo. Este es el listado completo para este experimento.
;******************************************************************^ ; T? tulo: ejem03-1.asm ^ ; Autor: V. Garcia ^ ; Date: 12012006 ^ ; Deben documentarse todas las rutinas y el motivo de ser ^ ; (Las tildes estan omitidas de manera intencionada) ^ ;_________________________________________________________________ ^ ; Recordar que con: 0 se designa al registro W y con ^ ; 1 se designa al archivo f ^ ; ^ ; Que hace => Encender LED 1, lo apaga y enciende el siguiente ^ ; hasta el LED 8, luego vuelve a emepzar. ^ ; PIC16F84A ^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ; ;--------------- Encabezado ------------list p=pic16f84a #include <p16f84a.inc> errorlevel -302 ;Eliminar banco mensajes ;**************** Definicion de Etiquetas STATUS equ h'0003' porta equ h'0005' ; define puerto A portb equ h'0006' ; define puerto B TRISA equ h'0085' TRISB equ h'0086' ; Estos estan definidos en #include ;w equ h'0000' ;f equ h'0001' ra0 ra1 ra2 ra3 ra4 rp0 cnt500u cnt1m cnt100m cnt500m cnt1s equ equ equ equ equ equ equ equ equ equ equ 00 01 02 03 04 06 0c 0d 0e 0f 10 ;RA0 ;RA1 ;RA2 ;RA3 ;RA4 bit bit bit bit bit ********************
;500usec direccion contador ;1msec direccion contador ;100msec direccion contador ;500msec direccion contador ;1sec direccion contador ****************
p03 equ b'11101111' p04 equ b'11110111' p05 equ b'11111011' p06 equ b'11111101' p07 equ b'11111110' ; ;**************** Inicio Programa *********************** org 0 ;Vector Reset goto init org 4 ;Vector Interrupcion BCF INTCON,GIE ;Por si se dispararan interrupciones goto init ;**************** Proceso Inicial ********************* org 5 init: bsf STATUS,RP0 ;Cambiar a Banco1 movlw h'ff' ;Define modo datos entrada movwf TRISA ;Define PORTA en modo Entrada clrf TRISB ;Define PORTB a modo Salida bcf STATUS,RP0 ;Cambia a Banco0 ; movlw h'ff' ;Pon datos '11111111' en salida movwf portb ;para apagar LEDs ;*********** Modelo 0 Subrutina Salida *************** ptn0 movlw p00 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p01 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p02 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p03 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p04 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p05 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p06 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw p07 ;Pon datos modelo en movwf portb ;datos salida call t100m ;Espera 100msec movlw h'ff' ;Pon datos FF en salida movwf portb ;datos para apagar LED call t100m ;Espera 100msec return ;******************************************************** ; Subrutina retardo (Timer) para reloj 10MHz ;******************************************************** ;************* Subrutina 1msec Timer *****************
las
movlw movwf movlw movwf nop nop decfsz goto decfsz goto return
;(1) Pon lazo cnt1 ;(1) Guarda lazo cnt1 ;(1)*2 Pon lazo cnt2 ;(1)*2 Guarda lazo cnt2 ;(1)*249*2 ajust retardo ;(1)*249*2 ajust retardo ;(1)*249*2 cnt500u-1=0 ? ;(2)*248*2 No, continua ;(1)*2 cnt1m-1=0 ? ;(2) No. Continua ;(2) Si. final de Cnt ;Total 2501*0.4usec=1msec
;************* t100m movlw movwf tm2lp call decfsz goto return ;************* t500m movlw movwf tm3lp call decfsz goto return ;************** t1s movlw movwf tm4lp call decfsz goto return
100msec Subrutina Retardo (Timer) *************** d'100' ;Pon lazo contador cnt100m ;Guarda lazo contador t1m ;subrutina 1msec cnt100m,f ;cnt100m - 1 = 0 ? tm2lp ;No. Continua ;Si. Final de Contador 500msec Subrutina Retardo (Timer) *************** d'5' ;pon lazo contador cnt500m ;Guarda lazo contador t100m ;subrutina 100msec cnt500m,f ;cnt500m - 1 = 0 ? tm3lp ;No. Continua ;Si. final de Contador 1sec Subrutina d'2' cnt1s t500m cnt1s,f tm4lp Retardo (Timer) ***************** ;Pon lazo contador ;Guarda lazo contador ;subrutina 500msec ;cnt1s - 1 = 0 ? ;No. Continua ;Si. Final de Contador
Este que sigue, es el archivo en hex que se obtiene al ensamblar el listado anterior, si no dispone de un ensamblador, puede copiar y pegar este archivo en su editor de texto y gu? rdelo como ejem03-1.hex para el 'quemado' en un chip '84A, con su sistema de programaci? n.
:020000000528D1 :0800080005280317FF308500F5 :1000100086010313FF308600051C0E200310FE30FE :1000200086001420860D112803309A009B0B162899 :0A0030009C0B16289A0B16280800F6 :00000001FF
Las primeras l? neas del programa, definen las igualdades (equ) y los par? metros que se van a usar. Aqu? se han definido las variables ra0-ra4 no , usadas y RP0, seguidamente se define una tabla modelo binario de ocho l? neas de datos, cada vez que se llame con: movlw p00 ; carga literal en el registro W (el literal va desde p00 a p07) movfw portb ; presenta valor en puerto b call t100m ; llama subrutina retardo su valor se enviar? a la salida (puerto B), alternando con los retardos necesarios para encender el LED que corresponda en cada caso, esto se repite. Posteriormente se define la subrutina de retardo desde donde se vuelve a la rutina principal. La rutina de tiempos aqu? usada, como se aprecia, es bastante completa ya que presenta hasta cuatro alternativas permitiendo un retardo de: 1 milisegundo, 100 milisegundos, 500 milisegundos y 1 segundo, lo cual, la hace interesante a la hora de aplicar en distintas ocasiones. Le aconsejo que la estudie con atenci? le puede servir en sus proyectos. n, Sin embargo, nos parece muy extenso este listado, podemos hacer lo mismo de forma m? simple. Esto mismo se hace s poniendo un 0, en el puerto b de salida (registro 06h), esto pone a 0 el bit m? alto y as? el primer LED se iluminar? Entonces el bit se rota (cambia) un s . lugar a la derecha con una instrucci? RLF (Rotation Left File, rotaci? a la n n izquierda de un bit) del contenido de F, pasando por el bit de acarreo C, esto conecta el siguiente LED en la fila. Es importante 'aclarar' (poner a 0) la bandera C (acarreo) antes de usar una instrucci? de rotar, ya n que cuando se conecta el micro, la bandera C puede estar en 1, con esto nos aseguramos que los LED's se desplazaran, que es lo que dese? bamos. Este es el listado en ensamblador que se puede copiar, pegar y guardar con el nombre ejem03.asm.
;******************************************************************^ ; T? tulo: ejem04.asm ^ ; Autor: V. Garcia ^ ; Fecha: 20-01-2006 ^ ; Version: 0.0 ^ ; Codigo para: PIC16C84 y PIC16F84 ^ ; Clock: 4MHz , XT. -> Ciclo = 1 uS. ^ ; Reset: Power On Reset. ^ ; Watch Dog: Inhabilitado. ^ ; Proteccion de codigo: Inhabilitado. ^ ; Ficheros requeridos: H16f84a.inc ^ ; Placa uControladora: Circuito de c? todos de LEDs a +Vcc. ^ ; ^ ; (Las tildes estan omitidas de manera intencionada) ^ ;_________________________________________________________________ ^
; Recordar que con: 0 se designa al registro W y con ^ ; 1 se designa al archivo f ^ ; Pulsador sin rebotes enciende un LED ^ ; Que hace => A de encender el LED 1 apagarlo, encender LED 2 y ^ ; apagarlo, sigue hasta LED 8. La secuencia se invierte y sigue ^ ; desde LED 8 hasta LED 1 ^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;--------------- Encabezado ------------;******************************************************************** ; LIST p=PIC16F84A ; Directiva para definir micro. #include <p16f84a.inc> ; Fichero estandard de cabezera. ; ;******************** DEFINICIONES ********************************** ; Todas las definiciones estan en 'include ', por tanto ; solo se definen las locales porta equ h'0005' ; define puerto A portb equ h'0006' ; define puerto B con1 con2 equ equ 0x0C 0x0D ; Variable de temporizacion. ; Variable de temporizacion.
;******************** COMIENZO DEL PROGRAMA ******************** ; SE DEFINEN BANCOS #define banco1 bsf STATUS,RP0 ;Macro para abreviar el BANCO 1 ;pone a 1 el bit5 del registro status #define banco0 bcf STATUS,RP0 ;Macro para abreviar el BANCO 0 ;pone a 0 el bit5 del registro status ORG GOTO 0x00 inicio ; Vector de Reset. ; Programa Principal.
;************************************************************ delay: CLRF con1 ;lazo exterior MOVLW 0xF0 MOVWF con2 ; RETURN ;esta linea es de prueba loop: DECFSZ con1,F ;lazo interior GOTO loop DECFSZ con2,F GOTO loop RETURN ; ;******************** PROGRAMA PRINCIPAL ******************** inicio: banco1 ; Banco 1. CLRF TRISB ; aclara puerto B, pone a 0 , todo salidas banco0 ; Banco 0. MOVLW 0xff MOVWF portb BCF STATUS,C ; PORTB 11111111. ; ;Preparado para rotar, pone a 0 el bit C
; Desplazar portB a la izquierda, usamos la instruccion ROTAR gira_i: BTFSS portb,7 ANDLW 01 ;si el bit 7 = 1 salta y rota a derecha ;si no, AND entre literal y W
goto $+3 ; no, salta 2 lineas movlw 0xff ; si, pon 255 en movwf portb ; portb BCF STATUS,C ;Asegura que en primera ; rotacion ingrese 0 en PORTB RLF portb,F ;rota archivo F a izq. (F = '1111 1110') CALL delay ;salta a retardo GOTO gira_i ;vuele a girar. END ; Fin de programa.
Como siempre el circuito y esquema electr? nico es el mismo mostrado en la figura anterior.
EXPERIMENTO 4.
En este caso, propongo producir un programa que encienda un LED y lo desplace en un sentido por la barra, cuando llegue al final regrese y repita esta secuencia en el otro sentido. Digamos que, con este programa obtendremos la cl? sica barra de LEDs del famoso coche 'Fant? stico'. A tenor de lo visto en los ejemplos anteriores parece sencillo y as? lo voy a demostrar. El listado ser? el siguiente: a
;******************************************************************^ ; T? tulo: ejem04.asm ^ ; Autor: V. Garcia ^ ; Fecha: 20-01-2006 ^ ; Version: 0.2 ^ ; Codigo para: PIC16C84 y PIC16F84 ^ ; Clock: 4MHz , XT. -> Ciclo = 1 uS. ^ ; Reset: Power On Reset. ^ ; Watch Dog: Inhabilitado. ^ ; Inhabilitado. ^ ; Ficheros requeridos: H16f84a.inc ^ ; Placa uControladora: Circuito de c? todos de LEDs a +Vcc. ^ ; ^ ; (Las tildes estan omitidas de manera intencionada) ^ ;_________________________________________________________________ ^ ; Recordar que con: 0 se designa al registro W y con ^ ; 1 se designa al archivo f ^ ; Pulsador sin rebotes enciende un LED ^ ; Que hace => A de encender el LED 1 apagarlo, encender LED 2 y ^ ; apagarlo, sigue hasta LED 8. La secuencia se invierte y sigue ^ ; desde LED 8 hasta LED 1 ^ ;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^ ;--------------- Encabezado ------------;****************************************************************** * ; LIST p=PIC16F84A ; Directiva para definir micro. include "p16f84a.inc" ; Fichero estandard de cabezera. ;******************** ********************************* con1 con2 equ 0x0C ; Variable de temporizacion. equ 0x0D ; Variable de temporizacion. DEFINICIONES
;******************** COMIENZO DEL PROGRAMA ******************** ; SE DEFINEN BANCOS #define banco1 BSF STATUS,RP0 ;Macro para abreviar el BANCO 1 ;pone a 1 el bit5 del registro status #define banco0 BCF STATUS,RP0 ;Macro para abreviar el BANCO 0 ;pone a 0 el bit5 del registro status ORG 0x00 ; Vector de Reset. GOTO inicio ; Programa Principal.
;****************** SUBRUTINA DE TIEMPO ************* delay: CLRF con1 MOVLW 0xF0 MOVWF con2 ; return ;es de prb loop: DECFSZ con1,F GOTO loop DECFSZ con2,F GOTO loop RETURN ;************************************************************ ;******************** PROGRAMA PRINCIPAL ******************** inicio: banco1 CLRF TRISB banco0 MOVLW 0xff MOVWF PORTB BCF STATUS,C ; Banco 1. ; aclara ; Banco 0. ; PORTB 11111111. ; ;Preparado para rotar
; PORTB Rota hacia la izquierda, usamos la instruccion ROTAR gira_i: BTFSC PORTB,7 ;si el bit7 = 0 salta y rota a derecha GOTO sigue_i ;no, sigue izquierda. GOTO gira_d ; sigue_i: RLF PORTB,F ;rota archivo F a izq. (F = '1110') CALL delay ; BTFSC PORTB,0 ;salta y rota si bit0 = 0 GOTO gira_i BSF PORTB,7 ; PORTB Rota hacia la derecha gira_d: BTFSC PORTB,0 ;salta y rota si bit0 = 0 GOTO sigue_d GOTO gira_i sigue_d: RRF PORTB,F CALL delay GOTO gira_d ; END ; Fin de programa.
un CALL a pausa, al volver har? un GOTO gira_d, repitiendo estos pasos. Al llegar el programa a la instrucci? CALL delay saltar? a la posici? de la n n etiqueta (subrutina de retardo) delay, limpia el registro cont1 y carga el registro cont2 con el valor F0h, decrementa el registro cont1 que esta a 00 y por tanto ahora esta a FFh (GOTO loop) hasta que es 0 y en ese momento decrementa el registro cont2 (GOTO loop) hasta que es 0 cerrando el lazo por segunda vez. Cuando termine esta subrutina (pausa), volver? a la instrucci? siguiente a la que le hizo saltar. Espero haber aclarado el flujo n del programa. Sigue est? el listado en hex del archivo un vez ensamblado, como siempre, puede copiar y pegar en un editor de texto y guardarlo como ejem04.hex para posteriormente quemar un PIC17F84A y comprobar su eficacia.
:020000040000FA :1000000009288C01F0308D008C0B04288D0B0428FE :100010000800831686018312FF3086000310861BBA :1000200012281728860D012006180F288617061893 :0A0030001A280F28860C012017285B :00000001FF
Con este ejercicio ponemos el punto y aparte por esta vez, seguiremos con estos ejemplos en la segunda parte. Volver al ? ndice de art? culos PIC.
Creada el: 03-06-2005 Actualizada el: 12-09-2005 ? Copyright 2007, Hispavila.com. Reservados todos los derechos. | declaraci? de privacidad | P? n ngase en contacto con nosotros