Post on 22-Jun-2015
DIAGRAMAS DE FLUJO PARA RUTINAS DE RETARDO DE 1 HASTA 60 MINUTOS
DIAGRAMA DE FLUJO PARA CERROJO AUTOMÁTICO
SI
¿CONTACERR=200?
CONTACERR=CONTACERR +1
NO
Delay 15msegundos
IR A PARADA
Delay 15msegundos
La sacamos del PDEL
Return
¿Ocurriócondición?
NO
SI
TAREA1
TAREA2
CERROJOTRADICIONAL
CERROJOAUTOMÁTICO
¿Ocurriócondición?
SI
TAREA1
TAREA2
Inicializar registro:CONTACERR=0
NO
¿Cuánto tiempo pasa para salir del cerrojo?
CONTACERR se incrementará hasta 200, y por cada incremento se debe esperar 15
milisegundos, es decir=
Tiempo de espera en cerrojo= 15mseg*200= 3 segundos.
Este tiempo puede ajustarse según sea el diseño que se esté realizando.
USO DE LAS TABLAS EN LENGUAJE ENSAMBLADOR
Las tablas nos permiten extraer valores para ser utilizados en otras tareas, tales
como la visualización de datos, linealización de valores, conversión de códigos, etc.
Su aplicación era principalmente para el uso de los sistemas contadores en conjunto
con la multiplexación de displays, sin el uso de un decodificador BCD a 7 segmentos; sin
embargo, pueden servir para semáforos, sistemas de monitoreo, aplicaciones
residenciales, entre otras.
Su funcionamiento se basa en la manipulación del contador de programa (PC)
mediante la suma de un dato a extraer de la tabla (registro) y la parte baja del contador de
programa (PCL). Para un rango máximo de 256 valores, se manipula directamente el PCL.
En caso de valores superiores, se debe manipular adicionalmente el PCLATH, que amplía la
capacidad de datos en una tabla.
La instrucción RETLW K (Retorna de la subrutina y carga en W el valor constante k),
está muy asociada a las tablas, ya que cuando se llama a una subrutina “tabla”, esta
instrucción regresa de la subrutina y a su vez extrae el valor de la misma previamente
seleccionada por el puntero de tabla.
Normalmente, cuando se llama a una subrutina “tabla”, previamente se carga el
valor del dato a sacar de la tabla. Dentro de la subrutina “tabla”, el dato a sacar, se suma al
PCL que es el encabezado o puntero de la tabla, “saltando” al valor correspondiente
indicado por el dato que se desea extraer de la tabla.
En la siguiente imagen, supongamos que se desea sacar el valor del registro UNIDAD
(supongamos que UNIDAD= 5 al momento de ejecutar el llamado a la tabla), por lo que se
le sumará UNIDAD + PCL (5+PCL ubicado en el puntero o encabezado de la tabla), y éste
saltará desde el encabezado al valor de la UNIDAD (que vale 5 para este ejemplo) y W
retornará con ese valor cargado (W=’Valor5’).
Cuando se trabaja con displays y la respectiva multiplexación es un estándar utilizar
los siguientes códigos o extractos de un programa:
movf DATO,0 ;DATO pasa a W. es el dato que se
call TABLA ;quiere extraer de la tabla
; Después que se regresa de la tabla con el valor del registro
; “DATO”, se saca este valor y se pasa a la salida del puerto
; que está controlando los 7 sgmentos de los displays.
movwf PORTB ;o puede ser PORTC o D, según el PIC
Es importante resaltar que el uso de las tablas elimina tener que utilizar un
decodificador y permite mostrar números, letras y algunos símbolos al manipular
directamente los 7 segmentos de un display.
Veamos los siguientes ejemplos del uso de las tablas en programas con estructura
de contadores y multiplexación de displays.
Ejemplo 1. Contador de 2 cifras estándar (00 a 99).
El diagrama de flujo es el mismo de contador ascendente de 2 cifras en la guía 3_2 de
microcontroladores I, de Rutinas intermedias.
Programa en Lenguaje Ensamblador:
LIST P=16F877A
INCLUDE P16F877A.INC
;**************************
;DECLARACIÓN DE REGISTROS=
;**************************
UNI EQU 20H
DEC EQU 21H
COPIA EQU 26H
PDel0 EQU 27H
CONTADOR EQU 28H
;**************************
ORG 00H
GOTO INICIO
INICIO BSF STATUS,5
MOVLW B'00000110'
MOVWF ADCON1
CLRF TRISA
MOVLW B'00001111'
MOVWF TRISB
CLRF TRISC
BCF STATUS,5
CLRF UNI
CLRF DEC
;****************************
;CONTADOR CLÁSICO DE 00 A 99
;****************************
EME CALL MOSTRAR
BTFSC PORTB,0 ;+1=0?
GOTO EME ;NO. VA A EXPLORAR DE NUEVO
ANTIREB1 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS
BTFSS PORTB,0 ;+1=1?
GOTO ANTIREB1
MOVF UNI,0 ;UNI A W
SUBLW .9
BTFSS STATUS,2 ;Z=1? UNI=9?
GOTO SUBEUNI
GOTO DECENA
SUBEUNI INCF UNI,1 ;UNI=UNI+1
GOTO EME
DECENA CLRF UNI
MOVF DEC,0 ;DEC A W
SUBLW .9
BTFSS STATUS,2 ;Z=1? DEC=9?
GOTO SUBEDEC
CLRF DEC
CLRF UNI
GOTO EME
SUBEDEC INCF DEC,1 ;DEC=DEC+1
GOTO EME
;**************************************************
;RUTINA MOSTRAR(INCLUYE CONVERSIONES BINARIO A BCD)
;**************************************************
MOSTRAR BCF PORTB,5 ;DISPLAY DEC OFF
BSF PORTB,4 ;DISPLAY UNI ON
;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=
;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)
MOVF UNI,0 ;UNI A W
CALL TABLA ;W VA A TABLA Y REGRESA CON VALOR DE UNI
MOVWF PORTC ;UNI ES SACADO HACIA LA TABLA
;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=
;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)
;MOVF UNI,0
;MOVWF PORTA ;UNIV A PORTA
CALL DELAY5MS
BSF PORTB,5 ;DISPLAY DEC ON
BCF PORTB,4 ;DISPLAY UNI OFF
;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=
;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)
MOVF DEC,0 ;DEC A W
CALL TABLA ;W VA A TABLA Y REGRESA CON VALOR DE DEC
MOVWF PORTC ;DEC ES SACADO HACIA LA TABLA
;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=
;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)
;MOVF
;MOVWF
CALL DELAY5MS
RETURN
;****************************************************************
;**********************SUBRUTINA DE TABLA************************
;****************************************************************
;CONVIERTE DATO BCD A 7SEGMENTOS, COMO SI FUERA UN DECODIFICADOR
;ESTA TABLA ES PARA ÁNODO COMÚN, SI ES PARA CÁTODO COMÚN SE DEBE
;INVERTIR LOS 0' POR 1' Y LOS 1' POR 0'
;****************************************************************
;IMPORTANTE: ¿PARA QUÉ SON ESTOS VA
;TOMEMOS EL PRIMERO= B’11000000’, RECORDANDO QUE ESTE DATO VA A SALIR
;POR UN PUERTO DE 8 BITS, SEA EL PORTB, PORTC O PORTD HACIA LOS 7 SEGMENTOS
;DE UN DISPLAY ÁNODO COMÚN:
;VEMOS QUE SE HA FORMADO EL CERO (0) Y ASÍ PA
;SE VERÁ EN EL EJEMPLO 3.
TABLA ADDWF
RETLW
RETLW
RETLW
RETLW
;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)
DEC,0
PORTA ;DECV A PORTA
DELAY5MS
;****************************************************************
;**********************SUBRUTINA DE TABLA************************
;****************************************************************
BCD A 7SEGMENTOS, COMO SI FUERA UN DECODIFICADOR
;ESTA TABLA ES PARA ÁNODO COMÚN, SI ES PARA CÁTODO COMÚN SE DEBE
;INVERTIR LOS 0' POR 1' Y LOS 1' POR 0'
;****************************************************************
;IMPORTANTE: ¿PARA QUÉ SON ESTOS VALORES QUE SE MUESTRAN EN LA TABLA?
;TOMEMOS EL PRIMERO= B’11000000’, RECORDANDO QUE ESTE DATO VA A SALIR
;POR UN PUERTO DE 8 BITS, SEA EL PORTB, PORTC O PORTD HACIA LOS 7 SEGMENTOS
;DE UN DISPLAY ÁNODO COMÚN:
;VEMOS QUE SE HA FORMADO EL CERO (0) Y ASÍ PARA CADA NÚMERO O LETRA COMO
;SE VERÁ EN EL EJEMPLO 3.
PCL,1
B'11000000' ;VALOR 0
B'11111001' ;VALOR 1
B'10100100' ;VALOR 2
B'10110000' ;VALOR 3
;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)
;****************************************************************
;**********************SUBRUTINA DE TABLA************************
;****************************************************************
BCD A 7SEGMENTOS, COMO SI FUERA UN DECODIFICADOR
;ESTA TABLA ES PARA ÁNODO COMÚN, SI ES PARA CÁTODO COMÚN SE DEBE
;****************************************************************
LORES QUE SE MUESTRAN EN LA TABLA?
;TOMEMOS EL PRIMERO= B’11000000’, RECORDANDO QUE ESTE DATO VA A SALIR
;POR UN PUERTO DE 8 BITS, SEA EL PORTB, PORTC O PORTD HACIA LOS 7 SEGMENTOS
RA CADA NÚMERO O LETRA COMO
RETLW B'10011001' ;VALOR 4
RETLW B'10010010' ;VALOR 5
RETLW B'10000011' ;VALOR 6
RETLW B'11111000' ;VALOR 7
RETLW B'10000000' ;VALOR 8
RETLW B'10011000' ;VALOR 9
;;;RUTINA 5MS GENERADA DEL PDEL;
DELAY5MS movlw .248 ; 1 set numero de repeticion
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END
Circuito en Proteus:
Ejemplo 2. Marcador para cancha de Bolas criollas.
Es el mismo ejercicio pero sin el uso del decodificador. Se migró a un PIC16F877 por no
alcanzar los pines del PIC16F84A. Asumir el mismo diagrama de flujo. Lo que varia es la
rutina de mostrar, ya que no se utiliza el decodificador.
Programa en Lenguaje Ensamblador:
LIST P=16F877A
INCLUDE P16F877A.INC
;**************************
;DECLARACIÓN DE REGISTROS=
;**************************
UNIV EQU 20H
DECV EQU 21H
UNIR EQU 22H
DECR EQU 23H
CONTAV EQU 24H
CONTAR EQU 25H
COPIA EQU 26H
PDel0 EQU 27H
CONTADOR EQU 28H
;**************************
ORG 00H
GOTO INICIO
INICIO BSF STATUS,5
MOVLW B'00000110'
MOVWF ADCON1
CLRF TRISA
MOVLW B'00001111'
MOVWF TRISB
CLRF TRISC
BCF STATUS,5
CLRF UNIV
CLRF DECV
CLRF UNIR
CLRF DECR
CLRF CONTAV
CLRF CONTAR
EME CALL MOSTRAR
BTFSC PORTB,0 ;+1V=0?
GOTO SIGUE1 ;NO. VA A -1V
ANTIREB1 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS
BTFSS PORTB,0 ;+1V=1?
GOTO ANTIREB1
MOVF CONTAV,0
SUBLW .24
BTFSS STATUS,2 ;Z=1? CONTAV=24?
GOTO SUBEV
GOTO EME
SUBEV INCF CONTAV,1 ;CONTAV=CONTAV+1
GOTO EME
SIGUE1 BTFSC PORTB,1 ;-1V=0?
GOTO SIGUE2 ;VA A +1R
ANTIREB2 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS
BTFSS PORTB,1 ;-1V=1?
GOTO ANTIREB2
MOVF CONTAV,0
SUBLW .0
BTFSS STATUS,2 ;Z=1? CONTAV=0?
GOTO BAJAV
GOTO EME
BAJAV DECF CONTAV,1 ;CONTAV=CONTAV-1
GOTO EME
SIGUE2 BTFSC PORTB,2 ;+1R=0?
GOTO SIGUE3 ;NO. VA A -1R
ANTIREB3 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS
BTFSS PORTB,2 ;+1R=1?
GOTO ANTIREB3
MOVF CONTAR,0
SUBLW .24
BTFSS STATUS,2 ;Z=1? CONTAR=24?
GOTO SUBER
GOTO EME
SUBER INCF CONTAR,1 ;CONTAR=CONTAR+1
GOTO EME
SIGUE3 BTFSC PORTB,3 ;-1R=0?
GOTO EME
ANTIREB4 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS
BTFSS PORTB,3 ;-1R=1?
GOTO ANTIREB4
MOVF CONTAR,0
SUBLW .0
BTFSS STATUS,2 ;Z=1? CONTAR=0?
GOTO BAJAR
GOTO EME
BAJAR DECF CONTAR,1 ;CONTAR=CONTAR-1
GOTO EME
;**************************************************
;RUTINA MOSTRAR(INCLUYE CONVERSIONES BINARIO A BCD)
;**************************************************
MOSTRAR CALL BIN_BCDV
CALL BIN_BCDR
BCF PORTB,7 ;DISPLAY DECROJO OFF
BCF PORTB,6 ;DISPLAY UNIROJO OFF
BCF PORTB,5 ;DISPLAY DECVERDE OFF
BSF PORTB,4 ;DISPLAY UNIVERDE ON
;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=
;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)
MOVF UNIV,0 ;UNIV A W
CALL TABLA ;W VA A TABLA Y REGRESA CON VALOR UNIV
MOVWF PORTC ;UNIV SE MUESTRA POR EL PORTC
;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=
;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)
;MOVF UNIV,0
;MOVWF PORTA ;UNIV A PORTA
CALL DELAY5MS
BCF PORTB,7 ;DISPLAY DECROJO OFF
BCF PORTB,6 ;DISPLAY UNIROJO OFF
BSF PORTB,5 ;DISPLAY DECVERDE ON
BCF PORTB,4 ;DISPLAY UNIVERDE OFF
;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=
;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)
MOVF DECV,0 ;DECV A W
CALL TABLA ;W VA A TABLA Y REGRESA CON VALOR DECV
MOVWF PORTC ;DECV SE MUESTRA POR EL PORTC
;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=
;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)
;MOVF DECV,0
;MOVWF PORTA ;DECV A PORTA
CALL DELAY5MS
BCF PORTB,7 ;DISPLAY DECROJO OFF
BSF PORTB,6 ;DISPLAY UNIROJO ON
BCF PORTB,5 ;DISPLAY DECVERDE OFF
BCF PORTB,4 ;DISPLAY UNIVERDE OFF
;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=
;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)
MOVF UNIR,0 ;UNIR A W
CALL TABLA ;W VA A TABLA Y REGRESA CON VALOR UNIR
MOVWF PORTC ;UNIR SE MUESTRA POR EL PORTC
;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=
;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)
;MOVF UNIR,0
;MOVWF PORTA ;UNIR A PORTA
CALL DELAY5MS
BSF PORTB,7 ;DISPLAY DECROJO ON
BCF PORTB,6 ;DISPLAY UNIROJO OFF
BCF PORTB,5 ;DISPLAY DECVERDE OFF
BCF PORTB,4 ;DISPLAY UNIVERDE OFF
;ESTA ES LA MODIFICACIÓN CUANDO NO SE TIENE UN DECODIFICADOR=
;NOTA= LOS SEGMENTOS DEL DISPLAY ESTÁN CONECTADOS AL PUERTO C (16F877A)
MOVF DECR,0 ;DECR A W
CALL TABLA ; W VA A TABLA Y REGRESA CON VALOR DECR
MOVWF PORTC ;DECR SE MUESTRA POR EL PORTC
;ESTAS INSTRUCCIONES SE USAN CUANDO SE TIENE UN DECODIFICADOR=
;NOTA= EL DECODIFICADOR ESTÁ CONECTADO POR EL PUERTO A (16F84A)
;MOVF DECR,0
;MOVWF PORTA ;DECR A PORTA
CALL DELAY5MS
RETURN
;******************************
;RUTINA DE BINARIO A BCD VERDE:
;******************************
BIN_BCDV CLRF UNIV
CLRF DECV
CLRF COPIA
MOVF CONTAV,0
MOVWF COPIA
SUBEDV MOVLW .10
SUBWF COPIA,1
BTFSC STATUS,0
GOTO SUBEDECV
GOTO SUBEUV
SUBEDECV INCF DECV,1
GOTO SUBEDV
SUBEUV MOVLW .10
ADDWF COPIA,1
SUBEU2V MOVLW .1
SUBWF COPIA,1
BTFSS STATUS,0
RETURN
SUBEU3V INCF UNIV,1
GOTO SUBEU2V
;******************************
;RUTINA DE BINARIO A BCD ROJO:
;******************************
BIN_BCDR CLRF UNIR
CLRF DECR
CLRF COPIA
MOVF CONTAR,0
MOVWF COPIA
SUBEDR MOVLW .10
SUBWF COPIA,1
BTFSC STATUS,0
GOTO SUBEDECR
GOTO SUBEUR
SUBEDECR INCF DECR,1
GOTO SUBEDR
SUBEUR MOVLW .10
ADDWF COPIA,1
SUBEU2R MOVLW .1
SUBWF COPIA,1
BTFSS STATUS,0
RETURN
SUBEU3R INCF UNIR,1
GOTO SUBEU2R
;****************************************************************
;**********************SUBRUTINA DE TABLA************************
;****************************************************************
;CONVIERTE DATO BCD A 7SEGMENTOS, COMO SI FUERA UN DECODIFICADOR
;ESTA TABLA ES PARA ÁNODO COMÚN, SI ES PARA CÁTODO COMÚN SE DEBE
;INVERTIR LOS 0' POR 1' Y LOS 1' POR 0'
;****************************************************************
TABLA ADDWF PCL,1
RETLW B'11000000' ;VALOR 0
RETLW B'11111001' ;VALOR 1
RETLW B'10100100' ;VALOR 2
RETLW B'10110000' ;VALOR 3
RETLW B'10011001' ;VALOR 4
RETLW B'10010010' ;VALOR 5
RETLW B'10000011' ;VALOR 6
RETLW B'11111000' ;VALOR 7
RETLW B'10000000' ;VALOR 8
RETLW B'10011000' ;VALOR 9
;;;RUTINA 5MS GENERADA DEL PDEL;
DELAY5MS movlw .248 ; 1 set numero de repeticion
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END
Circuito en Proteus:
Ejemplo 3. Contador de 3 etapas.
Para este ejemplo se asume que cada etapa va a contar 6 eventos. Este número
puede ser modificado a gusto del usuario. Aquí se introduce el uso de las letras que es
una de las ventajas de no utilizar decodificadores, ya que estos limitan la visualización del
0 al 9.
En cada etapa, se muestra un mensaje de 2 letras y al lado el contador de los
eventos.
Se muestra una tabla en la que contiene lo que considero pueden ser la tabla más
completa de números, letras y algunos símbolos que pueden mostrarse en un display
convencional de 7 segmentos.
El diagrama de flujo es simple. A continuación:
RB0= +1
RB4= DISPLAY UNI
RB5= DISPLAY DEC
RB6= DISPLAY LETRA1
RB7= DISPLAY LETRA2
PORTC= SALIDA A LOS SEGMENTOS
Programa en Lenguaje Ensamblador:
LIST P=16F877A
INCLUDE P16F877A.INC
;**************************
;DECLARACIÓN DE REGISTROS=
;**************************
UNI EQU 20H
DEC EQU 21H
LETRA1 EQU 22H
LETRA2 EQU 23H
CONTA EQU 24H
COPIA EQU 26H
PDel0 EQU 27H
PDel0A EQU 29H
PDel1 EQU 2AH
CONTADOR EQU 28H
;**************************
ORG 00H
GOTO INICIO
INICIO BSF STATUS,5
MOVLW B'00000110'
MOVWF ADCON1
CLRF TRISA
MOVLW B'00001111'
MOVWF TRISB
CLRF TRISC
BCF STATUS,5
CLRF UNI
CLRF DEC
CLRF CONTADOR
;***************************************
;MENSAJE DE INICIO CON TODAS LAS LETRAS
;***************************************
;ESTE MENSAJE MUESTRA TODOS LOS NÚMEROS Y LETRAS DE LA TABLA
ENTRADAMSJ CALL MOSTRAR2
MOVF CONTADOR,0
SUBLW .37
BTFSS STATUS,2
GOTO SUBELETRA
CLRF CONTADOR
GOTO ETAPA1
SUBELETRA INCF CONTADOR,1
CALL RET05S
GOTO ENTRADAMSJ
;***************************************
;***************************************
;***************************************
ETAPA1 MOVLW .26
MOVWF LETRA2
MOVLW .14
MOVWF LETRA1
EME CALL MOSTRAR
BTFSC PORTB,0 ;+1=0?
GOTO EME ;NO. SIGUE PREGUNTANDO POR SENSOR
ANTIREB1 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS
BTFSS PORTB,0 ;+1=1?
GOTO ANTIREB1
MOVF CONTA,0
SUBLW .6
BTFSS STATUS,2 ;Z=1? CONTA=24?
GOTO SUBE
GOTO ETAPA2
SUBE INCF CONTA,1 ;CONTA=CONTA+1
GOTO EME
ETAPA2 CLRF CONTA
MOVLW .35
MOVWF LETRA1
MOVLW .1
MOVWF LETRA2
EME2 CALL MOSTRAR
BTFSC PORTB,0 ;+1=0?
GOTO EME2 ;NO. SIGUE PREGUNTANDO POR SENSOR
ANTIREB2 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS
BTFSS PORTB,0 ;+1=1?
GOTO ANTIREB2
MOVF CONTA,0
SUBLW .6
BTFSS STATUS,2 ;Z=1? CONTA=24?
GOTO SUBE2
GOTO ETAPA3
SUBE2 INCF CONTA,1 ;CONTA=CONTA+1
GOTO EME2
ETAPA3 CLRF CONTA
MOVLW .23
MOVWF LETRA1
MOVLW .20
MOVWF LETRA2
EME3 CALL MOSTRAR
BTFSC PORTB,0 ;+1=0?
GOTO EME3 ;NO. SIGUE PREGUNTANDO POR SENSOR
ANTIREB3 CALL MOSTRAR ;EQUIVALE A DELAY DE CALL DELAY5MS
BTFSS PORTB,0 ;+1=1?
GOTO ANTIREB3
MOVF CONTA,0
SUBLW .6
BTFSS STATUS,2 ;Z=1? CONTA=24?
GOTO SUBE3
CLRF CONTA
GOTO ETAPA1
SUBE3 INCF CONTA,1 ;CONTA=CONTA+1
GOTO EME3
;**************************************************
;****************RUTINA MOSTRAR******************
;****************INCLUYE (NÚMEROS)****************
;****************INCLUYE (LETRAS)*******************
;**************************************************
MOSTRAR CALL BIN_BCD
BCF PORTB,7 ;DISPLAY LETRADEC OFF
BCF PORTB,6 ;DISPLAY LETRAUNI OFF
BCF PORTB,5 ;DISPLAY CONTADEC OFF
BSF PORTB,4 ;DISPLAY CONTAUNI ON
MOVF UNI,0
CALL TABLA
MOVWF PORTC
CALL DELAY5MS
BCF PORTB,7 ;DISPLAY LETRADEC OFF
BCF PORTB,6 ;DISPLAY LETRAUNI OFF
BSF PORTB,5 ;DISPLAY CONTADEC ON
BCF PORTB,4 ;DISPLAY CONTAUNI OFF
MOVF DEC,0
CALL TABLA
MOVWF PORTC
CALL DELAY5MS
BCF PORTB,7 ;DISPLAY LETRADEC OFF
BSF PORTB,6 ;DISPLAY LETRAUNI ON
BCF PORTB,5 ;DISPLAY CONTADEC OFF
BCF PORTB,4 ;DISPLAY CONTAUNI OFF
MOVF LETRA1,0
CALL TABLA
MOVWF PORTC
CALL DELAY5MS
BSF PORTB,7 ;DISPLAY LETRADEC ON
BCF PORTB,6 ;DISPLAY LETRAUNI OFF
BCF PORTB,5 ;DISPLAY CONTADEC OFF
BCF PORTB,4 ;DISPLAY CONTAUNI OFF
MOVF LETRA2,0
CALL TABLA
MOVWF PORTC
CALL DELAY5MS
RETURN
;***********************************************
;MUESTRA LETRAS Y SÍMBOLOS EN TODOS LOS DISPLAYS
;***********************************************
MOSTRAR2 BSF PORTB,7 ;DISPLAY LETRADEC ON
BSF PORTB,6 ;DISPLAY LETRAUNI ON
BSF PORTB,5 ;DISPLAY CONTADEC ON
BSF PORTB,4 ;DISPLAY CONTAUNI ON
MOVF CONTADOR,0
CALL TABLA
MOVWF PORTC
RETURN
;*********************************
;RUTINA DE BINARIO A BCD CONTADOR:
;*********************************
BIN_BCD CLRF UNI
CLRF DEC
CLRF COPIA
MOVF CONTA,0
MOVWF COPIA
SUBED MOVLW .10
SUBWF COPIA,1
BTFSC STATUS,0
GOTO SUBEDEC
GOTO SUBEU
SUBEDEC INCF DEC,1
GOTO SUBED
SUBEU MOVLW .10
ADDWF COPIA,1
SUBEU2 MOVLW .1
SUBWF COPIA,1
BTFSS STATUS,0
RETURN
SUBEU3 INCF UNI,1
GOTO SUBEU2
;*****************************************************************
;********SUBRUTINA DE TABLA DE NUMEROS, LETRAS Y SIMBOLOS*********
;*****************************************************************
;MUESTRA VARIAS LETRAS O SÍMBOLOS QUE SE PUEDEN MOSTRAR EN DISPLAY
;ESTA TABLA ES PARA ÁNODO COMÚN, SI ES PARA CÁTODO COMÚN SE DEBE
;INVERTIR LOS 0' POR 1' Y LOS 1' POR 0'
;*****************************************************************
TABLA ADDWF PCL,1 ;PUNTERO O ENCABEZADO DE LA TABLA
RETLW B'11000000' ;0. VALOR 0
RETLW B'11111001' ;1. VALOR 1
RETLW B'10100100' ;2. VALOR 2
RETLW B'10110000' ;3. VALOR 3
RETLW B'10011001' ;4. VALOR 4
RETLW B'10010010' ;5. VALOR 5
RETLW B'10000011' ;6. VALOR 6
RETLW B'11111000' ;7. VALOR 7
RETLW B'10000000' ;8. VALOR 8
RETLW B'10011000' ;9. VALOR 9
RETLW B'10001000' ;10. A
RETLW B'10000011' ;11. b
RETLW B'11000110' ;12. C
RETLW B'10100001' ;13. d
RETLW B'10000110' ;14. E
RETLW B'10001110' ;15. F
RETLW B'10010000' ;16. g
RETLW B'10001001' ;17. H
RETLW B'11001111' ;18. I
RETLW B'11100001' ;19. J
RETLW B'11000111' ;20. L
RETLW B'10101011' ;21. n
RETLW B'10100011' ;22. o
RETLW B'10001100' ;23. P
RETLW B'10101111' ;24. r
RETLW B'10010010' ;25. S
RETLW B'11000001' ;26. U
RETLW B'10010001' ;27. Y
RETLW B'10101011' ;28. SIMBOLO1
RETLW B'10101010' ;29. SIMBOLO2
RETLW B'11001001' ;30. SIMBOLO3
RETLW B'11011100' ;31. SIMBOLO4
RETLW B'11110000' ;32. SIMBOLO5
RETLW B'10011100' ;33. SIMBOLO6
RETLW B'10110110' ;34. SIMBOLO NIVEL ALTO
RETLW B'10110111' ;35. SIMBOLO NIVEL MEDIO
RETLW B'11110111' ;36. SIMBOLO NIVEL BAJO
;LÍMITE DE TABLA2= 37 (DEL 0 AL 36)
;;;RUTINA 5MS GENERADA DEL PDEL;
DELAY5MS movlw .248 ; 1 set numero de repeticion
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;;;RUTINA 0,5SEG GENERADA DEL PDEL
RET05S NOP
ret5 movlw .245 ; 1 set numero de repeticion (B)
movwf PDel0A ; 1 |
PLoop1X movlw .254 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2X clrwdt ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2X ; 2 no, loop
decfsz PDel0A, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1X ; 2 no, loop
PDelL1X goto PDelL2X ; 2 ciclos delay
PDelL2X clrwdt ; 1 ciclo delay
return
END ; FIN DEL PROGRAMA
Circuito en Proteus:
Ejemplo 4. Semáforo 4 esquinas simple.
En este ejemplo se muestra el uso de dos tablas, una para mostrarse por el puerto A y otra
para mostrarse por el puerto B. Ambos puertos manipulan los 12 bombillos que poseería el
semáforo 4 esquinas.
El diagrama de flujo muestra los estados de tiempo largo, cuando el semáforo esta en rojo
o en verde y los estados de tiempo corto, cuando está en amarillo.
Este ejemplo es limitado a un semáforo sencillo de 4 esquinas, sin embargo puede
modificarse separando cada etapa con tiempos distintos a los que se muestran a
continuación.
Diagrama de flujo
INICIO
ConfigurarPuerto A y B
Declarar registro:CONTA, CONTA2,PDel0, PDel1
¿Se pulsóINICIO?
CONTA= CONTA +1
NO
SI
SI
Inicializar registros:CONTA, CONTA2
Puerto A y B
Delay 30 seg
¿CONTA=7?
CONTA= 0
1
MOSTRAR
CONTA → W
W → PORTB
Return
TABLA1
TABLA1
W + PCL → PCL
Return
Retornamos con el valoren W extraido de la tabla
correspondiente alPuerto B
MOSTRAR
MOSTRAR
Delay 5 seg
1
CONTA= CONTA +1
1
NO
CONTA → W
W → PORTA
TABLA2 TABLA2
W + PCL → PCL
Return
Retornamos con el valoren W extraido de la tabla
correspondiente alPuerto A
LIST P=16F84A
INCLUDE P16F84A.INC
CONTA EQU 20H ;Registro contador de estados del semáforo
CONTA2 EQU 21H ;Registro para las rutinas de tiempo de 30 y 5 segundos
PDel0 EQU 22H ;Registros para las rutinas de tiempo de 1 segundo
PDel1 EQU 23H
PDel2 EQU 24H
ORG 00H
GOTO INICIO
INICIO BSF STATUS,5
CLRF TRISB ;Puerto B como salida
MOVLW B'00010000' ;RA4= Entrada y el Resto como salidas
MOVWF TRISA
BCF STATUS,5
Delay 30 seg
SI
Inicializar registro:CONTA2
¿CONTA2=29?CONTA2= CONTA2 +1NO
Delay 1 seg
Return
Delay 5 seg
SI
Inicializar registro:CONTA2
¿CONTA2=4?CONTA2= CONTA2 +1NO
Delay 1 seg
Return
Delay 1 segundo
La sacamos del PDEL
Return
CLRF CONTA ;INICIALIZAMOS LOS REGISTROS Y PUERTOS
CLRF CONTA2
CLRF PORTA
CLRF PORTB
NCICLO CALL MOSTRAR
CALL DELAY30S ;Se inicia la primera cuenta del 1er estado
INCF CONTA,1
CALL MOSTRAR ;Se llama a subrutina mostrar
CALL DELAY5S ;Se espera el estado amarillo
MOVLW 07H
SUBWF CONTA,0 ;Se pregunta si se llegó al final de los estados
;del semáforo
BTFSS STATUS,2
GOTO SUBE
CLRF CONTA
GOTO NCICLO
SUBE INCF CONTA,1
GOTO NCICLO
;***************************************************
;RUTINA PARA MOSTRAR LOS DATOS EXTRAIDOS DE LA TABLA
;POR LOS PUERTOS A Y B
;***************************************************
MOSTRAR MOVF CONTA,0
CALL TABLA1
MOVWF PORTB
MOVF CONTA,0
CALL TABLA2
MOVWF PORTA
RETURN
;********************************
;RUTINA DE RETARDO DE 30 SEGUNDOS
;********************************
DELAY30S CLRF CONTA2
OTRO CALL RET1S
MOVLW D'10'
SUBWF CONTA2,0
BTFSS STATUS,2
GOTO PREVIO
RETURN
PREVIO INCF CONTA2,1
GOTO OTRO
;*******************************
;RUTINA DE RETARDO DE 5 SEGUNDOS
;*******************************
DELAY5S CLRF CONTA2
OTRO2 CALL RET1S
MOVLW D'4'
SUBWF CONTA2,0
BTFSS STATUS,2
GOTO PREVIO2
RETURN
PREVIO2 INCF CONTA2,1
GOTO OTRO2
;**************************************************
;RUTINA DE TIEMPO DE 1 SEGUNDO GENERADA POR EL PDEL
;**************************************************
RET1S movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;*************************************
;TABLA QUE CONTIENE EL ESTADO DE LOS
;BOMBILLOS CONTROLADOS POR EL PUERTO B
;**************************************
TABLA1 ADDWF PCL,1
RETLW B'10110011' ;4CH;
RETLW B'10110101' ;4AH;
RETLW B'10011110' ;61H;
RETLW B'10101110' ;51H;
RETLW B'11110110' ;09H;
RETLW B'01110110' ;89H;
RETLW B'10110110' ;49H;
RETLW B'10110110' ;49H;
;*************************************
;TABLA QUE CONTIENE EL ESTADO DE LOS
;BOMBILLOS CONTROLADOS POR EL PUERTO A
;*************************************
TABLA2 ADDWF PCL,1
RETLW B'00001101' ;02H;
RETLW B'00001101' ;02H;
RETLW B'00001101' ;02H;
RETLW B'00001101' ;02H;
RETLW B'00001100' ;03H;
RETLW B'00001101' ;02H;
RETLW B'00000111' ;08H;
RETLW B'00001011' ;04H;
END
Circuito en Proteus: