PRACTICA 4

Anuncio
Pedro Guerrero Amado.Marzo 2002
PRACTICA 4.
REALIZAR ENCENDIDO-APAGADO DE DIODOS
LED
DESCRIPCIÓN.
En esta práctica vamos a realizar el encendido y apagado de diodos led. Para ellos
iremos activando y desactivando las salidas de la puerta B. Entre encendido y apagado
llamaremos a una rutina de retardo.
ORDINOGRAMA.
Pedro Guerrero Amado.Marzo 2002
SUBRUTINAS.
La mayoría de los microcontroladores incluyen en su repertorio de instrucciones
algunas que permiten saltar a una rutina y, cuando se complementa su ejecución, retornar al
programa principal
El empleo de subrutinas aporta muchas ventajas entre las que se destacan las siguientes:
1. Se pueden escribir como subrutinas secciones de código y ser empleadas en muchos
programas ( por ejemplo, la subrutina de exploración de un teclado ).
2. Dan a los programas un carácter modular, es decir, se pueden codificar diferentes
módulos para usarlos en cualquier programa.
3. Se reduce notablemente el tiempo de programación, la detección de errores,
usando repetidamente una subrutina.
4. El código es más fácil de interpretar, dado que las instrucciones de las subrutinas no
aparecen en el programa principal. Solo figuran las llamadas CALLs.
INSTRUCCIONES CALL Y RETURN.
La instrucción CALL ( llamada la subrutina) consigue que la ejecución del
programa continúe en la dirección donde se encuentra la subrutina a la que hace referencia.
Es similar a GOTO pero coloca en la pila la dirección de la siguiente instrucción que se
debe ejecutar después de la CALL.
La subrutina finaliza con la instrucción RETURN (Retorno de la subrutina) que
retoma la dirección guardada en le pila y la coloca en el contador del programa PC
continuando el flujo de control con la instrucción que sigue a la CALL.
En la familia PIC de gama media la pila tiene ocho niveles de memoria del tipo
FIFO (primero en entrar, último en salir). Si se produce la llamada a una subrutina durante
la ejecución de otra subrutina, la dirección de retorno de esta segunda es colocada en la
cima de la pila sobre la dirección anterior. Esta segunda dirección es la primera en salir de
la pila mediante la instrucción RETURN.
Con la pila de ocho niveles, una subrutina puede llamar a otra y ésta, a su vez,
llamar a otra hasta un máximo de ocho. La gama baja sólo puede realizar dos llamadas de
este tipo al poseer una pila de sólo dos niveles.
Pedro Guerrero Amado.Marzo 2002
Gama baja
Las subrutinas deben colocarse al comienzo de las páginas debido a que el bit 8 del
contador del programa es puesto a 0 por la instrucción CALL (o por cualquier instrucción
que modifica el PC). Las subrutinas deben colocarse en la mitad inicial de las páginas (las
256 palabras)
Gama media.
En las instrucciones de salto relativo, el resultado de la misma afecta solo a los 8
bits de menos peso del PC. Los 5 bits de mas peso se suministran desde PCLATH<4:0>.
En las instrucciones GOTO y CALL los 11 bits de menos peso del PC se
suministran desde el código OP. Los dos bits de mas peso del PC se cargan con los bits
<4:3> del registro PCLATH. Como la memoria de programa se organiza en paginas de 2k,
la posición la seleccionan los 11 bits de menos peso, mientras que con los 2 bits de mas
peso del PC se elige la pagina.
Rutina de retardo
Empleamos como retardo una rutina basada en el tiempo que se tarda en ejecutar
una instrucción.
El código empleado es el siguiente:
retardos
DECFSZ cont1,f
GOTO retardos
;decrementamos cont1, si es 0 saltamos
;sino volvemos a bucles
DECFSZ cont2,f
GOTO retardos
;igual pero con cont2
;
DECFSZ uno,f
GOTO retardos
RETURN
END
En primer lugar hacemos un bucle decrementando el registro cont1, una vez llegado
a 0 salta y decrementamos el cont2, y vuelve al primer bucle. Con el tercero pasa igual, por
lo tanto repetiremos el bucle primero tantas veces como valga cont2 y los dos anteriores
tantas como valga uno. Por lo tanto hay que tener en cuenta que cada instrucción dura 1µS
y las de salto duran 2 µS para calcular el tiempo que dura la rutina de retardo.
Cargando el valor de uno con 1 son aproximadamente 0,2 µS.
Pedro Guerrero Amado.Marzo 2002
LISTADO DEL PROGRAMA FUENTE
;
encendido alternativo de los ocho diodos led
LIST P=PIC16F84
LIST C=132
#DEFINE banco1 BSF 0x03,5
#DEFINE banco0 BCF 0x03,5
;DECLARACION REGISTROS Y VARIABLES
porta
portb
trisa
trisb
status
cont1
cont2
uno
w
f
EQU 0x05
EQU 0x06
EQU 0x5
EQU 0x6
EQU 0x03
EQU 0xc
EQU 0dh
EQU 0xe
EQU 0
EQU 1
ORG 0
GOTO inicio ; salvamos el vector de interrupción
ORG 5
inicio
banco1
; seleccionamos banco 1 de registros
CLRF trisb ; ponemos trisb a 0, puerta B como salidas
MOVLW 0x1f
MOVWF trisa ;ponemos a como entradas
banco0
; seleccionamos banco 0
principal
CLRF portb ; ponemos todas las salidas a 0
CALL poner_a
CALL retardos
MOVLW 0xff
MOVWF portb
;
CALL poner_a
CALL retardos
GOTO principal
poner_a
MOVLW
0xff
MOVWF cont1
;MOVEMOS FF A W Y cargamos
;cont1 y cont2 con ff
Pedro Guerrero Amado.Marzo 2002
MOVWF cont2
;
MOVLW 0x1 ;
MOVWF uno ;igual
RETURN
;
RUTINA DE RETARDO DE VALOR APROX. 0,2 * valor de variable uno
retardos
DECFSZ cont1,f
GOTO retardos
;decrementamos cont1, si es 0 saltamos
;sino volvemos a bucles
DECFSZ cont2,f
GOTO retardos
;igual pero con cont2
;
DECFSZ uno,f
GOTO retardos
RETURN
END
Utilizamos la directiva define para cambiar de banco de registros.
Descargar