You are on page 1of 4

Prctica Programacin PIC16F84

Objetivos
El objetivo de la prctica es realizar ejercicios de programacin de los recursos de Entrada/Salida en un microcontrolador Pic16F84. Estos ejercicios se hacen en torno a un circuito propuesto que implementa un reloj digital con alarma. La prctica se puede probar sobre el emulador MPLAB del PIC, que es de libre disposicin y se encuentra instalado tambin en las aulas de ordenadores. Se trata de programar una rutina de servicio de interrupcin cuyo objetivo sea actualizar correctamente estas variables en memoria: Unidades y Decenas de Horas, Unidades y Decenas de Minutos y Segundos, junto con un programa principal que convertir esos valores y los mostrar en Displays LED de 7 segmentos. Para ello se usar el temporizador Timer0 del chip y se aprovechar su capacidad de provocar interrupciones, como se detalla ms abajo. Suponer que la frecuencia del reloj al que est conectado el chip es de 4 MHz (la que en la documentacin aparece como Fosc). Leer detenidamente el resumen de los recursos de E/S del PIC que aparece ms abajo para decidir cules usaremos y cmo programaremos las opciones que controlan esos recursos. Pondremos el cdigo de inicializacin de esos recursos en el programa principal y en la direccin 0004h escribiremos nuestra rutina de servicio de interrupcin. Se usar la plantilla de cdigo adjunta que ya hace parte del trabajo (preserva acumulador y Status al entrar en la rutina de interrupcin y los restaura al salir de ella) y nos servir para empezar. El algoritmo es muy simple, se trata de incrementar en la rutina de interrupcin un contador (o mejor varios contadores, de forma anidada). Supongamos que programamos la interrupcin del timer para que interrumpa cada cierto perodo de tiempo fijo. En cada interrupcin, y despus de incrementar nuestro primer contador, compararemos su valor con el nmero de cuentas necesario para que pase un segundo, si es igual a esa cuenta, pondremos a cero ese primer contador e incrementaremos nuestra variable dedicada a contar segundos, si es inferior, saldremos de la rutina de interrupcin. Despus de incrementar los segundos, comprobaremos si dicha variable llega a 60, momento en el que la pondremos a cero e incrementaremos nuestra variable de unidades de minuto. Igual haremos para incrementar decenas de minutos y las horas a partir de las decenas de minutos, y para pasar de las 24h a las 00h (comparacin algo ms difcil, porque involucra dos dgitos). En el programa principal, despus de haber inicializado convenientemente los recursos de E/S (programacin del timer, habilitacin de la interrupcin, direccin de puertos) nos quedaremos en un bucle permanentemente, en el que iremos trasladando el contenido de las variables que se actualizan en la rutina de interrupcin a los puertos de salida que gobiernan lo que se visualiza en el display. Si en cualquier momento los dos pulsadores son accionados simultneamente, se debern poner todas las variables de cuenta de la hora a cero a modo de reseteo. Opcionalmente se podr aadir cualquier otro elemento que acerque la prctica a su funcionamiento real (gestin de los pulsadores, alarma, puntos de segundos,)

Correccin de la Prctica
Todos los miembros del grupo se presentarn con el fichero conteniendo la plantilla completada con su programa listo para introducirlo en el emulador MPLAB. El funcionamiento de la prctica se

discutir con el profesor y se realizarn preguntas sobre la realizacin de la misma. El plazo para la presentacin de la prctica ser, como regla general, hasta una semana antes de la fecha de entrega de actas de cada convocatoria. Resumen de los Recursos de Entrada/Salida del PIC Temporizacin
Para la medida del tiempo usaremos el temporizador (Timer0) del Pic, el esquema de funcionamiento de este mdulo es el de la figura. Esencialmente el timer permite contar flancos de subida o bajada de una de dos posibles fuentes de seal de reloj: un pin externo (el RA4/T0CKI, se llama as precisamente por su doble funcin RA4, y Timer0 Clock Input) o bien una fuente interna de

frecuencia que se corresponde con la del reloj principal externo que gobierna el PIC dividida por 4 (esto nos da precisamente la frecuencia a la que el PIC ejecuta instrucciones, la inversa es justo lo que tarda una instruccin que no sea un salto). La fuente del reloj se selecciona mediante el bit T0CS del registro OPTION_REG (0 el oscilador interno, 1 el pin externo). La frecuencia de la fuente seleccionada puede ser reducida dividiendo por 2, 4, 8, 16, 32, 64, 128 256 que es la misin del contador preescalador. El preescalador se activa poniendo a cero el bit PSA del registro OPTION_REG, mientras que el divisor se selecciona con la configuracin de otros tres bits PS2..PS0 del OPTION_REG. Evidentemente, si no lo activamos no hay divisin, se mantiene la frecuencia original. Despus de una etapa de sincronizacin, la seal se introduce en el contador de 8 bits Timer0 propiamente, que cuenta continuamente los pulsos que llegan a su entrada y que es un registro (TMR0, direccin 01h) que podemos leer y escribir. El sobrepasamiento en la cuenta (de FFh a 00h) es una de los posibles orgenes o fuentes de interrupcin de las que dispone el PIC. Al cargar con algn valor el TMR0 la cuenta del preescalador se resetea convenientemente.

Puertos de Entrada/Salida RA y RB
Los bits del puerto RA son cinco, mientras que los del RB son ocho. Ambos puertos son bidireccionales. El sentido se cambia escribiendo en los registros TRISA y TRISB (direcciones 85h y 86h, respec.). Escribiendo un 0 en alguno de los cinco bits menos significativos de TRISA haremos que el bit correspondiente RA sea una salida, mientras que si escribimos un 1, haremos que ese bit en RA sea una entrada. El TRISB funciona igual, pero son tiles sus ocho bits. Para leer o escribir en esos puertos emplearemos los registros PORTA y PORTB (direcciones 05h y 06h, respectivamente). El puerto RB tiene la particularidad de que en entrada se puede activar en todos sus bits un pull-up dbil, que implica que, si no tenemos un elemento conectado a esos bits que est proporcionando un 0 activamente, el valor de ese bit ser 1. Esta caracterstica de pull-up dbil se desactiva en los bits programados como salidas, y se puede activar en todos a la vez poniendo a cero el bit 7 (-RBPU) del registro OPTION_REG (direccin. 81h)

Interrupciones
Este PIC dispone de cuatro posibles eventos o fuentes de interrupcin: el pin externo RB0/INT, el sobrepasamiento en el Timer0, el cambio en los pines RB7..RB4 del puerto B, y el final de la escritura en la EEPROM de datos. El registro de control de interrupciones INTCON (direccin 0Bh) contiene un bit por cada uno de los tres primeros tipos de interrupcin que sirve para identificar cul ha tenido lugar (INTF, T0IF y RBIF), y tambin contiene un bit por cada tipo de interrupcin para su habilitacin/deshabilitacin (INTE, T0IE, RBIE y EEIE, a cero se impide la interrupcin correspondiente). Finalmente, existe un bit de habilitacin/deshabilitacin global GIE que permite prohibir todas las interrupciones cuando se pone a cero o permitir solo las habilitadas por sus bits individuales cuando est a uno. El proceso de una interrupcin es el siguiente: cuando se produce el servicio de una interrupcin, el bit GIE se pone a cero deshabilitando cualquier posible nueva interrupcin, la direccin de vuelta del programa interrumpido se guarda en la pila y se salta a la direccin de memoria de programa 0004h,

donde se debe colocar la rutina de atencin a la interrupcin. En esta rutina, se puede averiguar la fuente de la interrupcin comprobando el estado de INTF, T0IF y RBIF, si hubiera la posibilidad de que estuvieran habilitadas ms de una. Es muy importante recordar que el bit que est activado indicando el tipo de interrupcin debemos ponerlo a cero antes de salir de la rutina de servicio, para evitar que se siga produciendo la misma interrupcin infinitas veces. En esta rutina debemos evitar cambiar el estado del programa interrumpido. En particular, debemos conservar el acumulador W y el registro de STATUS del momento en el que se produce la interrupcin, guardndolos en variables si se fueran a modificar (ver plantilla, donde ya est implementado esto). Una vez hecho el trabajo en la rutina de servicio, se restauran acumulador y STATUS y se vuelve al programa interrumpido con la instruccin RETFIE. Dicha instruccin recupera la direccin de vuelta de la pila y activa el bit GIE, permitiendo que ocurran nuevas interrupciones.

Descripcin del circuito


Como se observa en la figura, se dispone de un display conectado a los bits de los puertos RA y RB del Pic. El display est organizado como cuatro dgitos de LEDS de 7-segmentos. Los segmentos que forman cada dgito son diodos LED que tienen un nodo comn por dgito (pines D1 a D4 A1 a A4 en el circuito), Los ctodos de cada LED (pines a, b, , e) de los cuatro dgitos se encuentran unidos entre s, de forma que realmente en cada instante de tiempo, se puede poner una nica configuracin en un nico dgito. Para visualizar un dgito, se debera poner una tensin positiva en su nodo y una tensin baja en el ctodo de cada uno de los segmentos que se quieran encender. Para lograr visualizar los cuatro dgitos a la vez, conmutaremos rpidamente la tensin en el nodo de un dgito a otro, cambiando tambin la configuracin del dgito en los ctodos correspondientes. Esto lo haremos por programa, cambiando la salida del puerto RA para seleccionar el dgito activo y actuando sobre los bits del puerto RB para poner la configuracin de cada segmento LED de ese dgito seleccionado. Para ello, el puerto RB se programa con todos los bits como salidas para conectar los pines comunes a, b, c (posiblemente a travs de una resistencia limitadora de corriente, no representada en la figura) y, por otro lado, para hacer el sistema ms resistente a errores de programacin y ahorrar bits, usaremos dos bits en salida del puerto RA (RA0 y RA1) conectados a un decoder 2 a 4 para activar los 4 nodos correspondiendo con los cuatro dgitos. Para no cargar el decoder con la intensidad relativamente elevada que absorben los LEDS, usaremos cuatro transistores controlados en su base por el decoder. Conectaremos a dos de los bits del registro RA en entrada dos pulsadores para el reseteo, puesta en hora, alarma, etc. y finalmente un bit del registro RA en salida servir para activar un zumbador de alarma

Circuito del Reloj (arriba) y Detalle del Display (abajo)

You might also like