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.