Beruflich Dokumente
Kultur Dokumente
TTULO DEL TFC: Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC TITULACIN: Ingeniera Tcnica de Telecomunicaciones, especialidad Telemtica AUTOR: Agurtzane Ramrez Mendoza DIRECTOR: Francesc Josep Snchez Robert FECHA: 7 de Julio de 2006
Ttulo: Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC Autor: Agurtzane Ramrez Mendoza Director: Francesc Josep Snchez Robert Fecha: 7 de Julio de 2006
Resum El objetivo de este Trabajo de Fin de Carrera es servir de referencia para una prctica de la asignatura de Sistemas Electrnicos Digitales. Se disear el hardware y el software necesario para que, paso a paso, los alumnos de esta asignatura entren en contacto con el mundo de los microcontrolador, y ms concretamente con el PIC16F87XA. Mediante pasos sencillos el alumno tomar contacto con los perifricos ms importantes de este microcontrolador, formndose una base consistente para la aplicacin de estos conocimientos en futuros proyectos, ya sean propuestos por el profesor o a desarrollar completamente por el alumno. Este proyecto ha sido llevado a cabo con la colaboracin de la Factora de Recursos Docentes de esta escuela entre los meses de marzo y julio del 2006.
Title: Application for digital systems teaching: "A digital real-time termometer and its serial connection to a PC" Author: Agurtzane Ramrez Mendoza Director: Francesc Josep Snchez Robert Date: July, 7th 2006
Overview The aim of this Final project is to be a reference for a practice of Electronic Digital Systems. Hardware and software will be designed so, this subject's pupils start to manage microcontroller's field, and more specifically, with PIC16F87XA. Easily, the student will get to know most important peripheral devices of this microcontroller, achieving a good basis for the appliance of these knowledgements in future projects. These projects would be offered by the teacher or completely developed by the student. This project has been carried out with the help of "Factora de Recursos Docentes" belonging to this school between March and July 2006.
AGRADECIMIENTOS
Llegado a este punto del camino que menos que hacer una mencin ms que especial a las personas que han contribuido de una u otra forma a que est a punto de finalizar esta etapa. En primer lugar, en todos los aspectos, a mi ama. No solo por el sacrificio econmico que ha supuesto para ella este mi objetivo, sino por su apoyo ms que incondicional, por sus nimos necesarios y por su gran e incuestionable esfuerzo. En segundo lugar, a mi padre, porque es una de las referencias ms importantes de mi vida y tambin, por haber despertado en m la curiosidad y la aficin por el mundo de la electrnica. A Jonatan, por haber estado todo este tiempo. A mis nias porque aunque no hayamos tenido la vida universitaria que vemos en las pelculas, no cambiaba una tarde de las pasadas en el aula de estudio con ellas, por ninguna salvaje fiesta universitaria. Porque cada una, y son muchas, me ha aportado algo importante, porque son personas especiales, y me hacen sentir privilegiada. A los chicos de Algorta, por las grandes fiestas que he compartido con ellos y que han ayudado a vivir este tiempo con un poco ms de intensidad. Por los nimos, y por su conversacin y su compaa. A la gente fantstica que he conocido en esta escuela, que han conseguido que un empiece con mal pie, se vaya a convertir en una dura despedida. Al resto de mi familia, por su comprensin, y a la gente que de una forma u otra han compartido estos aos conmigo, muchas gracias. Tengo que agradecer tambin a la Factora de Recursos Docentes por haberme cedido un espacio de trabajo durante este tiempo. Y por ltimo, agradecer de forma especial a mi tutor, Sr. Francesc Josep Snchez Robert, por permitirme realizar este proyecto, que ha resultado ser todo un placer, y por su ayuda, preocupacin y dedicacin.
NDICE
INTRODUCCIN ............................................................................................. 11 CAPTULO 1. MICROCONTROLADORES ..................................................... 13
1.1 1.2 1.3 Introduccin ..................................................................................................................... 13 PIC..................................................................................................................................... 14 Enunciado del Proyecto.................................................................................................. 15 1.3.1 Diagrama de bloques del proyecto....................................................................... 15
CAPTULO 2. SOFTWARE.............................................................................. 17
2.1 Programas a utilizar ........................................................................................................ 17 2.1.1 Proteus ................................................................................................................. 17 2.1.1.1 Introduccin....................................................................................................... 17 2.1.1.2 Instalacin ......................................................................................................... 17 2.1.2 MPLAB.................................................................................................................. 19 2.1.2.1 Introduccin....................................................................................................... 19 2.1.2.2 Instalacin ......................................................................................................... 19 2.1.2.3 Creacin de un proyecto ................................................................................... 20 2.1.2.4 Compilacin de un proyecto.............................................................................. 21 2.1.2.5 Grabacin del PIC con el PICSTART PLUS ..................................................... 22 2.1.3 Grabacin del PIC con el IC-Prog ........................................................................ 25
3.2
4.3
5.2 5.3
Conexin del PIC ............................................................................................................. 43 Cdigo del PIC ................................................................................................................. 44 5.3.1 Programa principal ............................................................................................... 44 5.3.2 Configurar puertos................................................................................................ 45 5.3.3 Calcular signo y valor ........................................................................................... 46 Convierte a 7 segmentos ................................................................................................ 49 A pantalla.......................................................................................................................... 50 Montaje ............................................................................................................................. 50
CAPTULO 8. LABVIEW.................................................................................. 67
8.1 8.2 8.3 8.4 Introduccin ..................................................................................................................... 67 Cdigo .............................................................................................................................. 67 Conexin .......................................................................................................................... 68 Labview............................................................................................................................. 68
Introduccin ..................................................................................................................... 87
2.2 2.3
2.3.1 ADC de rampa digital ...................................................................................................... 90 2.3.2 ADC de aproximaciones sucesivas ............................................................................... 90 2.3.3 ADC Flash......................................................................................................................... 91 2.4 Conversor analgico digital del PIC .............................................................................. 92
ANEXO 3
3.1
INTERRUPCIONES.................................................................... 97
Introduccin ..................................................................................................................... 97
ANEXO 4
4.1 4.2 4.3 4.4 4.5
Caractersticas bsicas del puerto IO. ........................................................................ 101 Puerto serie sncrono.................................................................................................... 103 Puerto serie asncrono.................................................................................................. 104 PIC. USART .................................................................................................................... 106 El estndar RS232 ......................................................................................................... 109
ANEXO 5
5.1 5.2 5.3 5.4
Cdigo del termmetro con displays. ......................................................................... 113 Cdigo del eco. .............................................................................................................. 115 Cdigo del termmetro que enva un men por el puerto serie............................... 116 Cdigo del termmetro que enva la temperatura por el puerto serie.................... 119
Introduccin
11
INTRODUCCIN
Este TFC va a servir de referencia a los alumnos de la asignatura de SED para la realizacin de una completa prctica utilizando el microprocesador PIC. Mediante la realizacin de esta prctica y de forma progresiva el alumno tomar contacto con el mundo de los microprocesadores, se estudiar y se pondr en prctica los conocimientos adquiridos de los diferentes perifricos y una parte de las funcionalidades de la familia de los PICs tales como, el modulo A/D, USART, configuracin de puertos. Todo ello mediante la utilizacin de los programas MPlab para la definicin del cdigo, Proteus para la simulacin del PIC, IcProg para el grabado del chip En los anexos se encuentra informacin detallada de todo lo que se va a utilizar en el desarrollo del proyecto, siendo necesario su lectura y comprensin para poder desarrollar este ejercicio. En el CAPTULO 1. MICROCONTROLADORES, se har una introduccin al objetivo de este trabajo, y ser una primera toma de contacto del alumno con los microcontroladores, en especial con el que es objeto de este proyecto, el PIC16F877A. El CAPTULO 2. SOFTWARE, es un pequeo manual sobre la instalacin y uso de los programas necesarios para el desarrollo de este proyecto. En el CAPTULO 3. SENSOR Y CIRCUITO ACONDICIONADOR, se realizar la parte analgica de la prctica, con estudio de las funciones de las rectas que describen el funcionamiento del sensor, y cuales son los pasos necesarios para poder llevar la informacin que nos proporciona el sensor hasta nuestro microcontrolador. En el CAPTULO 4. PIC. MDULO CONVERSOR AD empezaremos por fin a trabajar con el PIC, siendo la primera toma de contacto con el perifrico encargado de convertir la informacin analgica en bytes, para permitir al PIC que trabaje con estos datos. En el siguiente captulo, el CAPTULO 5. PIC, simularemos por primera vez un circuito con un PIC, mediante el software Proteus, y ya estaremos en posicin de implementar este diseo en una placa Millenium Board. El CAPTULO 6. PIC. USART, ser donde aprendamos a utilizar la comunicacin a travs del puerto serie que nos permite este microcontrolador, con la realizacin de diferentes ejemplos.
12
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
En el CAPTULO 7.PIC. Simulacin, juntaremos todas las piezas diseadas hasta ahora para conseguir un termmetro con conexin serie a PC. El ltimo captulo, el CAPTULO 8. LABVIEW, ser el final del viaje. En el modificaremos el programa que hemos diseado en el captulo anterior, para transferir el valor de la temperatura, a una aplicacin realizada con este programa. En el que una interfaz grfica nos mostrar la temperatura registrada por el sensor en la placa Millenium Board.
Microcontroladores
13
CAPTULO 1. MICROCONTROLADORES
Este captulo es una introduccin al proyecto que vamos a realizar. En el se explican los conceptos bsicos de los microcontroladores y el proyecto en si..
1.1
Introduccin
El ttulo de este TFC es, Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC.
Pero, Que es un microcontrolador? Un microcontrolador es un circuito integrado, o chip que incluye las tres unidades funcionales de un ordenador: la CPU, la memoria y unidades de E/S, es decir, se trata de un computador completo en un solo circuito integrado. Y todo esto para qu? Un microcontrolador es un microprocesador optimizado para ser utilizado en el control de equipos electrnicos. Mientras podemos encontrar uno o dos microprocesadores de propsito general en cualquier hogar, podemos llegar a convivir con una o dos docenas de microcontroladores. Pueden estar en casi cualquier dispositivo elctrico como en lavadores, hornos-microondas, telfonos, automviles, etc. Un microcontrolador se diferencia de una CPU normal en que es ms fcil convertirlo en un ordenador en funcionamiento, con un nmero mnimo de chips de apoyo. La idea es que este chip se coloque en el dispositivo, se le proporcione la energa y la informacin que necesite y ya est. Un microprocesador tradicional no permitira hacer esto, ya que espera que todas estas tareas sean manejadas por otros chips especializados. Por ejemplo, un microcontrolador tpico tendr un generador de reloj integrado, y una pequea cantidad de memoria RAM y ROM/EPROM/EEPROM, es decir, que para hacerlo funcionar todo lo que se necesita son unos pocos programas de control y un cristal de sincronizacin. Los microcontroladores disponen tambin generalmente de una gran variedad de dispositivos de entrada /salida, como convertidores analgico a digital, temporizadores, USART... Estos dispositivos integrados, normalmente pueden ser controlados por instrucciones de procesadores especializados. En el mercado se encuentran una gran variedad de fabricantes nosotros vamos a trabajar con un microcontrolador fabricado por Microchip, el PIC 16F877A.
14
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
1.2
PIC
Los PIC son una familia de microcontroladores tipo RISC fabricados por Microchip Technology Inc. y derivados del PIC1650, originalmente desarrollado por la divisin de microelectrnica de General Instruments. En la siguiente Fig. 1.1 se muestra el diagrama de bloques del PIC16F877A, que con que vamos a trabajar, este diagrama est en el datasheet de Microchip, disponible en su pgina Web [1].
Fig. 1.1
Microcontroladores
15
1.3
Se desea realizar mediante un microcontrolador PIC, el diseo de un termmetro. Este debe ser capaz de medir temperaturas desde -10C hasta los 40C. Esta temperatura deber mostrarse a travs de cuatro displays led de 7 segmentos y tambin se desea la posibilidad de enviar y recibir esta temperatura, mediante la conexin serie, a un PC cualquiera. En este PC deber de estar ejecutndose una aplicacin que recoja la temperatura y la muestre a travs de una interfaz de usuario.
1.3.1 Diagrama de bloques del proyecto El diagrama de bloques de nuestro proyecto es el siguiente:
Sensor
PC
Displays de 7 segmentos
Cada parte de este proyecto ser diseado con detalle en los prximos captulos
Software
17
CAPTULO 2. SOFTWARE
En este captulo vamos a aprender a instalar los programas que vamos a necesitar a lo largo de este proyecto, as como el funcionamiento bsico de los mismos.
2.1
Programas a utilizar
2.1.1 Proteus
2.1.1.1 Introduccin
Proteus es un software mediante el cual simularemos el circuito con el PIC. Gracias a el podremos comprobar si el programa que vamos a almacenar en el PIC har que el proyecto funcione tal como esperbamos. 2.1.1.2 Instalacin
Vamos a instalar la versin 6.9 del programa Proteus. La pantalla de inicio de la instalacin es la siguiente:
Fig. 2. 1
Seleccionamos Install Proteus y se iniciar el asistente para la instalacin. Dejamos todas las opciones por defecto, y el Proteus se instala.
18
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
En el proceso de elaboracin de este proyecto, nos encontramos con problemas para la simulacin de ciertos componentes, y la aparicin de errores tales como los de la Fig. 2. 2 que nos impedan la ejecucin de la simulacin.
Fig. 2. 2
Error en la simulacin.
Para solucionarlo la nica opcin que encontramos fue instalar las libreras de la versin anterior del Proteus, la 6.8. Para ello iniciamos el asistente de la instalacin del Proteus v6.8.
Fig. 2. 3
Software
19
Fig. 2. 4
Una vez realizado este pequeo ajuste ya estamos preparados para utilizar el Proteus.
2.1.2 MPLAB
2.1.2.1 Introduccin
Este programa lo utilizaremos para desarrollar la parte software del proyecto y para programar el PIC insertndolo en el grabador PICSTART, conectado al puerto serie del PC. 2.1.2.2 Instalacin
Ejecutamos el asistente de la instalacin de MPLAB. Una vez instalado el programa es necesario instalar el compilador HI-TECH, que es mediante el cual vamos a compilar nuestro software, y el que generar los ficheros .hex necesarios para grabar el PIC. Una vez instalado el HI-TECH deberemos indicar en el MPLAB que es este el compilador que vamos a utilizar y lo haremos en Project->Select Language Toolsuite:
20
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Fig. 2. 5
Una vez realizado esto ya estamos preparados para utilizar este programa para disear el cdigo que almacenaremos en el PIC.
2.1.2.3
Creacin de un proyecto
Para crear un nuevo proyecto vamos al men Project -> Project Wizard. Con ayuda de este asistente creamos un nuevo proyecto. Nos pedir que seleccionemos el dispositivo, el PIC 16F877A, y tambin tendremos que seleccionar el HI-TECH como nuestro compilador, por ltimo le daremos nombre y un directorio donde almacenarlo, despus nos dar la posibilidad de aadirle algn archivo, esto de momento no lo vamos a hacer, porque todava no lo tenemos. Una vez hecho esto nos aparecer la siguiente ventana Fig. 2. 6:
Software
21
Ahora en el men File -> New, creamos un nuevo archivo, lo salvamos como *.c y lo aadimos a los archivos fuente del proyecto. En este archivo es donde vamos a implementar nuestro cdigo, que ser el que marque la configuracin y el funcionamiento del PIC. 2.1.2.4 Compilacin de un proyecto
Una vez que hayamos escrito nuestro cdigo en c, tendremos que compilarlo para que de esta forma se puedan depurar los errores y una vez est todo correcto se generen los archivos que ms tarde grabaremos en el PIC (o configuraremos al componente del Proteus para que lo simule). Para ello, y aunque al crear el programa lo hayamos indicado as, podemos comprobar que en el men Configure -> Select Device, se encuentra el modelo de microcontrolador que nos interesa. En el men Programmer->Select Programmer indicaremos None ya que de momento no vamos a programar el PIC, y elegiremos en Debugger->Select Tool ->MPLAB SIM. Una vez hecho esto estaremos listos para compilar el programa Project->Built All.
Una vez compilado el programa con el software MPLAB, este nos indica si todo se ha realizado correctamente, en la ventana Build veremos los archivos que han sido creados, lo que nuestro programa va a ocupar en la memoria del microcontrolador y el mensaje de que la compilacin se ha realizado con xito.
22
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
2.1.2.5
Para programar el PIC podemos optar entre la grabacin con el programa ICProg y con el PICSTART PLUS. Para grabar el PIC con el PICSTART PLUS lo haremos a travs del MPLAB. Primero hay que comprobar que el PIC soporta la herramienta del PICSTART Plus, para ello vamos a Configure-> Select Device, aqu seleccionamos el PIC que vamos a programar, en nuestro caso el 16F877A.
Una vez que seleccionamos el dispositivo nos muestra las herramientas de programacin que soporta, comprobamos que el PICSTART Plus est entre ellas (indicador en verde) y proseguimos. Antes de grabar el PIC deberemos comprobar que los bits de configuracin tienen las opciones correctas Fig. 2. 9:
Software
23
Ahora tenemos que seleccionar a PICSTART Plus como nuestro programador, para ello seleccionamos en el men Programmer-> Select Programmer-> PICSTART Plus:
Despus de haber seleccionado el PICSTART Plus, se generarn una serie de cambios en el men: El men de la pestaa Programmer cambiar para incluir el Men PICSTART Plus. Aparecer una nueva barra de Programmer. El nombre del programador aparecer en la barra de status.
24
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
El programador usa por defecto el COM1 como puerto serie de comunicaciones, si lo queremos modificar podemos ir a Programmer>Settings, y seleccionar pestaa de Communications:
Software
25
Una vez habilitado se activarn las opciones del nuevo men, y ya podremos programar nuestro PIC. Podemos usar el men de Programmer, o los iconos que se han generado al seleccionar el PISTART Plus, de esta forma podemos borrar el PIC (Erase Flash Device), comprobar que el chip est vaco (Blank Check All), programar el PIC (Program) y/o verificar que se ha grabado correctamente (Verify).
26
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
En ella podemos configurar a travs de que puerto vamos a conectar la tarjeta grabadora, en nuestro caso ser por el COM1, as que no modificamos eso. El programador es JDM Programmer, y la interfaz tiene que ser Direct I/O, as que no es necesario modificar nada de esta ventana, se podr volver a acceder a ella desde el programa (Men Ajustes-> Tipo Hardware, o F3). Una vez instalado el programa podemos ver la pantalla principal.
Para trabajar con ms comodidad seleccionamos el espaol como lenguaje del programa:
Software
27
Al abrir el programa nos da error, la pgina http://autric.com/Microbotica%20y%20Mecatronica/icprog.htm nos aclara que el problema puede ser por utilizar Windows XP as que, tal como se nos indica, va a ser necesario realizar unos ajustes antes de poder utilizar el programa. Lo primero que tenemos que hacer es descargarnos el archivo icprog.sys, podemos descargarlo desde http://www.mercaelectronica.com/descargas/index.htm, y copiarlo en la misma carpeta donde tengamos el programa. Despus vamos al men Opciones >Miscelnea y seleccionamos la opcin Habilitar Driver NT/2000/XP.
A partir de este momento el programa se resetea y est preparado para programar nuestro PIC. El primer paso es seleccionar el PIC que vamos a utilizar, en este caso 16F873A.
28
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Una vez el PIC est insertado en la tarjeta la conectamos mediante un cable serie con conectores DB9 hembra hembra. Desde este momento podemos leer el PIC, borrarlo y/o programarlo. Para ello podemos utilizar los iconos que se encuentran en la barra de tareas del programa: Con este icono podremos leer el contenido del chip. Este icono nos permitir borrar el chip. Este es el icono que utilizaremos para grabarlo. Antes de grabar el chip es necesario seleccionar un archivo .hex. Utilizaremos el que nos ha generado el MPLAB.
Este es el icono que nos permite abrir un fichero para grabarlo en el chip.
En la siguiente ventana podemos seleccionar que se verifiquen los bytes que se van a graban. Esto aumentar algo el tiempo de programacin pero nos dar ms seguridad.
Software
29
31
3.1
Temperatura (C)
LM35A
Tensin (Vd)
Fig. 3. 1
Pero, que tensin nos ofrece el sensor? Como vara en funcin de la temperatura? Para contestar a estas preguntas debemos de buscar la informacin necesaria en su datasheet (pgina 75). De todas las caractersticas elctricas que contiene el datasheet Cules son las que ms nos interesan? Sabiendo que forma tiene su recta caracterstica podremos saber que valor de tensin nos dar con cada temperatura. Por esto necesitamos saber cuanto aumenta la tensin por cada grado centgrado (ganancia de tensin): La ganancia media del sensor es de 10mV/C.
Segn el datasheet el sensor sigue una funcin lineal, de tal forma que su recta caracterstica se podr expresar de la siguiente forma:
32
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Vd= Ss T
[3. 1]
Y sabiendo que aumenta 10 mv con cada grado Centgrado, podremos deducir que su funcin caracterstica mostrada en la Fig. 3. 2 sigue la siguiente ecuacin:
[3. 2]
Fig. 3. 2
33
Fig. 3. 3
Para poder trabajar con una alimentacin nica en todo el circuito, y con el rango de temperaturas previsto (-10C < =T<= +40C), obtenemos una seal diferencial a travs de del siguiente circuito:
Fig. 3. 4
Si colocsemos un voltmetro que midiese la tensin que nos ofrece el sensor, podramos saber la temperatura que est registrando en ese momento. En nuestro caso utilizaremos un PIC para que procese la informacin.
3.2
Acondicionador de seal.
3.2.1 Objetivo del acondicionador de seal
En el siguiente captulo, el CAPTULO 4. PIC. MDULO CONVERSOR AD, hablaremos del perifrico del PIC destinatario de la seal producida por este circuito acondicionador, de momento lo nico que necesitamos saber, a parte de que su funcin es convertir una seal analgica en un valor digital, es que admite valores de tensin de entre 0 y 5 v. Como acabamos de ver en la Fig. 3. 2 los valores de tensin que nos va a ofrecer el termmetro en el rango de temperaturas que necesitamos (-10C / +40C) va desde -100 mv y 400mv. Esta es la razn por la cual necesitamos este circuito acondicionador de tensin, debemos
34
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Fig. 3. 5
Este circuito amplificar la seal recibida del sensor, y la adaptar al rango de tensiones que necesitamos. El objetivo de este circuito se muestra en la siguiente grfica:
20
25
30
35
40
Fig. 3. 6 Relacin entre tensin de entrada y tensin de salida del acondicionador de tensin.
VO= So T + VA
[3. 3]
VO(v)= 0,100(V/C) T + 1 V
[3. 4]
35
Teniendo en cuenta que un amplificador operacional como el del circuito mostrado en la Fig. 3. 7 tiene una funcin de transferencia tal que:
VO= KD VD + VA
[3. 5]
VO= So T + VA
[3. 6]
Vamos a realizar los clculos necesarios para saber cuales son los valores de las resistencias del circuito. Asignamos a So el valor de KD* Ss, de esta forma podemos describir definitivamente la funcin en los siguientes trminos:
VO = KD Ss T (C) + VA
[3. 7]
Donde KD= R1/R2. Para hallar el valor de las resistencias conociendo el valor que debemos de asignar a KD:
[3. 8]
36
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Como referencia de tensin VA (VREF en el circuito) tendremos un valor de 1,00v. Las resistencias tendrn el valor de 50K y 500k . Una vez diseado el circuito acondicionador de seal, nos hace falta disear el circuito que nos ofrezca la referencia de tensin. Utilizaremos de nuevo el amplificador operacional AD8631 en la siguiente configuracin:
Fig. 3. 9
Mdulo conversor AD
37
4.1
Introduccin
Segn lo que se explica en el ANEXO 2, en la pgina 96, para realizar una conversin hay que seguir dos pasos principales, en el primero configurar el mdulo y en el segundo las interrupciones necesarias.
T (C)
Sensor
Vd (v)
Circuito acondicionador
Vo (v)
Byte
Mdulo ADC (Perifrico del PIC)
PIC
Fig. 4. 1
4.2
38
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Fig. 4. 2
Mdulo conversor AD
39
digitales, menos el A0, que ser analgico, y como tensin de referencia tendremos la de alimentacin del PIC.
4.3
Otra forma de determinar cuando se ha realizado la conversin completa es usando las interrupciones del ADC. Este mtodo permite al PIC continuar con otros procesos hasta que la conversin del ADC haya finalizado y se genere automticamente una interrupcin. Para ello habr que resetear el bit ADIF que indica que la interrupcin se ha realizado por el mdulo AD, habilitar las interrupciones por este perifrico (ADIE=1), habilitar las interrupciones provocadas por los perifricos (PEIE=1), habilitar las interrupciones (GIE=1), y por fin, despus de un par de ciclos de
40
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
instruccin empezar con la conversin (ADGO=1). Todo esto se muestra en el siguiente diagrama de flujo:
Fig. 4. 3
Mdulo conversor AD
41
siguiente conversin ADC se tiene que realizar en otro canal de entrada, el nuevo canal de entrada deber seleccionarse mediante los bits CHS2:CHS0. Si la siguiente conversin ADC se realiza en el mismo canal, no es necesario modificar estos bits.
Fig. 4. 4 Diagrama de flujo del cdigo que se realizar cuando se produzca una interrupcin.
PIC
43
CAPTULO 5. PIC
En este capitulo vamos a programar el PIC, y podremos realizar la primera simulacin en el Proteus del circuito. Ms tarde ya estaremos preparados para implementar el circuito en una placa Millenium Board.
5.1
Introduccin
En este momento tenemos almacenado en un registro del PIC el valor devuelto por el mdulo ADC, y ahora que hacemos con l?, vamos a utilizar el Proteus y a programar el PIC con el MPLAB para que muestre esa temperatura a travs de 4 displays led de 7 segmentos.
5.2
Fig. 5. 1
44
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
5.3
Fig. 5. 2
PIC
45
La funcin principal de este programa, es llamar a las funciones encargadas de la configuracin de los diferentes elementos necesarios para que el circuito funcione, como por ejemplo puertos, interrupciones, modulo A/D. As como capturar el valor de la temperatura, transformar ese valor y mostrarlo mediante los displays. La configuracin del mdulo AD sigue el diagrama de flujo ya visto en la Fig. 4. 2, y las interrupciones seguirn el de la Fig. 4. 3 con un ISR igual al de la Fig. 4. 4.
Fig.5. 3
46
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Conversor A/D
500 400 T x 10 . 300 200 100 0 -100 0 -200 Valor conversor (decimal) 20 40 60 80 100 120 140 160 180 200 220 240 255
Fig.5. 4
y = k1x+k2
[2. 1]
[2. 2]
Cuando el valor que nos devuelva el conversor A/D sea 0, ser porque est registrando el valor de temperatura mnimo:
x=0
[2. 3]
PIC
47
y = -100 = k2
[2. 4]
De esta forma deducimos el valor que nos devuelve el conversor cuando la temperatura registrada es de 0C.
x(0)=(0+100)/1,96078=51,02 (aprox.51d=0x33=0b00110011)
[2. 5]
Cuando el convertidor nos ofrezca su valor mximo la temperatura que estar midiendo el sensor ser de:
[2. 6]
Supondremos el nmero decimal en las decenas de la conversin. Para poder mostrar los nmeros negativos modificamos la curva anterior. La ecuacin de la recta, para los valores de temperatura negativos, que propondremos en la programacin del circuito va a ser la siguiente:
[2. 7]
De esta forma cuando el valor de x sea menor de 51,02 (la temperatura que mida el sensor sea inferior a 0C), la curva ser la misma que la calculada anteriormente, pero en el intervalo de x = [0-51,02) con la pendiente de signo contrario:
48
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Conversor A/D
450 400 350 300 250 200 150 100 50 0 0 20 40 51 60 80 100 120 140 160 180 200 220 240 255 Valor conversor (decimal)
Fig. 5. 5 Valor de la temperatura en funcin del de la conversin (modificada para incluir la representacin de los nmeros negativos)
Fig.5. 6
V0 (mv)
PIC
49
5.4
Convierte a 7 segmentos
Hasta ahora lo que tenemos es la temperatura almacenada como un valor binario (unsigned int). Los displays de 7 segmentos, tienen 7 entradas, correspondientes a cada led, de forma que somos nosotros los que tendremos que hacer las operaciones necesarias para que este valor se convierta en 3 dgitos independientes. Y ms tarde encontrar el valor del byte que se corresponder con su representacin en el display. Una forma de hacerlo, es almacenar en 3 variables diferentes las decenas, unidades y decimales, para ms tarde enviar este valor a una subrutina, que nos devuelva el valor necesario para mostrar el dgito en el display de 7 segmentos.
Fig.5. 7
50
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
5.5
A pantalla
Con los valores correctos para enviar a los displays, ahora habr que crear una subrutina (A pantalla) que se encargue de poner el valor correcto en el puerto y encender el display durante un periodo de tiempo, esto se debe de realizar con cada uno de los displays. Esta funcin es la encargada de activar los pines del puerto B correspondientes para iluminar los displays mostrando la temperatura. Se irn deseleccionando los displays, sacando el valor correcto a travs del puerto B, seleccionando el display que corresponde, apagndolo y empezando con el led siguiente.
Fig.5. 8
5.4
Montaje
Fig.5. 9
Placa
Millenium
Board,
con
el
termmetro
funcionando.
USART
51
En este captulo vamos a trabajar con otro perifrico del PIC, la USART, encargada de la transmisin por el puerto serie. Para ello es necesario revisar la documentacin del ANEXO 4 USART.
6.1
Introduccin
Un objetivo importante de este proyecto es conseguir el envo de datos a travs del puerto serie. En nuestro caso enviaremos el valor devuelto por el modulo ADC. El destino, como explicaremos en el CAPTULO 8. LABVIEW, ser una aplicacin programada en Labview, que mostrar a travs de una interfaz de usuario la temperatura recibida. De momento aprenderemos a usar el perifrico USART para ms tarde por primera vez aplicar este perifrico a nuestro termmetro en el CAPTULO 7.PIC. Simulacin.
6.2
Configuracin
Tal y como hemos visto en el ANEXO 4 USART para configurar el perifrico USART debemos darle un valor a SPBRG, para 9600 baudios, que es la velocidad que vamos a utilizar, y utilizando un reloj de 4 Mhz siguiendo la ecuacin [A4. 5] almacenaremos el valor 25 en el SPBRG. Para configurar el USART seguiremos el diagrama de flujo mostrado en la siguiente figura, Fig. 6. 1:
52
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Fig. 6. 1
USART
53
6.3
Proteus
Para trabajar con el mdulo USART la mejor forma es practicar con l, realizando diferentes simulaciones en el Proteus, y viendo las posibilidades que nos ofrece este programa. Para la realizacin de las siguientes simulaciones se tienen que utilizar principalmente dos componentes: VTERM COMPIM
El primero (VTERM) lo usaremos para simular la ventana del Hyperterminal, tan solo con conectarlo a las patillas de RX y TX del PIC. Programando el PIC de forma adecuada en la ventana del Hyperterminal (VTERM) aparecer lo que el PIC enve, y tecleando en ella podr enviar caracteres al PIC. Con el COMPIM emularemos el puerto COM de nuestro PC, de tal forma, que las seales que estn activas en este componente lo estarn en el puerto COM de nuestro ordenador. De esta forma podremos realizar una comunicacin entre un PC (utilizando el programa Hyperterminal) y el PC donde se est simulando el circuito con el PIC. Los pasos que vamos a seguir para estudiar y adaptar la comunicacin entre el PIC y un PC, va comunicacin RS232, al proyecto final son los siguientes: 1 Programar un eco (echo). Todos los caracteres tecleados en el VTERM son devueltos por el PIC y mostrados en la misma pantalla del VTERM. 2 Realizar el mismo ejercicio utilizando el componente compim.
54
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Fig. 6. 2
Para ello nicamente tendremos que conectar los pines RC6/TX y RC7/RX a los correspondientes pines de recepcin y transmisin en el componente del Proteus que simulara un terminal virtual (VTERM). 6.3.1.2 Software
Utilizando el compilador HI-TECH la configuracin del puerto serie es bastante poco intuitiva. Como se ha explicado en ANEXO 4 USART, es necesario especificar el baud rate asignando valores a los registros SPBRG y BRGH [A4. 4] [A4. 5]. Teniendo en cuenta que la frecuencia de oscilacin de nuestro PIC es de 4 MHz, que queremos conseguir una velocidad de 9600 baudios, aplicando las frmulas anteriores y estando en modo de alta velocidad (BRGH =1) tendremos que almacenar en el registro SPBRG el valor 25. El programa que ejecutar el PIC seguir estos diagramas de flujo. Como programa principal:
USART
55
Fig. 6. 3
La configuracin del puerto serie se har segn lo visto en la Fig. 6. 1. Para capturar un carcter tendremos que realizar los pasos descritos en el siguiente diagrama de flujo:
No
Si
56
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
No
Si
6.3.1.3
Simulacin en el Proteus
Una vez programado el cdigo le indicamos al PIC del Proteus cual va a ser el programa que ha de ejecutar. Una vez hecho esto hacemos empezamos a simular.
USART
57
Fig. 6. 6
Fig. 6. 7
58
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
6.3.2.1
Seguimos el siguiente esquema de conexin, Fig. 6. 8, en el que en un PC se estar simulando el funcionamiento del PIC (con el Proteus), y en el otro se estar ejecutando el Hyperterminal, ambos PCs estarn conectados mediante un cable no-modem a sus respectivos puertos serie:
Fig. 6. 8
Una vez que en el Proteus se empiece a simular el circuito, todo lo tecleado en el Hyperterminal aparecer dos veces, una la que tecleamos en l (si tenemos activa la opcin de mostrar en el Hyperterminal lo que escribamos), la otra ser la que nos devuelva el PIC.
Fig. 7. 1
Simulacin
59
7.1
Introduccin
Estamos apunto de terminar este proyecto. En este punto lo que vamos a hacer es unir todas las piezas. En el Proteus ya hemos diseado un esquema en el que el PIC pueda transformar la temperatura registrada por un sensor y mostrarla en los displays (Pgina 43). El siguiente paso ser hacer que al mismo tiempo enviemos datos por el puerto serie. Deberemos aadir al programa, codificado en el MPLAB, que converta la seal recibida del sensor (mas bien, del circuito acondicionador de seal), la transformaba y la mostraba por los displays, un men que se enviar al Hyperterminal del otro PC, mediante el cual podremos seleccionar la opcin de mostrar temperatura. En ese momento el PIC enviar la temperatura que est registrando el sensor en ese momento. Para esta parte ser necesario modificar la configuracin de las interrupciones, aadiendo la recepcin de un carcter por el puerto serie como una interrupcin a tener en cuenta, y el cdigo ISR que ahora almacenar el valor recibido por la USART en una variable. El envo del men y la recogida de la opcin seleccionada lo haremos primero a travs del componente vterm, comprobando que funciona correctamente, y ms tarde pasaremos a emular el puerto com de nuestro PC con el componente compim. De esta forma aplicamos lo visto en el punto anterior (CAPTULO 6. PIC. USART) a este proyecto.
7.2
60
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Fig. 7. 2
Cuando lo simulemos con el compim solo tendremos que quitar el vterm y conectar correctamente el compim.
Fig. 7. 3
7.3
Lo primero que hay que tener claro es lo que va a hacer el PIC, para ello se
Simulacin
61
desarrolla los diagramas de flujo correspondientes al programa en C que ejecutar el microcontrolador (este funcionar segn la versin en ensamblador). Menos la configuracin de las interrupciones, en las que habr que aadir la recepcin de un carcter como algo a tener en cuenta, y el cdigo que se ejecutar cuando una interrupcin sea recibida, el ISR, el resto de las funciones llamadas por el programa principal se han visto con anterioridad en el CAPTULO 5. PIC o en el CAPTULO 6. PIC. USART. El programa principal que debe ejecutar el PIC puede seguir el siguiente diagrama de flujo:
62
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Fig. 7. 4
Simulacin
63
Sabremos si se ha recibido algn carcter por el puerto serie porque si es as, se producir una interrupcin y se pasar a ejecutar el siguiente diagrama de flujo:
Fig. 7. 5
Para ello hemos tenido que cambiar la configuracin de las interrupciones y habilitar la interrupcin por recepcin de carcter RCIE.
64
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Fig. 7. 6
7.4
Simulaciones
Una vez realizados todos los pasos anteriores al ejecutarlo este es el resultado.
Simulacin
65
Fig. 7. 7
Fig. 7. 8
Labview
67
CAPTULO 8. LABVIEW
En este captulo vamos a disear una aplicacin en el LABVIEW y a modificar el programa principal para usar la nueva interfaz de usuario omitiendo la parte en el que el PIC transmita un men...
8.1
Introduccin
Vamos a utilizar este programa para crear una aplicacin que recoja el valor devuelto por el mdulo conversor ad, y lo enve por el puerto serie.
8.2
Cdigo
Este programa es relativamente distinto al anterior, y aunque se seguir mostrando la temperatura por los displays, el programa principal ser diferente:
68
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
En las interrupciones eliminaremos la interrupcin por la recepcin de un carcter, utilizando la programada ya en Fig. 4. 3 y como ISR nos vale el de la Fig. 4. 4. Al Labview enviaremos el valor del sensor sin realizar ninguna conversin, esta la haremos en la aplicacin.
8.3
Conexin
Utilizaremos el circuito de la Fig. 7. 3. Ya que queremos enviar informacin a travs del puerto serie.
8.4
Labview
Primero crearemos la interfaz grfica para el usuario. En ella un termmetro indicar la temperatura, podremos elegir en que puerto tendremos conectado el PIC, y para tener una informacin mas precisa, tambin se mostrar la temperatura en un cuadro de texto.
Uniendo los distintos componentes que nos aporta este completo programa, podremos recoger del puerto serie el byte. Para evitar el solapamiento, y los posibles problemas derivados de una falta de sincronizacin de la comunicacin. El componente VISA SERIAL tiene como configuracin por defecto, la transmisin a 9600 baudios, tramas de 8 bits, 1 bit de stop, y sin bit de paridad, tal y como lo necesitamos.
Labview
69
Una vez recibido el byte se lee y se le transforma del valor ASCII a un valor entero, al que poder aplicarle la frmula que nos devuelve la temperatura registrada por el termmetro, y mostrarla a travs de la interfaz grfica que hemos diseado anteriormente, Fig. 8. 1.
Fig. 8. 4 Esquema de recepcin del byte, transformacin a entero, aplicacin de la frmula y envo a interfaz grfica.
70
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Bibliografa
71
BIBLIOGRAFIA
[1] Informacin sobre el PIC 16F877A: http://www.microchip.com [2] [3] Datasheet del PIC16F87XA. Datasheet del amplificador AD8631: http://www.datasheetcatalog.com/datasheets_pdf/A/D/8/6/AD8631.shtml [4] Descarga del programa ic-prog: http://www.ic-prog.com/download.html. [5] Manual del ic-prog: http://autric.com/Microbotica%20y%20Mecatronica/icprog.htm [6] Descarga del archivo icprog.sys para utilizar el ic-prog con xp http://www.mercaelectronica.com/descargas/index.htm [7] Datasheet del sensor LM35A http://www.datasheetcatalog.com/datasheets_pdf/L/M/3/5/LM35.shtml [8] Informacin sobre la programacin del PIC, con el HI-TECH Robert B. Reese, Microprocessors From a Assembly Language to C Using the PIC 18Fxx2, Da Vinci Engineering Press [9] Manual del PIC Zuloaga A., Cuadrado C., Jimnez J., Astarloa a., Aranguren G., Ezquerra J., Prcticas con microcontroladores chip, Laboratorio de Sistemas Digitales (UPV/EHU) [10] Informacin sobre la configuracin de la USART con HI-TECH http://www2.ate.uniovi.es/fernando/Doc2005/Sed_05/Practicas/Descripcio n/Practica_11/Practica%2011.pdf [11] Informacin sobre Proteus http://www.pic16f84a.com/Proteus.htm
Programas software
Los programas utilizados son los siguientes: Proteus VSM MPLAB LabView
Anexo 1
73
ANEXOS
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC TITULACIN: Ingeniera Tcnica de Telecomunicaciones, especialidad Telemtica AUTOR: Agurtzane Ramrez Mendoza DIRECTOR: Francesc Josep Snchez Robert FECHA: 7 de Julio de 2006
Anexo 1
75
76
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Anexo 1
77
78
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Anexo 1
79
80
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Anexo 1
81
82
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Anexo 1
83
84
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Anexo 1
85
Anexo 2
87
2.1
Introduccin
Como podemos observar en nuestro da a da el mundo real todava es y siempre ser fundamentalmente un lugar analgico. Para poder aprovechar los beneficios del procesado de los PIC y llevar sus beneficios a aplicaciones para el mundo real, las seales analgicas debern de ser traducidas a un formato que el PIC pueda entender. Esta es la funcin del mdulo conversor analgico digital (ADC). Despus de procesarlas por el PIC, el resultado ser una ristra de bits de informacin que deber de ser devuelta a si forma analgica gracias al mdulo DAC.
Los ADC y DAC estn en prcticamente todos los sistemas electrnicos, como reproductores de compact disk, mp3, mviles, mdem, tarjetas de sonido, que pueden contener uno de ellos o ambos. Como la arquitectura de los ADCs es tan til y es requerida por muchas pequeas aplicaciones de microprocesadores, las arquitecturas de los microprocesadores a menudo incluyen un ADC como un perifrico incorporado, y los diseadores del PIC hicieron eso mismo. Desde el punto de vista de los programadores los mdulos ADCs y DACs pueden verse como cajas negras. El ADC acepta la entrada de una cantidad analgica, normalmente tensin, y proporciona a su salida un cdigo digital de n-bits cada fs segundos que representa esa entrada analgica. Al nmero fs se le denomina frecuencia de muestreo (sampling frequency). La caja negra del DAC acepta una palabra de un cdigo digital de n-bits cada fs segundos y genera una salida analgica equivalente, normalmente tensin. Esto puede ser una interpretacin suficiente de los convertidores, pero el entender como se realiza la conversin de datos puede ayudarnos a entender las limitaciones de las operaciones de los mdulos ADC y DAC, y puede ayudarnos en la
88
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
2.2
Los mtodos a travs de los cuales se genera un cdigo digital dentro de un ADC son varios. Mientras que los ADCs pueden tener recibir casi cualquier medida analgica (corriente, carga, voltaje, temperatura, presin acstica, etc.) como entrada, lo ms comn es que el mdulo ADC convierta un valor de tensin analgico en un nmero digital. Normalmente, los sistemas que pueden convertir una amplia variedad de valores primero convierten esas seales en tensiones, y despus usando el ADC en modo-tensin convierten el valor en un nmero digital. El nmero digital que genera el ADC puede codificarse en cualquier sistema, pero lo ms comn es que se represente como un nmero binario con o sin signo. Los ADCs y sus capacidades se pueden describir mediante un amplsimo nmero de parmetros. Pero con solo unos pocos parmetros bsicos y bastante descriptivos del ADC se puede entender como seleccionar y hacer un buen uso de l. La velocidad de un ADC se medida a travs del mnimo periodo de muestreo Tmin; que se refiere al mnimo tiempo necesario para convertir la entrada de una tensin a un nmero digital. El mnimo periodo de muestreo es equivalente a la mxima frecuencia de muestreo, el nmero mximo de muestreos que el ADC puede convertir en un segundo. La mxima frecuencia de muestreo fmax se calcula como [A2. 1]:
fmax = 1 / Tmin
[A2. 1]
Antes de entrar en ms detalles existen ciertos conceptos que tienen que quedar claros, algunos de ellos ya los he mencionado: ADC (Analog-to-Digital Converter): convierte una seal analgica (tensin/corriente) en un valor digital DAC (Digital-to-Analog Converter): convierte un valor digital en un valor analgico (tensin/corriente) Periodo de muestreo: para el ADC, es el tiempo entre conversiones Normalmente, los muestreos se realizan a una velocidad fija. Vref (Voltaje de referencia): las seales analgicas varan entre 0 y Vref, o entre +/-Vref Resolucin: es el nmero de bits usados en la conversin (8 bits, 10 bits, 12 bits, 16 bits, etc.). Tiempo de conversin: es el tiempo que se necesita para la conversin analgica-digital.
Anexo 2
89
La resolucin de un ADC es el mnimo cambio en la entrada analgica que se detecta en la salida, normalmente es un cambio de +-1 en el nmero de la salida. En otras palabras, la resolucin representa el cambio en la entrada analgica que corresponde al cambio de 1 Lsb en la salida o tambin para un ADC de N bits: Resolucin = 1 /2 N(VREF+ - VREF-)
[A2. 2]
Donde VREF+ es el nivel de tensin de referencia positivo, y VREF- el nivel de tensin de referencia negativo. Aunque como normalmente vamos a usar VREF= 0V: Resolucin = 1 /2 N * VREF+
[A2. 3]
La precisin ADC es el nmero de niveles que el ADC puede distinguir. Algunas veces, la precisin se define con el nmero de bits que se necesitan para codificar el nmero de niveles. Cdigo salida = VIN/ VREF * 2 N
[A2. 4]
90
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
El rango del ADC es la diferencia entre el valor mximo y mnimo de entradas que puede aceptar para realizar la conversin. Normalmente el rango se encuentra entre VREF + y VREF - en el caso de conversin de tensiones, y se proporcionan como entradas al ADC.
2.3
Arquitecturas ADC
Fig. 3 Estructura y representacin del ciclo de conversin del ADC de rampa digital.
Anexo 2
91
Fig. 4 Estructura y representacin del ciclo de conversin del ADC de rampa digital.
92
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
2.4
Los PIC 16f87X tienen un mdulo ADC de 10-bits. Y es compatible con los ADC de 8 bits de los PIC16C7X. El mdulo ADC como otros perifricos del PIC es controlado por un nmero de registros de configuracin, habilitacin y flags. Las conexiones externas de entrada al ADC estn restringidas a unos pines especficos (el puerto A).
Anexo 2
93
Los bits ADCON1[3:0], PCFG[3:0], determina el nmero de ADC y canales digitales disponibles en el puerto A. En la Fig. 8, se puede ver los tipos de configuracin para cada combinacin de bits PCFG[3:0].
ADCON1 tambin selecciona las fuentes de referencia, VREF + y VREF -. Estas tensiones de referencia especifican entre que valores el ADC espera que se siten la seal de entrada. El ADC divide el rango (VREF+ - VREF- ) en 210=1024 niveles. La salida del PIC ser un nmero de 10 bits, y se representar en el par de registros ARDES:ADRESL, es decir, 16 bits. El mdulo ADC proporciona la flexibilidad de justificar a la derecha o izquierda el resultado de 10 bits, en el registro resultante de 16 bits. El bit de seleccin de formato del ADC (ADFMA/D Format Select bit) controla esta justificacin. En la Fig. 9 se explica la operacin de justificacin del ADC. Los bits extras son cargados con 0s. Cuando el modulo ADC no va a sobrescribir estos registros (ADC deshabilitado), estos registros se pueden usar como registros de propsito general de 8 bits.
94
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Mientras que los bits PCFG[3:0] del ADCON1 permiten al PIC tener habilitados diferentes canales, el PIC no puede convertir ms de un canal al mismo tiempo. El canal a convertir, se seleccionar a travs de los bits CHS2:CHS1, Fig. 10. Los tres bits son la representacin del canal seleccionado por el ADC en ese preciso instante.
Anexo 2
95
El registro ADCON0 tambin contiene otro bit importante para la configuracin, ADON ADCON0[0]. Cuando ADON =1, el modulo ADC es habilitado, encendido, y consume corriente. Cuando ADON = 0 el modulo estar deshabilitado y no consumir corriente. Si el mdulo ADC no est siendo usado debera apagarse mediante ADON=0, que es el valor que se le da despus de un reset. El mdulo ADC del PIC utiliza el mtodo de las aproximaciones sucesivas para generar el resultado de 10 bits, y tal como hemos visto en ADC de aproximaciones sucesivas, se necesita un ciclo de reloj por bit como tiempo de conversin, es decir 10 ciclos de reloj. El datasheet del PIC especifica el que el conversor ADC necesita 12 TAD para tener un resultado exacto de la conversin, donde TAD es por lo menos 1,6s. El PIC usa un periodo TAD extra para preparar el ADC y otro para copiar el resultado en los registros ADRESH:ADRESL despus de la conversin. Para garantizar que el TAD es mayor de 1,6s el PIC proporciona 4 opciones para seleccionar el reloj del ADC mediante los bits ADCS1:ADCS0, ADCON0[7:6]. Las frecuencias que se pueden seleccionar son las resultantes de dividir a la frecuencia del reloj FOSC entre 2, 8 32, tambin se puede seleccionar la frecuencia del oscilador RC interno. Si el ADC es controlado por una frecuencia relacionada con la FOSC se debe seleccionar el divisor de forma que el TAD sea mayor de 1, 6s, o la conversin del ADC no ser exacta.
La ltima opcin del ADC para configurar antes de poder usar el ADC son las fuentes de interrupciones ADC. El ADC del PIC genera una interrupcin cuando la conversin de 10 bits se ha completado. Para activar las interrupciones del ADC primero debemos poner a 0 el bit ADIF (ADC Interrupt Flag, PIR1[6]) para prevenir una solicitud de interrupcin falsa cuando habilitemos las interrupciones. Tambin necesitamos configurar el bit ADIE (ADC Interrupt Enable, PIE1[6]) para hacer del ADC una fuente de interrupciones. La interrupcin ADC es activada completamente mediante los bits de GIE/GIEH y PEIE/GIEL.
96
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Anexo 4
97
ANEXO 3 Interrupciones
3.1
Introduccin
Una interrupcin es una seal que recibe el microprocesador, indicando que debe interrumpir el flujo normal del programa debido a que ha ocurrido un evento externo o interno, y pasar a ejecutar un cdigo especfico para tratar esa situacin. Las interrupciones surgen de las necesidades que tienen los dispositivos perifricos de enviar informacin al microprocesador. La primera tcnica que se emple fue que el propio procesador se encargara de sondear (polling) el dispositivo cada cierto tiempo para averiguar si tena pendiente alguna comunicacin para l. Este mtodo presentaba el inconveniente de ser muy ineficiente, ya que el procesador constantemente consuma tiempo en realizar todas las instrucciones del sondeo. Y la frecuencia del chequeo no sea la adecuada, tanto por exceso como por defecto. El mecanismo de interrupciones fue la solucin que permiti al procesador desentenderse de esta problemtica, y delegar en el dispositivo la responsabilidad de comunicarse con el procesador cuando lo necesitaba. El procesador, en este caso, no sondea a ningn dispositivo, sino que queda a la espera de que estos le avisen (le interrumpan) cuando tengan algo que comunicarle, ya sea un evento , una transferencia de informacin, una condicin de error, etc.). Durante el flujo normal de un programa, se pueden recibir alguna interrupcin de algn evento externo o interno. Despus de que finalice la instruccin que se est ejecutando en el microprocesador en ese momento, los registros BSR, W y STATUS son almacenados. La direccin de la siguiente instruccin a ejecutar se almacena en la pila o stack y el contador de programa (PC) indicar la direccin predeterminada denominada vector de interrupcin, provocando que el procesador ejecute las instrucciones a partir de ese punto. Para volver a la ejecucin normal del programa se necesita la instruccin retfie (return from interrupt).
98
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
El cdigo que se ejecuta cuando ocurre una interrupcin se denomina rutina de atencin a servicio (interrupt service routine ISR). Las funciones ISR sirven para responder al evento que dispar la interrupcin. Por ejemplo, si la interrupcin la ha producido la llegada de un dato serie asncrono, las funciones ISR podran leer el registro RCREG de la USART, salvar el dato y regresar al programa principal. Como se puede ver en la Fig. 13, se puede pensar en las ISR como una subrutina llamada por el programa principal. Aunque, las ISR nunca son manualmente llamadas como una funcin normal en C, sino que, las ISR son invocadas automticamente por el hardware de interrupciones del PIC. Se suele decir que las ISR se ejecutan en background, mientras el flujo normal del programa se ejecuta en foreground. Existen muchas fuentes de interrupciones en el PIC: Cuando se recibe un carcter en el puerto serie. Cuando se termina la transmisin de un carcter por el puerto serie. Cuando se ha terminado una conversin A/D. Cuando existe un flanco de bajada en el pin RB0 ... En lo visto anteriormente sobre las transferencias por el puerto serie asncrono, se usaba la tcnica denominada polling, donde el estado del flag que nos deca si haba algn dato disponible se chequeaba repetidamente. Esta tcnica es un mtodo muy ineficiente para implementar operaciones de IO. Sera mucho ms eficiente que cuando ocurra un evento, como por ejemplo la llegada de un dato por el puerto serie se generase una interrupcin, cada interrupcin estar asociada a un bit de flag de interrupcin, que se pondr a 1 cuando esto ocurra. estos bits, estn en dos registros especiales llamados PIR1 (Peripheral Interrupt Request Flag Register 1) y PIR2 (Peripherl Interrupt Request Flag
Anexo 4
99
Register 2).Incluyendo el bit que nos indica si ha habido interrupcin o no, existen los siguientes bits relacionados con las interrupciones: Cada fuente de interrupcin tiene un bit habilitador, que permite que se genere una interrupcin si se dan las condiciones necesarias. Por defecto las interrupciones NO estn habilitadas. Cada fuente de interrupcin tiene tambin un flag que indica si una interrupcin ha ocurrido.
Si el bit habilitador esta a 0 la interrupcin ser enmascarada o deshabilitada, esto no quiere decir que no se produzca, solo que no se ejecutaran las funciones de la ISR.
Anexo 4
101
ANEXO 4 USART
4.1 Caractersticas bsicas del puerto IO.
Un puerto de E/S paralelo utiliza un grupo de seales por donde se transmitirn los datos y una seal de reloj para realizar un control de la transferencia. En las siguientes figuras se muestra una conexin E/S paralela de 16 bits entre CPU_a y CPU_b, con una seal de reloj usada para sealar el instante en el que los datos situados en el bus son validos.
Fig. 14
El ancho de banda del canal de comunicaciones se expresa normalmente como el nmero de bytes transferidos por segundo (B/s), o el numero de bits transferidos por segundo (b/s). Los Bps y bps estn relacionados de la siguiente forma [A4. 1]:
Bps= bps/8
[A4. 1]
[A4. 2]
Cuando se enva un bit por cada tiempo de bit, la comunicacin se define como transferencia de datos serie. La seal de reloj puede usarse para la sincronizacin de la transferencia pero no es necesario.
102
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Otra caracterstica de los puertos de comunicaciones IO es en que sentido/s se puede/n realizar las comunicacin. En referencia a esta caracterstica un puerto se puede definir como simplex, half-duplex o duplex. Un canal simplex permite la transferencia de datos en un solo sentido. Un canal half-duplex soporta transferencias de datos en cualquier sentido, pero utilizando solo uno de ellos en cada comunicacin. Un canal duplex (tambin llamado full-duplex) soporta transferencias en ambos sentidos simultneamente.
Una conexin fsica entre dos sistemas puede ser un mediante un cable unidireccional (transferencia solo en una direccin) o bidireccional (transferencia en cualquier direccin). Un cable unidireccional puede
Anexo 4
103
implementar una conexin simplex, mientras que un cable bidireccional puede implementar un canal half-duplex. Mediante dos cables unidireccionales se puede obtener un canal duplex, transportando por cada cable informacin en un solo sentido. Estos conceptos se pueden observar en los siguientes diagramas.
La principal ventaja de una comunicacin serie es que su implementacin es mucho mas barata que un puerto paralelo. El puerto serie es usado normalmente para la transferencia entre dispositivos que requieren cableado externo como por ejemplo, entre un teclado y un ordenador. Como la comunicacin serie requiere muchos menos cables que el cable paralelo, el coste se reduce considerablemente.
4.2
En la comunicacin serie sncrona se enva la seal de reloj como una seal aparte, que puede estar en la codificacin de los datos o puede enviarse como una seal separada. Esta ltima opcin es la ms intuitiva para una comunicacin sncrona, pero a altas velocidades, el retardo que produce el cable puede ser significativo, especialmente en cableado externo. Si los retardos producidos por el cable de datos y la seal de reloj son significativos, puede ser que el flanco de reloj no se active en el momento correcto, y que el bit que se recoja en el receptor no sea el adecuado.
104
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
As que otra opcin es la de codificar la seal de reloj en los datos, de forma que el receptor pueda extraerla. En un primer momento se puede pensar que si el transmisor y receptor se ponen de acuerdo en la velocidad de reloj a utilizar en la transmisin, no sera necesario transmitirla, simplificando en gran medida la comunicacin. El problema de no transmitir la seal de reloj es que al generar el emisor y el receptor la seal de reloj de forma independiente, si el ratio de los relojes no es idntico no se puede garantizar que los relojes estn en fase. Por otra parte, no es posible generar relojes idnticos utilizando diferentes fuentes.
4.3
En la comunicacin serie asncrona no tiene ninguno de los mtodos de la comunicacin sncrona usados para sincronizar la comunicacin. En lugar de eso, el emisor y el receptor acuerdan un ratio de velocidad en la transmisin de los datos, y el emisor enva los datos al receptor en formato NRZ. Las ventajas de la comunicacin asncrona con respecto a la sncrona es que requiere un hardware mucho ms simple, sacrificando ancho de banda. Para conectar el PIC a un PC externo, vamos a utilizar el interfaz serie asncrono de tres hilos. Este interfaz es conocido como RS-232.
Anexo 4
105
En la Fig. 23 muestra las diferencias de fase y frecuencia entre el receptor y el reloj del receptor. A un ratio de datos de bps, el reloj usado en el emisor/receptor para acceder a los datos es mltiplo de esta velocidad, normalmente 16x o 64x. Suponiendo un reloj 16x cuando el receptor detecta el bit start (flanco de bajada), cuenta 8 periodos de reloj y es entonces cuando captura el valor de entrada. Despus de este punto el receptor muestrea la lnea de entrada cada 16 periodos de reloj, situando el punto de muestreo cerca del medio del tiempo de bit, dando el receptor la mxima tolerancia posible para los posibles desajustes entre relojes del emisor y receptor. Esto otorga para una trama de 10 bits una tolerancia frente al error de sincronismo entre relojes de entre un 3% y un 5%. Esta tolerancia disminuye de forma lineal con respecto al nmero de bits transferidos en cada trama. Es por esta razn que las tramas de una transmisin asncrona se limitan normalmente a 10 bits.
Un trmino comnmente usado para referirse a la velocidad de los ratos en un canal asncrono es el baud rate, cuya definicin es el nmero de tiempos de bit por unidad de tiempo. La velocidad del puerto (Baud rate) es la velocidad a la que se envan los bits. Los bits por segundo (bps) es el numero de bits transferidos por segundo (cualquier tipo de bits, datos o sealizacin). Data Rate (bps) = 1/ bit_time [A4. 3]
Si solo se enva un bit por cada intervalo de sealizacin, el ratio en baudios sern bps. Pero si se usa un protocolo de sealizacin que transfiera mltiples bits por cada intervalo de sealizacin, por ejemplo, enviando en 4 niveles de tensin diferentes dos bits de datos, el bit rate ser el doble que el baud rate. La velocidad efectiva de los datos es a la cual los datos son transferidos, exceptuando los bits de cabecera (bits de start y stop).
106
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
4.4
PIC. USART
El mdulo del PIC que implementa el puerto IO serie sncrono y asncrono es el llamado USART (Universal Synchronous Asynchronous Receiver TansmitterHardware). En este proyecto vamos a usarlo en modo asncrono. Este mdulo libera al procesador de tener que realizar las operaciones necesarias para recibir y transmitir informacin, delegando este trabajo a la USART el procesador puede realizar otras tareas.
Fig. 24
El mdulo USART dispone de una serie de registros, que son los siguientes: RCREG: es el registro que almacena el carcter recibido, para capturarlo tendremos que leer este registro. TXREG: es donde tendremos que escribir el carcter que queremos enviar. RCSTA: Registro de estado y control de recepcin de datos. SPBRG y TXSTA controla la velocidad de transmisin: o Mediante los bits de estado del registro TXSTA se puede seleccionar transmisin sncrona/asncrona, activar la transmisin. PIR1 contiene bits de estado: o TXIF (flag de interrupcin por transmisin): se pondr a 1 cuando el registro TXREG este vaco y pueda aceptar nuevos caracteres, mientras no se haya enviado el carcter se mantendr con valor 0. o RCIF (flag de interrupcin por recepcin): se pondr a 1 cuando el registro RCREG est lleno.
Anexo 4
107
Fig. 25
El registro TXREG es un registro buffer. Cuando el TSR est vaco, el TXREG transfiere el valor almacenado al TSR, entonces TXREG se vaciar (TXIF=1) y ser el valor del TSR el que se enve. De esta forma el modulo USART no tiene que esperar a que el ltimo carcter sea enviado antes de escribir un nuevo carcter. Una escritura en el TXREG pone a 0 el bit TXIF en el segundo ciclo de instruccin despus de la operacin de escritura. El bit TXIF es un bit de solo lectura que solo se resetea al realizar una escritura en TXREG. Si los registros TXREG y TSR estn vacos, una escritura en el registro TXREG resetea el bit TXIF que es rpidamente puesto a 1 en cuanto el contenido de TXREG sea transferido al TSR vaco. En ese momento se podr escribir el siguiente carcter en el TXREG. De esta forma ambos caracteres se podrn escribir de forma rpida en el bloque de transmisin de la USART si este est vaco. Un tercer valor deber esperar a que se transmita el valor del TSR para que el TXREG se vace. Algunos USART en otros microprocesadores pueden almacenar hasta 16 datos en sus bloques de transmisin. El USART de nuestro PIC no soporta el formato de 7 bits, con paridad, as que en las transmisiones se utilizar siempre datos en formato de 8 bits, que es formato soportado por las comunicaciones RS232, la forma ms comn en las comunicaciones a travs del puerto serie asncrono.
108
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Fig. 26
La Fig. 26 muestra el diagrama de bloques del mdulo de recepcin de la USART. Los datos entran en serie a travs del pin RX y se almacenan en el registro RSR una vez recibido el bit de start. El CREN (Continuous Receive Enable, RCSTA [4]) debe ponerse a 1 para activar el bloque de recepcin de la USART. El contenido del RSR se transfiere al registro RCREG despus de la recepcin del bit de stop. Esto hace que el bit RCIF se active (1) indicando que el RCREG tiene disponible un dato. El RCIF ser reseteado (0) despus de la lectura del RCREG. Si el RSR y el RCREG estn llenos, la deteccin del bit de start del siguiente carcter disparar un error de overrun activando el bit de estado OERR (1). El bit OERR es de solo lectura, para resetearlo es necesario poner a 0 el bit CREN. Cuando ocurre un error de overrun no se transfiere ningn valor desde el RSR al RCREG hasta que el bit de error OERR sea reseteado. En la programacin del PIC para la transmisin de informacin rescribiremos las funciones putch()/getch(). La funcin putch() esperar a que el registro TXREG se vace mediante el bucle while(!TXIF){} del que podr salir cuando el valor de TXIF sea 1, entonces escribir el valor de una variable c en el TXREG. La funcin getch() espera a que haya un dato disponible mediante el bucle while(!RCIF){}, que se ejecutar hasta que el valor del bit RXIF sea 1, entonces devolver el valor de RCREG. Las funciones printf() y scanf() proporcionadas por el compilador HI-TECH PICC, usan las funciones putch() y getch() en cada carcter. La velocidad de transmisin de la interfaz serie es controlada mediante el reloj generador de la velocidad de transmisin, y se calcula mediante la ecuacin [A4. 4]. El registro SPBRG es un registro de 8 bits, as que permite valores entre 0 y 255. EL modo de alta o baja velocidad se selecciona mediante el bit de configuracin BRGH (High Baud Rate Select Bit, TXSTA(2)), con BRGH = 1 se selecciona el modo de alta velocidad.
Anexo 4
109
BR = FOSC/(S*(SPBRG+1))
[A4. 4]
S=64 (baja velocidad) S=16 (alta velocidad) Modificando la anterior frmula se puede calcular el valor de SPBRG [A4. 5]:
[A4. 5]
Redondeando al entero ms prximo. Los pasos necesarios para habilitar el puerto serie asncrono del PIC son los siguientes: 1 Configurar los pines del puerto (RC6/TX, RC7/RX) a travs del bit SPEN (RCSTA:7=1). Tambin hay que activar TRISC7, (RC7 como entrada), TRISB6=0 (RC6 como salida). Seleccionar el modo alta o baja velocidad a travs del bit BRGH (TXSTA:2). Seleccionar el modo asncrono a travs del bit SYNC (TXSTA:4=0). Seleccionar el modo de transmisin de 8 bits a travs del bit TX9 (TXSTA:6=0). Seleccionar el modo de recepcin de 8 bits mediante el bit RX9 (RCSTA:6=0). Habilitar el puerto de transmisin activando el bit TXEN (TXSTA:5 =1). Activar el puerto de recepcin poniendo a 1 el bit CREN (RCSTA:4=1).
2 3 4 5 6 7
4.5
El estndar RS232
El estndar EIA-RS232 es un estndar originalmente usado para conectar el mdem al PC. Este estndar define los niveles de tensin, longitud de cableados, conexiones, etc. Adems de las seales de TX, RX y Gnd, existen otras seales usadas para el control del mdem (Data Carrier Detect, Indicador de llamada, etc.), y control de flujo ( las seales de control de flujo se usan para determinar si el dispositivo esta preparado o no para aceptar datos).
110
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Fig. 27
En el esquema de la Fig. 27 se muestra la mnima conexin posible, aunque existen muchas otras seales definidas en el estndar RS232 que se usan para el control externo del mdem y el control de flujo. Esta conexin no tiene en cuenta la disponibilidad de los dispositivos para recibir datos, el emisor asume que el receptor puede aceptar siempre nuevos datos. Los pines CTS (Clear To Send, pin 8 del DB9) y RTS (Request To Send) puede usarse para gestionar un control de flujo hardware. La seal RTS es una salida del PC (entrada del PIC), mientras que la seal CTS es una salida del PIC (entrada del PC) y ambas seales funcionan con lgica negativa (activas a 0). El control de flujo hardware significa que el PC activar su salida RTS, solicitando permiso para enviar datos. El PIC activar su CTS comunicando al PC que est preparado para recibir datos, para parar el flujo de datos del PC lo nico que hay que hacer es negar la salida CTS. Este control de flujo de datos es nicamente en un sentido, del PC al PIC. Esto es porque el estndar RS232 fue diseado para la comunicacin entre un terminal DTE(Data Terminal Equip, PC) y un mdem DCE(Data Communication Equipment, PIC). Se presupone que el DTE (PC) siempre est preparado para aceptar datos del DCE (el mdem). Windows incluye un programa el Hyperterminal que es necesario para la comunicacin RS232. La configuracin del programa se muestra en la Fig. 28
Anexo 4
111
Fig. 28
Un PC tiene mltiples puertos serie, llamados COM1, COM2... Cuando se abre una ventana del programa Hyperterminal, se debe de especificar el puerto COM que se va a usar, as como la velocidad de transferencia (baud rate). Para la conexin del interfaz RS232 PIC, se necesita, formato de datos serie de 8 bits, no paridad, 1 bit de stop y sin control de flujo. En algunos PCs no se incluye un puerto serie, sino un Universal Serial Bus (USB) como el nuevo estndar de comunicaciones. Pero existen unos adaptadores USB-RS232 que permiten al puerto USB usarse como un puerto serie RS232. Hay que tener especial cuidado, porque ciertos adaptadores no permiten el funcionamiento con la conexin mnima (TX, RX, Gnd) Fig. 27, y requieren la conexin del resto de seales del RS232,Fig. 29.
Fig. 29
Conexin
del
interfaz
RS232
con
el
PIC.
Anexo 5
113
ANEXO 5 Cdigos
5.1
/*
/*
================================================================================= Algunas directivas de configuracin para el programador __CONFIG(DEBUGEN & WDTDIS & LVPDIS); ================================================================================= */ /* ================================================================================= Ficheros cabecera con las definiciones bsicas del PIC ================================================================================= */ <pic.h> <stdio.h> "delay.c" ================================================================================= Declaracin inicial de todas las funciones usadas ================================================================================= */
void configurar_modulo_A_D(void); void configurar_int_A_D(void); void configurar_puertos(void); static void interrupt atencion_int(void); unsigned char convierte_7s (unsigned char); void a_pantalla_7(void); void calcular_signo_y_valor(void); /* ================================================================================= Variables globales ================================================================================= */
char valor_BCD_unidades, valor_BCD_decenas, valor_BCD_centenas; ; // en esta variable se almacenar el valor de la temperatura en BCD unsigned char valor_7s_signo; unsigned char valor_sensor; short valor; int i; /* ================================================================================= Definicin de funciones ================================================================================= */ /* --------------------------------------------------------------------------------Funcin de inicializacin del convertidor A/D --------------------------------------------------------------------------------- */ void configurar_modulo_A_D(void){ /* * * * * * * * * * ADCON1 = 0X0E; /* ADCON0 REGISTER (ADDRESS: 1Fh) Este es el registro que controla el funcionamiento de A/D Los bits 7-6 ADCS1:ADCS0: A/D Conversin Clock Select bits Si los bits valen 01 se selecciona Fosc/8 como la frecuencia del convertidor ADCON0 = 0X40; ADON=1; //Se arranca el convertidor A/D } /* --------------------------------------------------------------------------------Funcin de configuracin de las interrupciones del modulo A/D void configurar_int_A_D(void); --------------------------------------------------------------------------------- */ ADCON1 REGISTER (ADDRESS 9Fh) ADCON1<3:0> PCFG3-PCFG0: A/D Port Configuration Control bits: Configurar los pines/voltajes de referencia y I/O digitales Si PCFG3-PCFG0 = "1110" todas las entradas del PORTA configuran como digitales menos la primera ADCON1<7> ADFM: A/D Result Format Select bit Si es "1" = Right justified. Los 6 MSB del ADRESH son "0" Si es "0" = Left justified. Los 6 LSB del ADRESL son "0" De esta forma, ADRESH contendr los 8 bits mas significativos de la conversin de 10 bits
*/
void configurar_int_A_D(void) { ADIF=0; ADIE=1; PEIE=1; GIE=1; for (i=0; i<2;i++); ADGO=1; }
//Se resetea el bit indicador de interrupcin producida por el mdulo ADC //Se habilitan las interrupciones por el mdulo ADC //Se habilitan las interrupciones producidas por los perifricos //Se habilitan las interrupciones //Se introduce un retardo para //Iniciar la conversin
114
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
/*
void configurar_puertos(void) { TRISB=0x00; //Todos los bits del puerto B se usarn como salida TRISA=0x01; //El PORTA<0> ser entrada analgica (sensor) mientras el resto sern salidas digitales } /* --------------------------------------------------------------------------------ISR, el cdigo que se ejecutar cuando se produzca una interrupcin void configurar_int_A_D(void); --------------------------------------------------------------------------------- */
//Se almacena el valor de la muestra recibida por el convertidor //Se resetea el bit indicador de interrupcin por el mdulo ADC //Se vuelven a configurar las interrupciones
--------------------------------------------------------------------------------Funcin que calcula el valor de la temperatura en funcin del valor devuelto por el mdulo ADC void calcular_signo_y_valor(void); --------------------------------------------------------------------------------- */
void calcular_signo_y_valor(void) { //Si la temperatura es positiva, despus de hallar su valor se deja en blanco el smbolo del signo if(valor_sensor>=51) { valor = valor_sensor * 1.96078 - 100; valor_7s_signo = 0x00; } //En cambio si la temperatura no es positiva, despus de hallar su valor se almacena el smbolo preparado para el //display 7 segmentos else { valor = 100 - valor_sensor * 1.953125; valor_7s_signo = 0x40; } }
/* --------------------------------------------------------------------------------Funcin que convierte BCD a 7 segmentos, devuelve el valor en 7 segmentos void convierte_7(unsigned char valor); --------------------------------------------------------------------------------- */ unsigned char convierte_7s(unsigned char valor) { unsigned char valor_7s; //Hache se almacenar el valor BCD equivalente a el que el programa principal //enva como parmetro a esta funcin
switch (valor) { case 0: valor_7s = 0x3F; break; case 1: valor_7s = 0x06; break; case 2: valor_7s = 0x5B; break; case 3: valor_7s = 0x4F; break; case 4: valor_7s = 0x66; break; case 5: valor_7s = 0x6D; break; case 6: valor_7s = 0x7D; break; case 7: valor_7s = 0x07; break; case 8: valor_7s = 0x7F; break; case 9: valor_7s = 0x67; default: break; } return (valor_7s); } /* --------------------------------------------------------------------------------//Se devuelve el valor a la funcin principal
Anexo 5
115
Funcin que muestra por pantalla la temperatura void a_pantalla_7(void); --------------------------------------------------------------------------------- */ void a_pantalla_7(void) { PORTA=0x00; //Para evitar que aparezca en el display un dgito que no le corresponde PORTB= convierte_7s(valor_BCD_unidades);//Antes de situar el dato en el puerto B se deseleccionan los displays PORTA= 0x02;//Solo despus de que el dato correcto se encuentre en el puerto B se activa el display correspondiente DelayUs(60); //El dato se mantendr en el display durante 60 microsegundos PORTA=0x00; PORTB= convierte_7s(valor_BCD_decenas) + 0x80; PORTA= 0x04; DelayUs(60); PORTA=0x00; PORTB= convierte_7s(valor_BCD_centenas); PORTA= 0x08; DelayUs(60); PORTA=0x00; PORTB= valor_7s_signo; PORTA= 0x20; DelayUs(60); } /* ================================================================================= Funcin principal ================================================================================= */
void main(void){
int prim=0; configurar_modulo_A_D(); configurar_int_A_D(); configurar_puertos(); while(1) { calcular_signo_y_valor(); valor_BCD_unidades= valor%10; valor_BCD_decenas =valor/10%10; valor_BCD_centenas=valor/100; a_pantalla_7(); }
//Configura el modulo A/D //Configura las interrupciones //Configura los puertos del PIC
//Se calcula y //valor devuelto //Se almacena en //Las decenas //Y centenas //Se muestra por
almacena la temperatura y su signo, a partir del por el mdulo ADC variables independientes el valor de las unidades
5.2
/*
/*
#include #include /*
unsigned char getch(); void putch(unsigned char); void serial_inic(char); /* ================================================================================= Definicin de funciones ================================================================================= */ --------------------------------------------------------------------------------Funcin de recepcin de carcter por el puerto serie --------------------------------------------------------------------------------- */
/*
void putch (unsigned char c)//La funcin principal enva a travs de una variable el carcter a enviar { while (!TXIF);//Cuando el registro de transmisin se vace TXREG = c; //Se almacena en l el nuevo carcter a enviar } /* --------------------------------------------------------------------------------Funcin de configuracin del puerto serie asncrono
116
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
--------------------------------------------------------------------------------- */
void serial_inic(char hi_speed) { TX9 = 0; TXEN = 1; SYNC = 0; if (hi_speed) else BRGH = 0; SPBRG = 25; TRISC=0x80; RX9 = 0; SPEN = 1; CREN = 0; CREN = 1; } /* --------------------------------------------------------------------------------Funcin principal --------------------------------------------------------------------------------- */ //La transmisin ser de 8 bits //Se habilita la transmisin //Se configura como modo asncrono //Modo de alta velocidad //Si se indica lo contrario baja velocidad //La transmisin ser de 9600 baudios //Se configuran los pines RC7 como entrada y RC8 como salida del puerto //La recepcin ser de 8 bits //Se habilita el puerto serie //Primero se resetea //Y despus se habilita la transmisin
BRGH = 1;
main(void) {
c;
//Variable donde se almacenar el carcter recibido para transmitirlo //Se inicializa el puerto serie //En un bucle infinito //Se almacena el carcter recibido //Y se enva de nuevo por el puerto serie
c=getch(); putch(c); } }
5.3
/*
/*
================================================================================= Algunas directivas de configuracin para el programador __CONFIG(DEBUGEN & WDTDIS & LVPDIS); ================================================================================= */ /* ================================================================================= Ficheros cabecera con las definiciones bsicas del PIC ================================================================================= */ <pic.h> <stdio.h> "delay.c" ================================================================================= Declaracin inicial de todas las funciones usadas ================================================================================= */
void configurar_modulo_A_D(void); void configurar_int_A_D(void); void configurar_puertos(void); static void interrupt atencion_int(void); unsigned char convierte_7s (unsigned char); void a_pantalla_7(void); void calcular_signo_y_valor(void); /* ================================================================================= Variables globales ================================================================================= */
volatile unsigned char caracter_rx; volatile unsigned int existe_caracter; char valor_BCD_unidades, valor_BCD_decenas, valor_BCD_centenas; unsigned char valor_7s_signo; unsigned char valor_sensor; short valor; int i; /* ================================================================================= Definicin de funciona ================================================================================= */ --------------------------------------------------------------------------------Funcin de inicializacin del convertidor A/D --------------------------------------------------------------------------------- */
/*
Anexo 5
117
void configurar_modulo_A_D(void){ /* * * * * * * * * * */ ADCON0 = 0X40; ADON=1; } /* --------------------------------------------------------------------------------Funcin de configuracin de las interrupciones del modulo A/D void configurar_int_A_D(void); --------------------------------------------------------------------------------- */ void configurar_int_A_D(void) { ADIF=0; //Se resetea el bit indicador de interrupcin producida por el mdulo ADC ADIE=1; //Se habilitan las interrupciones por el mdulo ADC PEIE=1; //Se habilitan las interrupciones producidas por los perifricos RCIE=1; //Se habilita la interrupcin por recepcin de carcter GIE=1; //Se habilitan las interrupciones for (i=0; i<2;i++); //Se introduce un retardo para ADGO=1; //Iniciar la conversin } /* --------------------------------------------------------------------------------Funcin de configuracin de los puertos void configurar_puertos(void); --------------------------------------------------------------------------------- */ void configurar_puertos(void) { TRISB=0x00; //Todos los bits del puerto B se usarn como salida TRISA=0x01; //El PORTA<0> ser entrada analgica (sensor) mientras el resto sern salidas digitales } /* --------------------------------------------------------------------------------Funcin de configuracin del rs232 void configurars232(char hi_speed); --------------------------------------------------------------------------------- */ void serial_inic(char hi_speed) { TX9 = 0; TXEN = 1; SYNC = 0; if (hi_speed) else BRGH = 0; SPBRG = 25; TRISC=0x80; RX9 = 0; SPEN = 1; CREN = 0; CREN = 1; } /* --------------------------------------------------------------------------------Funcin para enviar por el puerto serie el contenido de una variable void putch (unsigned char c) --------------------------------------------------------------------------------- */ void putch (unsigned char c)//La funcin principal enva a travs de una variable el carcter a enviar { while (!TXIF);//Cuando el registro de transmisin se vace TXREG = c; //Se almacena en l el nuevo carcter a enviar } //La transmisin ser de 8 bits //Se habilita la transmisin //Se configura como modo asncrono //Modo de alta velocidad //Si se indica lo contrario baja velocidad //La transmisin ser de 9600 baudios //Se configuran los pines RC7 como entrada y RC8 como salida del puerto //La recepcin ser de 8 bits //Se habilita el puerto serie //Primero se resetea //Y despus se habilita la transmisin //Se arranca el convertidor A/D ADCON1 REGISTER (ADDRESS 9Fh) ADCON1<3:0> PCFG3-PCFG0: A/D Port Configuration Control bits: Configurar los pines/voltajes de referencia y I/O digitales Si PCFG3-PCFG0 = "1110" todas las entradas del PORTA configuran como digitales menos la primera ADCON1<7> ADFM: A/D Result Format Select bit Si es "1" = Right justified. Los 6 MSB del ADRESH son "0" Si es "0" = Left justified. Los 6 LSB del ADRESL son "0" De esta forma, ADRESH contendr los 8 bits mas significativos de la conversin de 10 bits
BRGH = 1;
/* --------------------------------------------------------------------------------Funcin de atencin a la interrupcin static void interrupt atencion_int(void); --------------------------------------------------------------------------------- */ static void interrupt atencion_int(void) { if(ADIF) //Si la interrupcin la ha producido el mdulo ADC { valor_sensor= ADRESH; //Se almacena el valor de la muestra recibida por el convertidor ADIF=0; //Se resetea el bit indicador de interrupcin del mdulo ADC configurar_int_A_D(); //Se vuelven a configurar las interrupciones } else if(RCIF) //Si la interrupcin la ha producido la recepcin de un carcter a travs del //puerto serie { caracter_rx= RCREG; //Se almacena el carcter recibido en una variable RCIF=0; //Se resetea el bit indicador de interrupcin por recepcin de //carcter existe_caracter=1; //Se comunica que se ha recibido un carcter } } /* ---------------------------------------------------------------------------------
118
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
Funcin de atencin a la interrupcin void calcular_signo_y_valor(void); --------------------------------------------------------------------------------- */ void calcular_signo_y_valor(void) { //Si la temperatura es positiva, despus de hallar su valor se deja en blanco el smbolo del signo if(valor_sensor>=51) { valor = valor_sensor * 1.96078 - 100; valor_7s_signo = 0x00; } //En cambio si la temperatura no es positiva, despus de hallar su valor se almacena el smbolo preparado para el display 7 segmentos else { valor = 100 - valor_sensor * 1.953125; valor_7s_signo = 0x40; } } /* --------------------------------------------------------------------------------Funcin que convierte BCD a 7 segmentos, devuelve el valor en 7 segmentos void convierte_7(unsigned char valor); --------------------------------------------------------------------------------- */ unsigned char convierte_7s(unsigned char valor) { unsigned char valor_7s; //Aqu se almacenar el valor BCD equivalente a el que el programa principal //enva como parmetro a esta funcin switch (valor) { case 0: valor_7s = 0x3F; break; case 1: valor_7s = 0x06; break; case 2: valor_7s = 0x5B; break; case 3: valor_7s = 0x4F; break; case 4: valor_7s = 0x66; break; case 5: valor_7s = 0x6D; break; case 6: valor_7s = 0x7D; break; case 7: valor_7s = 0x07; break; case 8: valor_7s = 0x7F; break; case 9: valor_7s = 0x67; default: break; } return (valor_7s); } /* --------------------------------------------------------------------------------Funcin que muestra por pantalla la temperatura void a_pantalla_7(void); --------------------------------------------------------------------------------- */ void a_pantalla_7(void) { PORTA=0x00; //Para evitar que aparezca en el display un dgito que no le corresponde PORTB= convierte_7s(valor_BCD_unidades); //Antes de situar el dato en el puerto B se deseleccionan //los displays PORTA= 0x02; //Solo despus de que el dato correcto se encuentre en el puerto B se activa //el display correspondiente DelayUs(60); //El dato se mantendr en el display durante 60 microsegundos //Se devuelve el valor a la funcin principal
PORTA=0x00; PORTB= convierte_7s(valor_BCD_decenas) + 0x80; PORTA= 0x04; DelayUs(60); PORTA=0x00; PORTB= convierte_7s(valor_BCD_centenas); PORTA= 0x08; DelayUs(60); PORTA=0x00; PORTB= valor_7s_signo; PORTA= 0x20; DelayUs(60); }
Anexo 5
119
/*
void main(void){
//Se resetea la variable que indicar si el men se ha mostrado ya //Configura el modulo A/D //Configura las interrupciones //Configura los puertos //Configura el puerto serie asncrono //Se resetea la variable que indicar si se ha recibido un carcter //En un bucle infinito
while(!existe_caracter) //Mientras no se reciba un carcter { calcular_signo_y_valor(); //Se calcula y almacena la temperatura y su signo valor_BCD_unidades= valor%10; //Se almacena en variables independientes el valor de las unidades valor_BCD_decenas =valor/10%10;//De las decenas valor_BCD_centenas=valor/100; //Y de las centenas a_pantalla_7(); //Se muestra por los displays el valor de la temperatura if(!prim) { //Si nunca se ha enviado el men por el puerto serie, se enva printf("Aplicacin termometro PIC\n\r"); printf("\n\r"); printf("Opciones:\n\r\t"); printf("1 \t Mostrar temperatura.\n\r\r"); prim=1; } } existe_caracter=0;
if (caracter_rx=='1') //Si el carcter recibido es 1 se muestra la temperatura en pantalla { printf("La temperatura registrada por el termmetro es:\n\r\t "); if(!valor_7s_signo) putch('+'); else putch('-'); printf("%d%d%,%d\n\r",valor_BCD_centenas,valor_BCD_decenas,valor_BCD_unidades);} } }
5.4
/*
/*
================================================================================= Algunas directivas de configuracin para el programador __CONFIG(DEBUGEN & WDTDIS & LVPDIS); ================================================================================= */ /* ================================================================================= Ficheros cabecera con las definiciones bsicas del PIC ================================================================================= */ <pic.h> <stdio.h> "delay.c"
================================================================================= Declaracin inicial de todas las funciones usadas ================================================================================= */ void configurar_modulo_A_D(void); void configurar_int_A_D(void); void configurar_puertos(void); static void interrupt atencion_int(void); unsigned char convierte_7s (unsigned char); void a_pantalla_7(void); void calcular_signo_y_valor(void); /* ================================================================================= Variables globales ================================================================================= */
volatile unsigned char caracter_rx; volatile unsigned int existe_caracter; char valor_BCD_unidades, valor_BCD_decenas, valor_BCD_centenas; unsigned char valor_7s_signo; unsigned char valor_sensor; short valor; int i; /* ================================================================================= Definicin de funciones ================================================================================= */
120
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
/*
void configurar_modulo_A_D(void){ /* * * * * * * * * * */ ADCON1 = 0X0E; /* ADCON0 REGISTER (ADDRESS: 1Fh) Este es el registro que controla el funcionamiento de A/D Los bits 7-6 ADCS1:ADCS0: A/D Conversin Clock Select bits Si los bits valen 01 se selecciona Fosc/8 como la frecuencia del convertidor ADCON1 REGISTER (ADDRESS 9Fh) ADCON1<3:0> PCFG3-PCFG0: A/D Port Configuration Control bits: Configurar los pines/voltajes de referencia y I/O digitales Si PCFG3-PCFG0 = "1110" todas las entradas del PORTA configuran como digitales menos la primera ADCON1<7> ADFM: A/D Result Format Select bit Si es "1" = Right justified. Los 6 MSB del ADRESH son "0" Si es "0" = Left justified. Los 6 LSB del ADRESL son "0" De esta forma, ADRESH contendr los 8 bits mas significativos de la conversin de 10 bits
*/ ADCON0 = 0X40; ADON=1; } /* --------------------------------------------------------------------------------Funcin de configuracin de las interrupciones del modulo A/D void configurar_int_A_D(void); --------------------------------------------------------------------------------- */ //Se arranca el convertidor A/D
void configurar_int_A_D(void) { ADIF=0; //Se resetea el bit indicador de interrupcin por el mdulo ADC ADIE=1; //Se habilitan las interrupciones por el mdulo ADC PEIE=1; //Se habilitan las interrupciones producidas por perifricos del PIC GIE=1; //Se habilitan las interrupciones ADGO=1; //Comienza la conversin } /* --------------------------------------------------------------------------------Funcin de configuracin de los puertos void configurar_puertos(void); --------------------------------------------------------------------------------- */
void configurar_puertos(void) { TRISB=0x00; //Todos los bits del puerto B se usarn como salida TRISA=0x01; //El PORTA<0> ser entrada analgica (sensor) mientras el resto sern salidas digitales } /* --------------------------------------------------------------------------------Funcin de configuracin del rs232 void configurars232(char hi_speed); --------------------------------------------------------------------------------- */
void configura_rs232() { TX9 = 0; TXEN = 1; SYNC = 0; BRGH = 1; SPBRG = 25; TRISC=0x80; RX9 = 0; SPEN = 1; CREN = 0; CREN = 1; }
//La transmisin ser de 8 bits //Se habilita la transmisin //Se configura como modo asncrono //Modo de alta velocidad //La transmisin ser de 9600 baudios //Se configuran los pines RC7 como entrada y RC8 como salida del puerto //La recepcin ser de 8 bits //Se habilita el puerto serie //Primero se resetea //Y despus se habilita la transmisin
/* --------------------------------------------------------------------------------Funcin para enviar al Hyperterminal el contenido de una variable void putch (unsigned char c) --------------------------------------------------------------------------------- */ void putch (unsigned char c) //La funcin principal enva a travs de una variable el carcter a enviar { while (!TXIF); //Cuando el registro de transmisin se vace TXREG = c; //Se almacena en l el nuevo carcter a enviar } /* --------------------------------------------------------------------------------Funcin de atencin a la interrupcin static void interrupt atencion_int(void); --------------------------------------------------------------------------------- */ static void interrupt atencion_int(void) { if(ADIF) { valor_sensor= ADRESH; ADIF=0; configurar_int_A_D(); }
//Si la interrupcin la ha producido el mdulo ADC //Se almacena el valor de la muestra recibida por el convertidor //Se resetea el flag indicador de interrupcin por el mdulo ADC //Se configuran las interrupciones
Anexo 5
121
} /* --------------------------------------------------------------------------------Funcin de atencin a la interrupcin static void interrupt atencion_int(void); --------------------------------------------------------------------------------- */ void calcular_signo_y_valor(void) { //Si la temperatura es positiva, despus de hallar su valor se deja en blanco el smbolo del signo if(valor_sensor>=51) { valor = valor_sensor * 1.96078431 - 100; valor_7s_signo = 0x00; } //En cambio si la temperatura no es positiva, despus de hallar su valor se almacena el smbolo preparado para el display 7 segmentos else { valor = 100 - valor_sensor * 1.96078431; valor_7s_signo = 0x40; } }
/* --------------------------------------------------------------------------------Funcin que convierte BCD a 7 segmentos, devuelve el valor en 7 segmentos void convierte_7(unsigned char valor); --------------------------------------------------------------------------------- */ unsigned char convierte_7s(unsigned char valor) { unsigned char valor_7s; //Aqu se almacenar el valor BCD equivalente a el que el programa principal //enva como parmetro a esta funcin switch (valor) { case 0: valor_7s = 0x3F; break; case 1: valor_7s = 0x06; break; case 2: valor_7s = 0x5B; break; case 3: valor_7s = 0x4F; break; case 4: valor_7s = 0x66; break; case 5: valor_7s = 0x6D; break; case 6: valor_7s = 0x7D; break; case 7: valor_7s = 0x07; break; case 8: valor_7s = 0x7F; break; case 9: valor_7s = 0x67; default: break; } return (valor_7s); } //Se devuelve el valor a la funcin principal
/* --------------------------------------------------------------------------------Funcin que muestra por pantalla la temperatura void a_pantalla_7(void); --------------------------------------------------------------------------------- */ void a_pantalla_7(void) { PORTA=0x00; //Para evitar que aparezca en el display un dgito que no le corresponde PORTB= convierte_7s(valor_BCD_unidades); //Antes de situar el dato en el puerto B se deseleccionan //los displays PORTA= 0x02; //Solo despus de que el dato correcto se encuentre en el puerto B se activa //el display correspondiente DelayUs(60); //El dato se mantendr en el display durante 60 microsegundos
PORTA=0x00; PORTB= convierte_7s(valor_BCD_decenas) + 0x80; PORTA= 0x04; DelayUs(60); PORTA=0x00; PORTB= convierte_7s(valor_BCD_centenas); PORTA= 0x08; DelayUs(60); PORTA=0x00; PORTB= valor_7s_signo;
122
Aplicacin de los microcontroladores a la docencia de sistemas digitales: Termmetro digital a tiempo real y conexin serie a PC
PORTA= 0x20; DelayUs(60);
/*
void main(void){
//Variable que se utilizar en el retardo //Configura el modulo A/D //Configura las interrupciones //Configura los puertos //Configura el puerto serie asncrono
calcular_signo_y_valor(); //Se calcula y almacena la temperatura y su signo valor_BCD_unidades= valor%10; //Se almacena en variables independientes el valor de las unidades valor_BCD_decenas =valor/10%10; //De las decenas valor_BCD_centenas=valor/100; //Y de las centenas a_pantalla_7(); //Se muestra por los displays el valor de la temperatura for(i=0;i<265;i++) { a_pantalla_7(); } putch(valor_sensor); } } //Durante cierto tiempo //Se muestra por los displays el valor de la temperatura