E.P.S.
de Ingeniera de Gijn Curso 2007-2008
Prcticas de Dispositivos Electrnicos Programables curso 5 Ingeniera Industrial (IEA)
Prctica 6 Convertidor A/D: realizacin de un voltmetro digital Se pretende realizar un programa que se encargue de medir continuamente una tensin analgica comprendida entre 0 y 5V y mostrar su valor en voltios, en 3 displays de 7 segmentos de nodo comn (con segmento adicional de punto decimal). La medida se realizar mediante un canal de entrada del mdulo de conversin Analgico a Digital de un microcontrolador PIC16F877 ( en su versin PIC16F877A) que dispone de un oscilador de 4MHz. La tensin se introduce en la entrada analgica 0 del PORTA (RA0) que se puede variar mediante un potencimetro disponible en la placa de entrenamiento de prcticas PICDEM2 plus. Para conseguir la visualizacin en los displays, a la placa de entrenamiento se le aade una placa de circuito impreso mediante un conector vertical, esta placa responde al esquema elctrico que se adjunta en la figura 2 (es la que se ha usado en prcticas anteriores).
Figura 1.- Elementos a utilizar para la prctica
1 de 8
E.P.S. de Ingeniera de Gijn Curso 2007-2008
Prcticas de Dispositivos Electrnicos Programables curso 5 Ingeniera Industrial (IEA)
VCC
R2 RA1 1K2 S0 7 S1 6 S2 4 S3 2 S4 1 S5 9 S6 10 DISP_C A B C D E F G
R6 4K7 Q1 BC557 RA2
R3
R5 4K7 Q1 BC557 RA3
R4
R7 4K7 Q1 BC557
1K2 S0 7 S1 6 S2 4 S3 2 S4 1 S5 9 S6 10 DISP_D A B C D E F G S0 7 S1 6 S2 4 S3 2 S4 1 S5 9 S6 10
1K2 DISP_U A B C D E F G
S7 DP 5
S7 DP 5
S7 DP 5
A2 3 A1 8
A2 3 A1 8
A2 3 A1 8
HDSP-5301 VCC GND RA2 RD0 RD2 RD4 RD6 J1 1 3 5 7 9 11 13 + + + + + + + + + + + + + + 2 4 6 8 10 12 14 +5V RA1 RA3 RD1 RD3 RD5 RD7 RD0 RD6 RD4 RD3 RD1 RD5 RD2 RD7 1 2 3 4 5 6 7 8
HDSP-5301
HDSP-5301
R1 16 15 14 13 12 11 10 9 S0 S6 S4 S3 S1 S5 S2 S7
Conector IDC14
8x100 ohmios
Figura 2.- Esquema elctrico de la placa de displays Un posible planteamiento: Se utiliza el mdulo A/D para realizar la conversin de la entrada de tensin del canal analgico 0. Se configura el mdulo A/D para que utilice el reloj basado en la red RC interna independiente del oscilador del microcontrolador (valor nominal de Tad de 4s y con una variacin posible entre 2s y 6s). Se lanza la conversin con el canal seleccionado y se activa la generacin de interrupciones cuando finalice dicha conversin. El mdulo A/D puede proporcionar el resultado con una resolucin de 10 bits (de b9 a b0) en dos registros: ADRESH y ADRESL, pudiendo realizarse la justificacin del resultado a la izquierda, con este resultado: ADRESH ADRESL b9 b8 b7 b6 b5 b4 b3 b2 b1 b0 0 0 0 0 0 0 o bien con justificacin a la derecha y con este otro formato: ADRESH ADRESL 0 0 0 0 0 0 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
2 de 8
E.P.S. de Ingeniera de Gijn Curso 2007-2008
Prcticas de Dispositivos Electrnicos Programables curso 5 Ingeniera Industrial (IEA)
Dado que la precisin de 8 bits resulta suficiente, configuraremos el resultado con justificacin a la izquierda y tomaremos el resultado proporcionado en los 8 bits del registro ADRESH, despreciando los dos bits menos significativos de la conversin presentes en ADRESL. En el programa de tratamiento de la interrupcin se recoge el valor resultante de la conversin en el registro ADRESH de 8 bits y se convierte el valor a su equivalente de tensin en voltios. Como la tensin de referencia es de 5V, la resolucin del convertidor empleando 8 bits es de 5V/256 = 0,0195V/bit (195E-4 V). Realizando el producto (subprograma que se desarrollar posteriormente) del valor resultante por 195 obtendremos un valor de tensin analgica comprendida entre 0 y 49725 diezmilsimas de voltio (0 y 49725*10-4V). Empleando las diezmilsimas de voltio como unidad de medida, se puede almacenar el valor en binario en dos bytes y lo podemos descomponer en sus 5 dgitos BCD (con un subprograma que se detallar posteriormente) para la representacin en los displays, nicamente de los 3 dgitos ms significativos (voltios, dcimas y centsimas). El programa displays que permanencia realizada con principal ejecutar un bucle continuo de barrido de los 3 representan los voltios con dos decimales, se asegura la de cada dgito durante 5ms mediante una temporizacin el mdulo TMR0.
El bucle de barrido recoger los valores a mostrar de unas posiciones denominadas BCD2 y BCD1 que sern cargadas mediante el subprograma que realiza la conversin del dato binario de 16 bits que representa las diezmilsimas de voltio a BCD : BCD2: 0 BCD1: Unidades de mil BCD0: Decenas Decenas de mil Centenas Unidades
Estas posiciones sern modificadas por tanto tras la conversin del resultado digital en el programa de tratamiento de interrupcin. Nos debemos asegurar que hayan transcurrido 2Tad (8s) y el tiempo de adquisicin antes de lanzar la nueva conversin (el propio programa de tratamiento lo asegura), pondremos a cero el flag de indicacin de fin de conversin (ADIF) y arrancaremos una nueva conversin antes de retornar del programa de tratamiento.
3 de 8
E.P.S. de Ingeniera de Gijn Curso 2007-2008
Prcticas de Dispositivos Electrnicos Programables curso 5 Ingeniera Industrial (IEA)
Detalle del Subprograma que realiza la multiplicacin de dos bytes (PRODUCTO_2)
Realiza el producto de los 8 bits contenidos en FACTOR1 por los 8 bits almacenados en la posicin FACTOR2 y el resultado en conjunto, va a parar a dos posiciones denominadas: BIN_ALTO + BIN_BAJO FACTOR2 = b7 b6 b5 b4 b3 b2 b1 b0 FACTOR1 = a7 a6 a5 a4 a3 a2 a1 a0 Operacin a realizar para la multiplicacin en binario: Resultado = FACTOR1 * FACTOR2 = b0 * FACTOR1 + b1 * (2 * FACTOR1) + + b2 * (2 * (2 * FACTOR1)) + ...+ b7 * (2*(2*(2*(2*(2*(2*(2*FACTOR1))))))) Cada multiplicacin por 2 en binario consiste en realizar un desplazamiento a la izquierda introduciendo un cero por la derecha, tras cada desplazamiento se realiza la suma o no en funcin del bit bi correspondiente a FACTOR2 La operacin total a realizar desde dentro hacia fuera sera: 0 FACTOR1 0000000 + 00 FACTOR1 000000 + 000 FACTOR1 00000 + 0000 FACTOR1 0000 + 00000 FACTOR1 000 + 000000 FACTOR1 00 + 0000000 FACTOR1 0 + 00000000 FACTOR1 * b7 * b6 * b5 * b4 * b3 * b2 * b1 * b0
4 de 8
E.P.S. de Ingeniera de Gijn Curso 2007-2008
Prcticas de Dispositivos Electrnicos Programables curso 5 Ingeniera Industrial (IEA)
Para realizar estas operaciones que se irn acumulando, debemos operar con los bytes BIN_ALTO y BIN_BAJO en conjunto: BIN_ALTO BIN_BAJO
Las sucesivas multiplicaciones por 2 de FACTOR1 se almacenan en dos bytes encadenados que se denominan SUMA_ALTO (parte alta a sumar) & SUMA_BAJO (parte baja a sumar): SUMA_ALTO SUMA_BAJO Subprograma de conversin de Binario a BCD (BINBCD)
Se puede utilizar cualquiera de los ejemplos de conversin de Binario a BCD que estn disponible en la Web de la asignatura
5 de 8
E.P.S. de Ingeniera de Gijn Curso 2007-2008
Prcticas de Dispositivos Electrnicos Programables curso 5 Ingeniera Industrial (IEA)
Algoritmo desarrollado: INICIALIZACIN CONVERTIDOR A/D: o Entrada RA0 como analgica y referencia de 5V, resto entradas digitales. El resultado de la conversin lo recogeremos ajustado a la izquierda (los 8 bits ms significativos en el registro ADRESH) o Reloj de conversin Tad basado en red RC interna (4s) o Canal analgico de entrada: canal 0. PUERTOS: o PORTA (RA1, RA2 y RA3 con salidas para activacin de los displays, resto de las lneas como entradas). o PORTD (salida para control de los segmentos) TMR0: definido en modo temporizador y con prescaler de 32 para temporizar posteriormente 5 ms. INTERRUPCIONES: habilitar las de fin de conversin A/D con la mscara particular ADIE en PIE1, mscara de perifricos PEIE y global GIE en registro INTCON. Se borra a su vez el flan ADIF del registro PIR1. Inicializamos variables BCD2 y BCD1 (valores a mostrar en los displays) hasta que se acabe la primera conversin Se lanza la primera conversin A/D poniendo el bit GO a 1 (en el registro ADCON0)
BUCLE DE BARRIDO DE LOS DISPLAYS Centsimas de voltio: Activacin del display poniendo la combinacin de entrada adecuada en el PORTA Extraemos el valor de la parte baja de BCD1 Bsqueda en la tabla de los led a iluminar y los sacamos al PORTD (Subprograma TABLALED) Espera durante 5 ms (llamada a Subprograma ESPERA) Tiempo muerto: apagamos todos los segmentos Dcimas de voltio: dem extrayendo los 4 bits altos de BCD1 Unidades de voltio: dem extrayendo los 4 bits bajos de BCD2 Adems, para las unidades de voltio se activa el punto decimal del display para marcar la separacin (RD7 se pone a 0) Se vuelve al inicio del bucle de barrido de los displays 6 de 8
E.P.S. de Ingeniera de Gijn Curso 2007-2008
Prcticas de Dispositivos Electrnicos Programables curso 5 Ingeniera Industrial (IEA)
SUBPROGRAMA ESPERA Se precarga TMR0 con un valor de 100 para conseguir desbordamiento al cabo de 5 ms: 5ms 4/4MHz * 32 * (256-100) Se pone a 0 el flag T0IF Nos situamos en un bucle de espera hasta que T0IF se ponga a 1 Retornamos del subprograma
PROGRAMA DE TRATAMIENTO DE LA INTERRUPCIN Comprobamos que el flag ADIF est a 1 (fin de conversin A/D) Se salva el contexto del programa principal (W, STATUS y PCLATH) Tomamos el resultado de la conversin en ADRESH Lo cargamos en la posicin FACTOR1 Cargamos 195 en FACTOR2 Llamamos a subprograma PRODUCTO_2 para realizar la multiplicacin de FACTOR1 por FACTOR2 Se recoge el resultado en dos bytes (BIN_ALTO BIN_BAJO) y se descompone en sus 5 dgitos decimales con el subprograma BINBCD Finalizamos el programa de tratamiento poniendo a 0 el flag ADIF Recuperamos el contexto (PCLATH, STATUS y W) Lanzamos una nueva conversin poniendo de nuevo GO a 1
Subprograma PRODUCTO_2 Realiza el producto de los 8 bits contenidos en FACTOR1 por los 8 bits almacenados en la posicin FACTOR2 y el resultado en conjunto, va a parar a dos posiciones denominadas: BIN_ALTO + BIN_BAJO (vase detalle del algoritmo en el planteamiento inicial) Subprograma BINBCD Se encarga de tomar los 16 bits almacenados en las posiciones BIN_ALTO y BIN_BAJO y devuelve los 5 dgitos BCD correspondientes a la representacin decimal de ese valor que almacena en 3 posiciones de RAM: BCD2 0 Unidades de Voltio BCD1 Dcimas de V Centsimas de V BCD0 Milsimas de V Diezmilsimas de V 7 de 8
E.P.S. de Ingeniera de Gijn Curso 2007-2008
Prcticas de Dispositivos Electrnicos Programables curso 5 Ingeniera Industrial (IEA)
PRCTICA 6.- TRABAJO COMPLEMENTARIO PARA LOS ALUMNOS Sobre el diseo anterior, se pide a los alumnos que realicen la siguiente modificacin: Se registrarn a nivel interno tanto el valor mximo como el mnimo histrico desde el momento del encendido o desde el ltimo reset del sistema y se mostrarn esos valores cuando se acte sobre los pulsadores conectados a RA4 y RB0. El valor mximo aparecer en los displays mientras se mantenga pulsado el pulsador conectado a RA4 El valor mnimo aparecer en los displays mientras se est actuando sobre el pulsador conectado a RB0. En el supuesto de que ambos pulsadores estn simultneamente activados, se mostrar el valor mximo. Si durante el intervalo de tiempo en el que se est actuando sobre cualquiera de los pulsadores se modifica el valor (mximo o mnimo) que se est mostrando, ste deber ser actualizado y visualizarse instantneamente.
8 de 8