UNIVERSIDAD AUTÓNOMA DE ZACATECAS UNIDAD ACADÉMICA DE INGENIERÍA ELÉCTRICA BÁSCULA ELECTRÓNICA CONTROLADA CON PIC16F873 TESIS PROFESIONAL QUE PARA OBTENER EL TÍTULO DE: INGENIERO EN COMUNICACIONES Y ELECTRÓNICA PRESENTAN: CARLOS ALBERTO MERCADO GALVÁN JOSÉ ESPARZA CISNEROS VÍCTOR ROMERO CARRILLO ASESORES: M. P. R. H. ANTONIO ARELLANO NERI M. I. ERNESTO GARCÍA DOMÍNGUEZ ZACATECAS ZAC., OCTUBRE DE 2006 UNIVERSIDAD AUTÓNOMA DE ZACATECAS UNIDAD ACADÉMICA DE INGENIERÍA ELÉCTRICA BÁSCULA ELECTRÓNICA CONTROLADA CON PIC16F873 TESIS PROFESIONAL QUE PARA OBTENER EL TÍTULO DE: INGENIERO EN COMUNICACIONES Y ELECTRÓNICA PRESENTAN: CARLOS ALBERTO MERCADO GALVÁN JOSÉ ESPARZA CISNEROS VÍCTOR ROMERO CARRILLO ASESORES: M. P. R. H. ANTONIO ARELLANO NERI M. I. ERNESTO GARCÍA DOMÍNGUEZ ZACATECAS ZAC., OCTUBRE DE 2006 Dedicatorias A mis padres Alberto Mercado Alvarado y Ma. Del Rosario Galván Calderón por su apoyo y confianza en todos estos años ya que sin ellos no hubiera sido posible el estar donde ahora me encuentro, gracias por todo el amor, cariño, compresión, paciencia, sacrificio y fe que depositaron en mi. A mis hermanos hermanos por estar a mi lado y animarme cuando hacia falta, ya que me enseñaron lecciones valiosas para la vida. A mis abuelos, abuelas, tíos, tías, primos, primas y a toda mi familia por ser como son y por el apoyo que me brindaron. A Lorena por ser una persona tan especial en mi vida. A mis compañeros y amigos por su verdadera amistad en las buenas y en las malas. Carlos Alberto Mercado Galván Este trabajo lo quiero dedicar especialmente a mis padres que siempre estuvieron apoyándome apoyándome en todo momento, por su paciencia y por haber creído en mí. A mi esposa Rosa del Carmen por todo su apoyo y confianza, por sus consejos que me fortalecieron en los momentos de desanimo, quiero agradecer también su paciencia y comprensión. A mi hermano Carlos y mi hermano Miguel por ayudarme a realizar este sueño. A mis hermanas Amada, Yola y Silvia que también se preocuparon y estuvieron al pendiente de mi durante toda mi carrera. José Esparza Cisneros A mis padres por darme la vida y oportunidad de seguir estudiando para superarme y por todo su apoyo incondicional. A mis hermanos por estar siempre a mi lado confiando en mi y por apoyarme en todo momento, en quienes confío por siempre. A mis amigos y compañeros por su su amistad y apoyo en todos los momentos más difíciles, por sus consejos y por su confianza. Y a nuestro grupo con quienes he compartido momentos tan excelentes e inolvidables en estos años. A mis maestros, a todos pero especialmente a nuestros asesores porque gracias a sus conocimientos y enseñanzas he logrado concluir mi trabajo y esta meta. Víctor Romero Carrillo Agradecimientos A Dios, por darnos la oportunidad de vivir y experimentar experimentar la aventura de la vida, también por rodearnos de personas de las cuales hemos aprendido lecciones importantes para continuar siempre adelante. A todas las personas que nos ayudaron e impulsaron y que fueron parte importante en el desarrollo de nuestra nuestra carrera pero sobre todo gracias a: A nuestras familias por la confianza depositada desde el principio de la carrera hasta el día de hoy. A la Universidad Autónoma de Zacatecas por abrirnos las puertas para lograr nuestra formación profesional. A los los maestros por su apoyo incondicional cuando los necesitamos. Por todos sus conocimientos y por lo que nos enseñaron a lo largo de la carrera. A nuestros asesores, al M.P.R.H. Antonio Arellano Neri y al M.I. Ernesto García Domínguez, por prestarnos su tiempo tiempo y ayudarnos todo lo posible en la elaboración de este proyecto. Carlos Alberto Mercado Galván José Esparza Cisneros Víctor Romero Carrillo Í N D I C E GENERAL CAPÍTULO I. CONCEPTOS BÁSICOS 1.1 Introducción…………………………………………………………...………...1 1.2 Descripción general…………………………………………………...………..2 1.3 Objetivos……………………………………………………………..…………3 CAPÍTULO II. GALGAS EXTENSIOMÉTRICAS 2.1 Introducción……………………...………………………………….………….4 2.2 Descripción constructiva………………………………....…………….…….....5 2.3 Puente utilizado...……....…………………………………………………….....6 2.4 Celdas de carga…….….……………….……………………………………….7 2.5 Tipos de celdas de carga……………….……………………………..…...……8 CAPÍTULO III. CARACTERISTICAS DEL MICROCONTROLADOR PIC16F873 Y OTROS ELEMENTOS FUNDAMENTALES 3.1 Introducción…………………………………………………………….……...12 3.2 Arquitectura de un microcontrolador………………………………....……….12 3.3 Microcontroladores PIC (circuito integrado programable)…………….……...13 3.4 Recursos auxiliares……………………………………………….……………14 3.5 Familias de los PIC………………………………………………..…………...15 3.6 Microcontrolador PIC16F873……………………………….………………...17 3.6.1 Características……………….…………………….……………......17 3.6.2 Dispositivos periféricos…………………………………………….18 3.6.3 Terminales de propósito general……………………...…………….19 3.6.4 Puerto A…………………………………………………………….19 3.6.5 Puerto B…………………………………………………………….20 3.6.6 Puerto C…………………………………………………………….20 3.6.7 Conversor A/D……………………………………………………..21 3.6.8 Comunicación serie en modo I2C.…………...….………………….24 3.7 Pantalla de cristal líquido……...…………….…………….…………………..26 3.8 Reloj de tiempo real DS1307……………………………...…….……………31 CAPÍTULO IV. DISEÑO DE PROTOTIPO BÁSCULA ELECTRÓNICA 4.1 Introducción……………………………………………………………….......34 4.2 Desarrollo……………………………………………………………………...35 4.3 Fuentes de alimentación………………………………………………….……35 4.3.1 Fuente de 5 Vdc……...………….…………………………………..35 4.3.2 Fuente de 10 Vdc………..……….………………………………….36 4.4 Sensor y etapa de amplificación……..………………………………………...37 4.5 Etapa digital……………………………………………………………………41 4.5.1 Circuito de reset……………………………...….………….…....…43 4.5.2 Circuito del oscilador………………………….……...……………43 4.5.3 Reloj de tiempo real…………………………....…………….……..44 4.5.4 Botones para configurar el reloj de tiempo real…………….……..45 4.5.5 Conectores para los conversores A/D……...……….………………46 4.5.6 Pantalla de cristal líquido…………….………………………….….47 4.6 Programación….………………………………………….…………………...48 4.6.1 Diagrama de flujo del funcionamiento general de la báscula………..48 4.6.2 Diagrama de flujo de operación del conversor A/D..………………..49 4.6.3 Diagrama de flujo de operación escritura para el RTC……………...50 4.6.4 Diagrama de flujo de operación lectura para el RTC………………..51 4.6.5 Código del programa……………………………..……………...…..52 CAPÍTULO V. ANÁLISIS EXPERIMENTAL 5.1 Estructura del prototipo………………….…………………………………….88 5.1.1 Estructura mecánica…......................................................................88 5.1.2 Sensor de peso………………………………………..…………….91 5.1.3 Módulo de control………………………………………………….91 5.1.4 Pantalla visual………………………………………………………92 5.2 Funcionamiento del prototipo……...………………………………………..…92 5.3 Análisis de pruebas………………………………………………………...…..93 CONCLUSIONES…………..………………………………………………………..…..97 TRABAJO A FUTURO…………...………………………………..…………….....…...97 ANEXOS……………………………………...…..……………………………….………98 Anexo A Manual de ajuste del RTC DS1307 para el usuario. Anexo B Conjunto de instrucciones PIC16F873. Anexo C DS1307 Reloj de tiempo real. Anexo D LM324 Amplificador operacional. BIBLIOGRAFÍA ÍNDICE DE FIGURAS Figura 2.1 Circuito Puente de Wheatstone....……….…………………………………...……..………..…....6 Figura 2.2 Galga extensiométrica………………………………………………….…….……………..….....7 Figura 2.3 Celda de carga de punto sencillo…...….………….………………...…..9 Figura 2.4 Celda de carga de tipo S……………...…….……….…………..………...10 Figura 2.5 Celdas de carga de Compresión……………….……………….………11 Figura 3.1 Arquitectura Harvard…...…….…………………….………….………14 Figura 3.2 Arquitectura Von Newmann……...………………………..…….…….14 Figura 3.3 Encapsulado del PIC16F873……….………………………...….……..17 Figura 3.4 Memoria RAM del LCD……………………………………………….27 Figura 3.5 Manejo del bus en la comunicación I2C……………………….…...….32 Figura 4.1 Fotografía de la báscula electrónica……………….……………...…...34 Figura 4.2 Fuente de 5 Vdc……..………………………………...……………..….36 Figura 4.3 Fuente de 10 Vdc……………..…..…………………….………….……37 Figura 4.4 Etapa de amplificación………………….………………….…....……..41 Figura 4.5 Etapa digital………………………………………………..……..……42 Figura 4.6 Circuito de reset………………..…………………………….…......….43 Figura 4.7 Circuito del oscilador……………………….………………….…..…..44 Figura 4.8 Circuito del reloj de tiempo real………………………………...……..45 Figura 4.9 Botones para configurar el RTC…………………..…………...………46 Figura 4.10 Entradas de conversores A/D…………………………………..……..46 Figura 4.11 Conexión del LCD con el microcontrolador.……………….…...…....47 Figura 4.12 Diagrama de flujo del funcionamiento de la báscula........................…48 Figura 4.13 Diagrama de flujo del Conversor A/D………………………………..49 Figura 4.14. Diagrama de flujo de modo escritura para el RTC…………...…...…50 Figura 4.15 Diagrama de flujo de modo lectura para el RTC………………….…51 Figura 5.1 Estructura metálica…………………………………………..…………88 Figura 5.2 Cruz de soporte…………………………………..…………………….89 Figura 5.3 Charola…………………………………………………………………89 Figura 5.4 Canaleta y base…………………………………………….…………..90 Figura 5.5 Sensor de peso………………………………………………………….91 Figura 5.6 Módulo de control………………………………………………..…….91 Figura 5.7 Pantalla visual……………………………………………...…………..92 Figura 5.8 Cálculo de matriz……………………………………………………...95 ÍNDICE DE TABLAS Y GRÁFICAS Tabla 3.1 Terminales de propósito general………...……………………….…….19 Tabla 3.2. Terminales de puerto A.………………………………………….…….19 Tabla 3.3 Terminales de puerto B.……………………………………….….……20 Tabla 3.4 Terminales de puerto C.…………………………….….……………....20 Tabla 3.5 Registros ADCON0 y ADCON1……...…………………………..…...22 Tabla 3.6 Selección de canal para introducir la señal a convertir……….….…… 22 Tabla 3.7 Registro SSPCON……………………………………………….…….26 Tabla 3.8 Distribución de las líneas del LCD………………………………..……28 Tabla 3.9 Mandos de control del LCD…………………………………….…..…..29 Tabla 3.10 Puertos y señales RTC…………………………………………..….….32 Tabla 3.11 Mapeo de memoria del RTC……………………………………...…...33 Tabla 4.1 Tabla de correspondencia mV/kgs…………….......................................40 Tabla 5.1 Relación Peso/Voltaje…………………………………………….…….93 Tabla 5.2 Valores para método de mínimos cuadrados……………………..……..94 Grafica 5.1 Análisis gráfico………………………….………………...…………..96 CAPÍTULO I CONCEPTOS BÁSICOS 1.1. INTRODUCCIÓN Los sistemas digitales han logrado alcanzar importantes avances en la tecnología moderna, de tal forma que ahora se pueden realizar diferentes tareas complejas en pocos segundos y sin la intervención del hombre más que en el diseño y en el mantenimiento de los equipos electrónicos que se emplean en el hogar, en la industria y casi en todo lugar. En el medio ambiente ocurren fenómenos físicos que en un momento dado se desea saber su magnitud, por ejemplo: la temperatura del medio ambiente, la presión del agua que fluye a través de una tubería, la velocidad del viento, el peso de alguna persona o de un objeto, etc. Estos fenómenos físicos se pueden convertir, por medio de transductores, en señales eléctricas que luego pueden ser digitalizadas y enviadas a un microcontrolador para manipulación y poder así mostrar un resultado comprensible, rápido, preciso y confiable. Con la llegada de los microcontroladores se redujo el número de periféricos o elementos discretos que se requerían en otros sistemas de control tradicionales, además de otras ventajas inherentes como: su gran versatilidad, costo reducido y fácil manejo. 1.2. DESCRIPCIÓN GENERAL La idea fundamental de este proyecto de tesis es el desarrollo de una báscula electrónica capaz de medir pesos. El diseño está basado en un microcontrolador PIC16F873, con encapsulado de 28 patitas, que es el cerebro principal de toda operación. Otros periféricos que forman parte del sistema son: un sensor de presión (una celda de carga compuesta de una galga extensiométrica), un reloj de tiempo real (RTC), capaz de almacenar la hora y fecha. Por último se utiliza una pantalla de cristal líquido o LCD para mostrar todos los datos que se quieren visualizar. El sensor utilizado, comúnmente llamado celda de carga, tiene un rango de operación de 0 – 40 kg, sin embargo, se podría extender dicho intervalo haciendo el cambio por un sensor de mayor rango de operación en el prototipo. Ya que el sensor entrega una señal eléctrica muy pequeña, del orden de los milivolts, es necesario utilizar un amplificador para aumentar el voltaje. Para esta etapa se utiliza un amplificador operacional LM324 que aumentar la señal a niveles más fácilmente manipulables para el microcontrolador. Una vez que se ha hecho la lectura del peso, lo ideal es que se pueda mostrar de una manera clara y rápida en una pantalla LCD. Este tipo de dispositivos son muy versátiles y de uso común en la vida diaria, por ejemplo en relojes, hornos de microondas, estéreos, dvds, etc. Para complementar el trabajo se suma un dispositivo denominado reloj de tiempo real (RTC) para mostrar información adicional al peso, como la hora y la fecha. Este circuito provee todos estos datos, incluyendo corrección de años bisiestos. El RTC no es muy conocido, por lo que es una buena opción, para adentrarse en su programación, para su aplicación en trabajos futuros. 1.3. OBJETIVOS El presente trabajo inicia con la inquietud de experimentar con galgas extensiométricas, muy usadas en la vida cotidiana. En este caso se emplea una celda de carga modelo LPS (Single Point Loadcells) de 40 kg que parte de este principio. Otros de los objetivos que se planean es el de ampliar los conocimientos en el manejo de los microcontroladores PIC y otros dispositivos periféricos que son muy importantes como la pantalla de cristal líquido y el RTC, de tal forma que el dominio eficaz de éstos nos permita el desarrollo de proyectos futuros. La elección del microcontrolador se hace en base a las innumerables prestaciones que ofrece, entre las cuales pueden citarse: su rapidez, bajo costo, el bajo consumo de energía, la facilidad para programarse, reducida circuitería logrando así módulos compactos. Otro aspecto importante es que se cuenta con las herramientas y programas necesarios para su programación, tales como: a) El MPLAB que es donde se edita y crea el programa en ensamblador. b) El PIC SIMILATOR IDE que es un simulador que ofrece las herramientas necesarias para una buena simulación virtual. c) El IC PROG y el programador QUARK-PRO 2 que en conjunto permiten la introducción del código al microcontrolador PIC. CAPÍTULO II GALGAS EXTENSIOMÉTRICAS 2.1. INTRODUCCIÓN Los transductores se definen como dispositivos que convierten energía o información de una forma en otra. Se emplean extensamente en el trabajo de medición porque no todas las cantidades que se necesitan medir se pueden manipular con facilidad. Se puede efectuar una mejor medición de una cantidad si esta se puede convertir a otra forma que se pueda mostrar con facilidad y exactitud. Un ejemplo muy claro de esto es el termómetro que muy comúnmente utilizamos para saber a que temperatura está el medio ambiente. Este transductor convierte los cambios de temperatura en cambios de longitud de una columna de mercurio. Los transductores eléctricos convierten cantidades físicas en señales eléctricas y constituyen la vasta mayoría de los transductores que se emplean hoy en día; la razón es que las señales eléctricas poseen muchas cualidades deseables para la medición. Hay tres elementos principales comunes a la mayoría de los sistemas de medición: 1. Elemento de detección (sensor): El objetivo del elemento de detección es responder a la magnitud (cambios en la magnitud) de la cantidad que se está midiendo. La respuesta del sensor toma la forma de una señal de salida cuya magnitud es proporcional a la magnitud de la cantidad que se está mencionando. 2. El modificador de señal: Este elemento recibe la señal de salida del elemento de detección y la modifica mediante la amplificación o por conformación adecuada de su onda. Cuando la señal sale del modificador de señal, debe de estar en forma adecuada para su despliegue o registro. 3. El dispositivo de despliegue o de registro: En sistemas eléctricos las pantallas o los registradores pueden ser medidores, tubos de rayos catódicos, registradores de carta, grabadoras de cinta, registradoras X-Y y computadoras digitales. Cuando se intenta hacer una medición de una cantidad no eléctrica convirtiendo la cantidad a una forma eléctrica, se debe seleccionar el transductor adecuado (o combinación de transductores) para llevar a cabo la conversión. El primer paso en el procedimiento de selección es definir con claridad la naturaleza de la cantidad que se ha de medir. Esto debe comprender el conocimiento del rango de magnitudes y frecuencias que se espera que exhiba la cantidad. Cuando se ha establecido el problema, se deben examinar los principios del transductor disponible para medir la cantidad deseada. Si uno o más principios del transductor son capaces de producir una señal satisfactoria se debe decidir si usar un transductor comercial o intentar construir el transductor. 2.2. DESCRIPCIÓN CONSTRUCTIVA Existen dos tipos de galgas básicos: 1. De hilo conductor o lámina conductora. El sensor está constituido básicamente por una base muy delgada no conductora y muy flexible, sobre la cual va adherido un hilo metálico muy fino. Las terminaciones del hilo acaban en dos terminales a los cuales se conecta el transductor. 2. Semiconductor. Las galgas semiconductoras son similares a las anteriores. En este tipo de galgas se sustituye el hilo metálico por un material semiconductor. La principal diferencia constructiva de estas galgas respecto a las anteriores se encuentra en el tamaño; las galgas semiconductoras tienen un tamaño más reducido. 2.3. PUENTE UTILIZADO El montaje más común utilizado para medir deformaciones mediante galgas es el puente de Wheatstone. Existen tres tipos de montajes básicos: con una, dos y cuatro galgas. La medida se suele realizar por deflexión, es decir, midiendo la diferencia de tensión existente entre las terminales de salida del sensor. Las principales diferencias de estos montajes se encuentran en la sensibilidad y la capacidad de compensación del efecto de temperatura. Esta compensación consiste en suprimir los efectos de la temperatura en el valor de la resistencia de la galga; cuando en un puente de medida coinciden dos o cuatro galgas de iguales características, los efectos de la temperatura se anulan ya que ésta les afecta por igual. Suministrando un voltaje de excitación, se puede generar un voltaje de salida (Formula No.1) a través del puente y entonces determinar la resistencia de la galga extensiométrica, como se muestra en la figura 2.1. R3 R2 Vo = − • VEX ………..…….( 1 ) R3 + R4 R1 + R2 Figura 2.1. Circuito Puente de Wheatstone. 2.4. CELDAS DE CARGA Una vez que la galga extensiométrica es diseñada, tiene que ser incorporada al sistema para su funcionamiento, haciendo que la variable bajo estudio se convierta en una deformación mecánica, es decir, la galga es montada en un elemento elástico dentro del transductor, sometido a una fuerza proporcional a la variable medida, como se muestra en la figura 2.2. Figura 2.2. Galga extensiométrica. La celda de carga utilizada como el sensor de peso, es un transductor que mide fuerza mecánica y cambia linealmente su salida en un voltaje proporcional a esta fuerza aplicada. Es acondicionada en unidad de peso, gramos, kilogramos y toneladas ( libras en el caso de ser hechas en Estados Unidos de América), y estará midiendo desde cero hasta la capacidad a la que fue hecha. El cuerpo de la celda de carga (usualmente acero, acero inoxidable o aluminio) es forjado para asegurar que la sección donde la galga extensiométrica es montada esté puesta bajo el mayor estiramiento mecánico, teniendo en cuenta la información básica que a continuación se incluye: a) Capacidad: Es la capacidad total de la celda de carga. b) Sobrecarga: El máximo porcentaje de carga completa que la celda de carga puede soportar antes de que sufra de daños irreparables. (Este es típicamente de 150%). c) Precisión: Puede ser expresada en términos de linealidad, repetición, deslizamiento y rapidez. Estas condiciones son todas expresadas como un porcentaje de la capacidad total de la celda de carga. Por ejemplo, una celda de carga de 100 kg. Tiene una precisión total figurada en un ±0.03%. Esto significa que la celda de carga medirá cargas entre 0 y 100 kg con ± 30 gramos de precisión, pero si la carga comienza en 5 kg. y termina en 95 kg. d) Sensibilidad: La sensibilidad de una celda de carga se determina con el voltaje actualizado de salida que se obtendría cuando se pone la carga completa. Estos valores son expresados todos en mV/V. Por ejemplo, si tiene 3 mV/V de salida y el voltaje de excitación es de 10 Vdc, entonces la salida con carga completa será de 30 mV. e) Sensibilidad Térmica: Indica que tanto la salida cambiará con la temperatura, y es comúnmente expresada en porcentaje de carga completa/° C. f) Tamaño de la plataforma: Para celdas de carga de punto sencillo (single point), algunas veces llamado centro de gravedad de la celda; esto nos dice el máximo tamaño de la plataforma que puede ser fijada sobre la celda de carga. 2.5. TIPOS DE CELDAS DE CARGA Hay una gran variedad de transductores que se pueden utilizar ya sea para medir variables físicas como torsión, presión, presión diferencial, compresión. La utilizada en este proyecto es el transductor de compresión comúnmente llamado celda de carga, y dentro de estas se encuentran diferentes tipos. La más utilizada es la de punto sencillo (single point), que es la que se aplicó en la báscula. A continuación se describen algunas de ellas: I. Celdas de carga de punto sencillo (single point): Probablemente cuentan con el más grande porcentaje de todas las celdas existentes en todo el mundo; son el corazón de la mayoría de las pequeñas básculas escalables y son usadas también en un alto rango de aplicaciones. Punto sencillo es un nombre malo para estas celdas y debería de ser usado el nombre de “plataforma” el cual es mucho más aplicable. Lo que hace que este tipo sea diferente de todas, es que la carga no necesita ser aplicada en el punto donde la celda es montada, puede aceptar una plataforma de dimensiones especificadas que puede ser sobrepuesta. Por tal motivo, el peso entonces es aplicado en algún punto en la plataforma y la celda medirá de un modo preciso. La capacidad viene desde 600 gr. hasta 2,000 kg. En la figura 2.3 se ilustra una celda de este tipo. Figura 2.3. Celda de carga de punto sencillo. II. Celda de carga tipo S: Es más comúnmente utilizada en tensión (también puede ser usada en compresión). Puede ser fijada de modo que la fuerza aplicada pase perpendicularmente hasta el centro de la celda de carga. Para asegurar que esto pase, muchos de los usuarios colocan tornillos para el movimiento de la celda, lo cual coopera con fuerzas de expansión y otras pérdidas de alineamiento. Son usadas para peso de Vessel, probadores de extensión, dominio de torque y otras aplicaciones. Pueden conseguirse para capacidades desde 20 kg. hasta 10,000 kg. Su estructura se muestra en la figura 2.4 Figura 2.4. Celda de Carga tipo S. III. Celdas de carga de Compresión: Vienen en gran variedad de diseños y uno de ellos se ilustra en la figura 2.5. Generalmente el bajo perfil del tipo de gato hidráulico ofrece una baja precisión, por lo que vale la pena utilizar el tipo cilíndrico o de botella que ofrece alta precisión. Estas son, generalmente usadas o acondicionadas con una armazón, fondo redondeado donde la carga es aplicada. Frecuentemente son utilizadas en equipos de prueba. Figura 2.5. Celdas de carga de Compresión. CAPÍTULO III CARACTERÍSTICAS DEL MICROCONTROLADOR PIC16F873 Y OTROS ELEMENTOS FUNDAMENTALES 3.1. INTRODUCCIÓN El microcontrolador comienza a fabricarse cuando las técnicas de integración se vieron mejor desarrolladas; y más aún cuando se tuvo la necesidad de sistemas programables casi inteligentes tanto en la industria como en aplicaciones domésticas que requieren de controlar varios elementos con instrucciones bien definidas y precisas. Un ejemplo podría ser una fotocopiadora que debe controlar gran cantidad de elementos y funciones a la vez. Este dispositivo además de ser un circuito integrado programable que contiene todos los componentes de un computador vino a reducir las dimensiones en gran cantidad de los equipos electrónicos de trabajo donde se encuentra insertado. Texas Instruments fue quien fabricó el TSM1000 que es el primer microcontrolador que integraba un reloj, procesador, memoria ROM, memoria RAM y soportes de entrada y salida en un solo módulo. 3.2. ARQUITECTURA DE UN MICROCONTROLADOR Los elementos indispensables para el funcionamiento de un microcontrolador son los siguientes: • CPU • La memoria ROM • La memoria RAM • Puertos El CPU es el cerebro del sistema y su función consiste en procesar todos los datos que viajan a través del bus. La memoria ROM es una memoria no volátil y es donde se almacenan los programas. Para poder trabajar correctamente, el microprocesador necesita, a menudo, almacenar datos temporales en alguna parte, y aquí es donde interviene la memoria RAM Los puertos pueden ser unidireccionales (entrada o salida) o bidireccionales (entrada y salida); están encargados de la comunicación del microprocesador con dispositivos periféricos. 3.3. MICROCONTROLADORES PIC (Circuito Integrado Programable) Los microcontroladores PIC han logrado una compactación de código óptima y una velocidad alta, integrando en su procesador tres de las características más avanzadas en los grandes computadores: • Procesador tipo RISC. • Ejecución segmentada. • Arquitectura HARVARD. Usan el conjunto de instrucciones de tipo RISC (Código de instrucciones Reducido), ejecutando la mayoría de las instrucciones en un solo pulso de reloj, a diferencia de la arquitectura CISC con la cual se logran instrucciones más poderosas pero a costo de varios ciclos de reloj en su ejecución. Con la arquitectura HARVARD mostrada en la fig. 3.1, se puede acceder de forma simultánea e independiente a la memoria de datos y a la de programa. El aislamiento y la diferenciación de los dos tipos de memoria permiten que cada uno tenga la longitud y el tamaño más adecuado, a diferencia de la arquitectura Von Neumann, de la figura 3.2, en la cual la memoria de datos y de programa se encuentran juntos, accediendo a ellas por el mismo bus. Figura 3.1. Arquitectura Harvard. Figura 3.2 Arquitectura Von Newmann. Otra característica relevante de los PIC es el manejo intensivo del Banco de Registros, los cuales participan de manera muy activa en la ejecución de las instrucciones. De igual forma, la memoria RAM complementa los registros internos implementando en sus posiciones registros de propósito específico y de propósito general. 3.4. RECURSOS AUXILIARES PERRO GUARDIÁN. Se trata de un contador interno de 8 bits que origina un Reset cuando se desborda. TEMPORIZADOR. En los programas de control de dispositivos suelen usarse para determinar intervalos concretos de tiempo. CONVERSORES A/D Y D/A. Encargados de la conversión de señales ya sea de analógica a digital o viceversa. PROTECCIÓN ANTE FALLOS DE ALIMENTACIÓN. Utilizado para ocasionar una inicialización al microcontrolador cuando la tensión de alimentación cae por debajo de cierto límite. ESTADO DE REPOSO O DE BAJO CONSUMO. Recomendado para aquellos procesos en los que hay periodos largos de espera sin actividad del microcontrolador. CONTROL DE INTERRUPCIONES. Utilizadas para atender sucesos que se encuentran fuera de la secuencia del programa. 3.5. LA FAMILIA DE LOS PIC Una de las labores más importantes del ingeniero de diseño es la elección del modelo de microcontrolador que mejor satisfaga las necesidades del proyecto con el mínimo presupuesto. En 1997 el fabricante de los PIC dispone de 52 versiones diferentes y cada año aumenta considerablemente su lista. Microchip dispone de cuatro familias de microcontroladores de 8 bits para adaptarse a las necesidades de la mayoría de los clientes potenciales. Gama enana: PIC12C(F)XXX Se trata de un grupo de PIC de reciente aparición que ha acaparado la atención del mercado. Su principal característica es su reducido tamaño, al disponer todos sus componentes de 8 terminales. Se alimentan con un voltaje de corriente continua comprendido entre 2.5 V y 5.5 V, y consumen menos de 2 mA cuando trabajan a 5 V y 4 MHz. Aunque los PIC enanos sólo tienen 8 terminales, pueden destinar hasta 6 como líneas de E/S para los periféricos porque dispone de un oscilador interno R-C. Los modelos 12C5xx pertenecen a la gama baja, siendo el tamaño de las instrucciones de 12 bits; mientras que los 12C6xx son de la gama media y sus instrucciones tienen 14 bits. Los modelos 12F6xx poseen memoria Flash para el programa y EEPROM para los datos. Gama baja o básica: PIC16C5X con instrucciones de 12 bits Se trata de una serie de PIC de recursos limitados, pero con una de las mejores relaciones costo/prestaciones. Sus versiones están encapsuladas con 18 y 28 patitas y pueden alimentarse a partir de una tensión de 2.5 V, lo que les hace ideales en las aplicaciones que funcionan con pilas. Tienen un repertorio de 33 instrucciones cuyo formato consta de 12 bits. No admiten ningún tipo de interrupción y la pila sólo dispone de dos niveles. Gama media. PIC16CXXX con instrucciones de 14 bits Es la gama más variada y completa de los PIC. Abarca modelos con encapsulados desde 18 patitas hasta 68, cubriendo varias opciones que integran abundantes periféricos; dentro de esta gama se halla el PIC16X84 y sus variantes. El repertorio de instrucciones es de 35 de 14 bits cada una y es compatible con el de la gama baja. Sus distintos modelos contienen todos los recursos que se precisan en las aplicaciones de los microcontroladores de 8 bits. También dispone de interrupciones y una pila de 8 niveles que permite el anidamiento de subrutinas. Dentro de la gama media también se halla la versión PIC14C000, que soporta el diseño de controladores inteligentes para cargadores de baterías, pilas pequeñas, fuentes de alimentación ininterrumpibles y cualquier sistema de adquisición y procesamiento de señales que requiera gestión de la energía de alimentación. Los PC14C000 admiten cualquier tecnología de las baterías como Li Ion, NiMH, NiCd, Pb y Zinc. Gama alta: PIC17CXXX con instrucciones de 16 bits Se alcanzan las 58 instrucciones de 16 bits en el repertorio y sus modelos disponen de un sistema de gestión de interrupciones vectorizadas muy potente. También incluye variados controladores de periféricos, puertos de comunicación serie y paralelo con elementos externos y un multiplicador hardware de gran velocidad. Quizás la característica más destacable de los componentes de esta gama es su arquitectura abierta, que consiste en la posibilidad de amplificación del microcontrolador con elementos externos. Para este fin, las terminales sacan al exterior las líneas de los buses de datos, direcciones y control a las que se conectan memorias o controladores de periféricos. Esta filosofía de construcción del sistema es la que se empleaba en los microcontroladores?? y no suele ser una práctica habitual cuando se emplean microcontroladores. 3.6. MICROCONTROLADOR PIC16F873 El PIC 16F873 está incluido en la gama media de la familia de controladores de microchip; se identifica por tener memoria de programa de tipo flash con encapsulado de 28 patitas. Por otra parte, tiene 3 puertos bidireccionales y hasta 5 canales que conectan al conversor A/D. Figura 3.3. Encapsulado del PIC16F873. 3.6.1. CARACTERÍSTICAS • Procesador de arquitectura RISC avanzada. • Juego de 35 instrucciones con 14 bits de longitud. Todas ellas se ejecutan en un ciclo de instrucción, excepto las de salto que tardan 2. • Frecuencia máxima de 20 Mhz. • Hasta 8 K palabras de 14 bits para la memoria de código, tipo Flash. • Hasta 368 bytes de memoria de datos RAM. • Hasta 256 bytes de memoria de datos EEPROM. • Encapsulados compatibles con los PIC16C73/74/76/77. • Hasta 14 fuentes de interrupción internas y externas. • Pila con 8 niveles. • Modos de direccionamiento directo, indirecto y relativo. • Perro guardián (WDT). • Código de protección programable. • Modo SLEEP de bajo consumo. • Programación serie en circuito con dos patitas. • Voltaje de alimentación comprendido entre 2 y 5.5 volts. • Bajo consumo (menos de 2 mA a 5 V y 5 MHz). 3.6.2. DISPOSITIVOS PERIFÉRICOS • Temporizador 0: temporizador-contador de 8 bits con predivisor de 8 bits. • Temporizador 1: temporizador-contador de 16 bits con predivisor. • Temporizador 2: temporizador-contador de 8 bits con predivisor y postdivisor. • Dos módulos de captura-comparación-PWM. • Conversor A/D de 10 bits. • Puerto serie síncrono (SSP) con SPI e I2C. • USART (transmisor receptor universal síncrono-asíncrono) con 9 bits. 3.6.3. TERMINALES DE PROPÓSITO GENERAL Tabla 3.1. Terminales de propósito general. # de pin 1 Nombre MCLR#/VPP/THV 8 9 10 VSS OSC1/CLKIN OSC2/CLKOUT 19 20 VSS VDD Función Entrada de RESET ó entrada del voltaje de programación ó voltaje alto en el modo TEST. Conexión a tierra. Entrada de cristal de cuarzo del oscilador externo. Salida del cristal de cuarzo, en modo RC la patita OSC2 saca la cuarta parte de la frecuencia que se introduce por OSC1, que determina el ciclo de instrucción. Conexión a tierra. Entrada de la alimentación positiva. 3.6.4. PUERTO A Tabla 3.2. Terminales de puerto A. # de pin 2 Nombre RA0/AN0 3 4 RA1/AN1 RA2/AN2/VREF- 5 RA3/AN3/VREF+ 6 RA4/T0CKI 7 RA5/SS#/AN4 Función Puede actuar como línea digital de E/S ó como entrada analógica al conversor A/D (canal 0). Igual que el RA0/AN0. Puede ser línea digital de E/S, entrada analógica o entrada de voltaje negativo de referencia. Línea digital de E/S, entrada analógica o entrada de voltaje positivo de referencia. Línea digital de E/S o entrada del reloj del timer0. Salida con colector abierto. Línea digital de E/S, entrada analógica o selección como esclavo de la puerta serie sincronía. 3.6.5. PUERTO B Tabla 3.3. Terminales de puerto B. # de pin 21 Nombre RB0/INT 22 23 24 RB1 RB2 RB3/PGM 25 26 27 RB4 RB5 RB6/PGC 28 RB7/PGD Función Línea digital de E/S o entrada de petición de interrupción externa. Línea de E/S digital. Línea de E/S digital. Línea digital de E/S o entrada del voltaje bajo para programación. Línea de E/S digital. Línea de E/S digital. Línea digital de E/S. En la programación serie recibe las señales de reloj. Línea digital de E/S. En la programación serie actúa como entrada de datos. 3.6.6. PUERTO C Tabla 3.4. Terminales de puerto C. # de pin 11 Nombre RCC0/T1OS0/T1CK1 12 RC1/T1OS1/CCP2 13 RC2/CCP1 14 RC3/SCK/SCL 15 RC4/SDI/SDA 16 17 RC5/SDO RC6/TX/CK 18 RC7/RX/DT Función Línea digital de E/S o salida del oscilador del Timer1 o como entrada de reloj del Timer1. Línea digital de E/S o entrada del oscilador del Timer1 o entrada al modulo Captura 2/salida Comparador 2/salida de PWM2. E/S digital. También puede actuar como entrada Captura1/salida Comparador 1/salida del PWM1. E/S digital o entrada de reloj serie sincronía / salida de los modos SPI e I2C. E/S digital o entrada de datos en modo SPI o I/O datos en modo I2C. E/S digital o salida de datos en modo SPI. E/S digital o patita del transmisor del USART asíncrono o como reloj del zirconio. E/S digital o receptor del USART asíncrono o como datos en el síncrono. 3.6.7. CONVERSOR ANALÓGICO/DIGITAL Los microcontroladores PIC16F87x poseen un conversor A/D de 10 bits de resolución y 5 canales de entrada. La resolución que tiene cada bit procedente de la conversión tiene un valor que es función de la tensión de referencia Vref, de acuerdo con la fórmula siguiente: resolucion = (V ref + ) − (Vref − ) 1024 = Vref 1024 .........(2) Si el Vref+ = 5 VDC y el Vref- es tierra, la resolución es de 4.8 mV/bit. La entrada analógica de 0 V corresponde a una salida digital de 00 0000 0000 y cuando es 5 V tenemos 11 1111 1111. Los límites máximo y mínimo de la tensión analógica que se puede convertir son determinados por el voltaje de referencia. El voltaje diferencial mínimo es de 2 V. Una vez seleccionado el canal, se introduce la señal analógica a un condensador de captura y mantenimiento (sample and hold) y luego se introduce al convertidor, proporcionando un resultado digital de 10 bits, mediante la técnica de «aproximaciones sucesivas». REGISTROS DE TRABAJO El funcionamiento del conversor A/D requiere la manipulación de cuatro registros: 1. ADRESH: parte alta del resultado de la conversión. 2. ADRESL: parte baja del resultado de la conversión. 3. ADCON0: registro de control 0. 4. ADCON1: registro de control 1. En la pareja de registros ADRESH: ADRESL se deposita el resultado de la conversión, que al estar compuesta por 10 bits, sólo son significativos 10 de los bits de dicha pareja. En el bit ADFM del registro ADCON1 se selecciona cómo funciona el formato del resultado; si ADFM=1 el resultado se tendrá el los 2 bits menos significativos del ADRESH y en los 8 del ADRESL; mientras que si ADFM=0, el resultado se acomoda en los 8 bits del ADRESH y los 2 restantes en los más significativos de ADRESL. El registro ADCON0, mostrado en la figura 3.4, controla la operación del C A/D, mientras que el ADCON1 sirve para configurar las terminales del Puerto A como entradas analógicas o E/S digitales. Tabla 3.5. Registros ADCON0 y ADCON1. 7 0 ADCS1 ADCS0 CHS2 CHS1 CHS0 GO/DONE# Registro ADCON0 - 7 ADON 0 ADFM - - PCFG3 Registro ADCON1 PCFG2 PCFG1 PCFG0 Los bits ADCON0<7:6> sirven para seleccionar la frecuencia de reloj que se emplea en la conversión. Los bits CHS2-0 seleccionan el canal por el que se introduce la señal analógica a convertir, de acuerdo con la tabla 3.6: Tabla 3.6. Selección de canal para introducir la señal a convertir. CHS2-0 000 001 010 011 100 Canal Canal 0 (RA0/AN0) Canal 1 (RA1/AN1) Canal 2 (RA2/AN2) Canal 3 (RA3/AN3) Canal 4 (RA5/AN4) A continuación, se indican los pasos que hay que efectuar para realizar una conversión A/D: 1. Configuración del módulo C A/D. • Configurar las terminales que actuarán como entradas analógicas, las que trabajan como E/S digitales y las usadas para la tensión de referencia (ADCON1). • Seleccionar el reloj de la conversión (ADCON0). • Seleccionar el canal de entrada A/D (ADCON0). • Activar el módulo A/D (ADCON0). 2. Activar, si se desea, la interrupción escribiendo sobre PIE1 y PIR1. • Borrar el señalizador ADIF. • Poner a 1 el bit ADIE. • Poner a 1 los bits habilitadores GIE y PEIE. 3. Tiempo de espera para que transcurra el tiempo de adquisición. 4. Inicio de la conversión. • Poner a 1 el bit GO/DONE# (ADCON0). 5. Tiempo de espera para completar la conversión A/D, la cual puede detectarse: a). Por la exploración del bit GO/DONE#, que al completarse la conversión pasa a 0. b). Esperando a que se produzca la interrupción si se ha programado, al finalizar la conversión. c). Auque no se permita interrupción, el señalizador ADIF se pondrá a 1 al finalizar la conversión. 6. Leer el resultado de los 10 bits válidos de ADRESH:L y borrar la bandera ADIF. 7. Para una nueva conversión regresar al paso 1 o al 2. El tiempo de conversión por bit está definido por TAD. Se exige esperar un mínimo de 2*TAD para reiniciar una nueva conversión. Si se elige como reloj para la conversión al oscilador RC interno del conversor A/D, éste puede seguir funcionando cuando se introduce el microcontrolador al modo de reposo o SLEEP. En los restantes modos, se aborta la conversión y se desactiva el conversor A/D. 3.6.8. COMUNICACIÓN SERIE EN MODO I2C La comunicación serie es una forma muy apreciada de transferir datos digitales entre sistemas y circuitos integrados, dada la reducida cantidad de líneas que requiere. En los PIC16F87x, Microchip ha implantado el módulo MSSP (Master Synchronous Serial Port), que proporciona una interfaz de comunicación de los microcontroladores con otros microcontroladores y diversos periféricos. El módulo MSSP admite dos de las alternativas más usadas en la comunicación serie síncrona: 1). SPI (Serial Peripheral Interface). 2). I2C (Integer-Integrated Circuit). En el caso de este proyecto se va utilizar la segunda alternativa que es I2C, el cual fue desarrollado por Philips. El protocolo I2C utiliza únicamente dos líneas para la transferencia de información entre los elementos que se acoplan al bus. Una de dichas líneas se dedica a soportar los datos, es bidireccional y se llama SDA ( serial data ). La otra lleva los impulsos de reloj para la sincronización, es unidireccional y recibe el nombre de SCL ( serial clock ). Este tipo de bus alcanza velocidades parecidas a las conseguidas con una del bus paralelo, pero se necesita menos cableado y el hardware es más sencillo. Las líneas, SDA (datos) y SCL (reloj), transportan la información entre los diferentes dispositivos conectados al bus. Cada dispositivo se identifica por una única dirección y puede transmitir o recibir dependiendo de la operación que se va a realizar. Los dispositivos se clasifican en Amo (master) o esclavo (slave). El Amo es el que inicia la transferencia de datos y genera la señal de reloj. El bus I2C es un bus multi-Amo, ya que puede tener más de un Amo conectado y controlando el bus. En nuestro caso el PIC16F873 es el dispositivo en modo Amo y es el que inicia y finaliza la transferencia y genera los pulsos de reloj. También selecciona el esclavo al que se destina la información. Cada transferencia comienza con la condición de inicio (start) y termina con la condición de parada (stop). Ambas condiciones las genera el Amo, y la primera consiste en un flanco descendente en SDA mientras SCL tiene nivel alto. La condición de parada es un flanco ascendente mientras SCL tiene nivel alto. Los datos que se colocan sobre la línea SDA son de 8 bits, que comienzan con el bit más significativo (MSB) y terminan con el bit de menos peso (LSB), al cual sigue en el noveno bit la condición de Reconocimiento (ACK). Para este caso, el transmisor pone SDA = 1, mientras que el receptor pone SDA = 0 en dicho impulso de reloj, prevaleciendo sobre la línea el nivel bajo. El primer byte que envía el Amo, tras la condición de inicio, contiene la dirección del esclavo con el que se desea realizar la comunicación. El código 0 se usa para realizar una “llamada general” sobre todos los esclavos. La dirección en realidad consta de 7 bits, estando destinado el octavo a indicar la operación a realizar (R/W#: lectura/escritura#). Tras este byte inicial de direccionamiento se manda otro byte que especifica las características de la operación a realizar. Para activar el bus I2C hay que poner el bit SSPEN = 1 que es el bit 5 del registro SSPCON (SSPCON<5>) que se ilustra en la tabla 3.7. A partir de ese momento las terminales SDA y SCL quedan configuradas para soportar el protocolo I2C. Previamente dichas terminales del Puerto C (RC3/SCL) y (RC4/SDA) han de estar configuradas como entradas, efectuando los siguientes pasos: poner un uno y un cero en los bits RP0 y RP1 del registro STATUS respectivamente para acceder al banco 1, luego introducir 00011000 al registro TRISC. Tabla 3.7 Registro SSPCON. 7 0 WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 El bit WCOL es un detector de colisiones en escritura y cuando vale 1 significa que se ha intentado escribir en SSPBUF en condiciones no válidas para el protocolo. Si el bit SSPOV vale uno indica desbordamiento, o sea, que llega un bit a SSPBUF sin haberse leído el anterior. Si SSPEN = 1 el puerto serie queda configurado con las funciones propias de SCL y SDA. Si SSPEN = 0 las patitas RC3/SCL y RC4/SDA funcionan como líneas de E/S digitales. El bit CKP sirve para activar el reloj en el modo esclavo, no usándose en el modo amo. Mediante los 4 bits de menos peso de SSPCON se selecciona la frecuencia de reloj. 3.7. PANTALLA DE CRISTAL LÍQUIDO La pantalla de cristal líquido o LCD es un dispositivo de visualización gráfico para la presentación de caracteres, símbolos o incluso dibujos (en algunos modelos). En este caso se utiliza uno de 2 filas de 16 caracteres cada una y cada caracter dispone de una matriz de 5x7 puntos (pixeles), aunque los hay de otro número de filas y caracteres La pantalla de cristal líquido LCD, es un periférico de salida visualizador muy potente, reflexible, eficaz y económico, siendo los microcontroladores los dispositivos más adecuados para optimizar sus prestaciones y control. En realidad, el módulo LCD tiene incrustado un microcontrolador específico para regular su funcionamiento y una memoria RAM. En la memoria RAM se guardan los caracteres que se van escribiendo, y el microcontrolador se encarga de mostrar en el display la información contenida en esta RAM. La organización lógica de la memoria RAM es como sigue: Apuntador $00 H $01 O $02 L $03 A $04 $40 $41 $42 $43 $44 $05 A ↓ $0E $0F $3F $4E $4F $7F _ $45 Figura 3.4. Memoria RAM del LCD. La flecha mostrada simboliza un apuntador de memorias de datos que coinciden con la posición del cursor. El display sólo muestra una pequeña área de la memoria RAM; por esta razón es necesario que al llegar al final de una línea se reposicione el cursor al principio de la otra, de no ser así, los caracteres que se sigan enviando no se visualizarán hasta que se llegue al final del renglón-RAM y el cursor brinque automáticamente a la otra línea (arreglo de pila circular). La instrucción SET DDRAM ADDRESS modifica el valor del APUNTADOR mediante el operando ADD (bits 0 a 6 de la palabra-instrucción), por lo tanto, se puede utilizar esta instrucción para posicionar el cursor en cualquier lugar de la pantalla. Esta instrucción tiene el BIT 7 en 1, por lo que suele referenciar las direcciones de la pantalla incluyendo a este BIT, es decir: Línea 1: $80 $8F Línea 2: $C0 $CF Para poder utilizar el módulo LCD correctamente es necesario enviar los siguientes parámetros de inicialización: 1. $38: Interfase de 8 bits, 2 líneas en display y caracteres de 5x7. 2. $0F: Para encender el display, cursor encendido, mostrarlo parpadeando. 3. $01: Borrar display. 4. $06: Modo de incrementar memoria sin corrimiento. 5. $80: Primer caracter en primera línea, posición cero. Las pantallas LCD más comunes presentan un número variable de caracteres formados por una matriz de 5x7 pixeles en una o varias líneas. Nos referimos al módulo LCD con microcontrolador incrustado, que tiene la posibilidad de visualizar dos líneas de 16 caracteres cada una. Dispone de 14 terminales, que se especifican en la tabla 3.8. Tabla 3.8. Distribución de las líneas del LCD. Ocho de sus terminales (D0-D7) reciben los caracteres ASCII a representar, así como ciertos códigos de control que regulan los efectos de visualización. También por ellos, el módulo LCD envía información sobre su estado interno. Por las terminales Vdd y Vss se aplica la alimentación de 5 volts de corriente directa y tierra respectivamente. La Terminal Vo regula el contraste de la pantalla de cristal líquido al aplicarle, mediante un potenciómetro, una tensión variable comprendida entre 0 y 5 V. Las terminales restantes controlan las funciones principales del módulo: • E: Señal de activación. Si E=0, el módulo está desactivado, y no funcionan las señales restantes. • R/W#: Lectura / escritura. Si R/W=0, se escribe el módulo y si R/W=1, es leído. • RS: Selección de registro de control RS = 0 o de datos RS = 1. Por D0-D7 se transfiere información de control-comandos o datos de caracter a escribir. En la tabla 3.9 se muestran los mandos que controlan al módulo LCD, y más adelante se describen detalladamente. Tabla 3.9. Mandos de control del LCD. 1. CLEAR DISPLAY: Borra la pantalla del módulo LCD y coloca al cursor en la primera posición, que es la dirección 0. Por defecto, pone el bit I /D =1 para autoincremento de la posición del cursor. 2. CURSOR HOME: Pone el cursor en la dirección 0. No varia el contenido de la memoria DDRAM que guarda los datos y que queda diseccionada desde la posición 0. 3. ENTRY MODE SET: Establece la dirección del movimiento del cursor (I /D); si pone a 1 el bit S, desplaza la visualización cada vez que se escribe un dato. Si S = 0, la presentación es la normal. 4. DISPLAY ON/OFF CONTROL: Activa o desactiva al display (D) y al cursor (C) y determina si éste parpadea o no. 5. CURSOR DISPLAY SHIFT: Mueve el cursor y desplaza la visualización sin cambiar el contenido de la memoria DDRAM. 6. FUNCTION SET: Establece el número de líneas de la interfase con el bus de datos, siendo habitual que sea de 8 bits, con lo que DL = 1. Especifica el número de líneas de caracteres, para que sean 2 se deben poner N = 1, y el formato del caracter, que es de 5x7 pixeles, si F = 0. 7. SET CGRAM ADDRESS: El módulo LCD tiene definido los caracteres ASCII, pero además permite que el usuario pueda definir un máximo de 9 caracteres nuevos. Estos se guardan en la memoria CGRAM de 64 bits. Cada caracter está especificado con un número de bits comprendido entre 6 y 16 bits, según su complejidad. Dichos bits se almacenan en las sucesivas posiciones de la CGRAM. Con este mando se indica la dirección de CGRAM a partir de la cual se irán almacenando los bits que definen el nuevo caracter. Tras ejecutar este mando, todos los datos que se lean o escriban posteriormente lo hacen desde esa posición de la CGRAM. 8. SET DDRAM ADDRESS: Establece la dirección de la DDRAM a partir de la cual todos los datos que se lean o escriban posteriormente lo harán desde esa posición. Los 16 caracteres del primer renglón ocupan la dirección 80h-8Fh, y los del segundo desde la C0h a la CFh. 9. READ BUSY FLAG ADDRESS: Se trata de un mando para la lectura de la bandera BUSY que indica si todavía se está ejecutando un mando previo en el módulo LCD. Además, proporciona la dirección de la CGRAM o DDRAM que se haya utilizado la última vez. 10. WRITE DATA TO CGRAM o DDRAM: Se escribe en la DDRAM los datos (Caracteres ASCII ) que se quieren visualizar. También se escriben en la CGRAM los bits de los nuevos caracteres creados por el usuario. Se usa una memoria u otra según haya sido la instrucción de direccionamiento previa, que hará que se refiera a la CGRAM o a la DDRAM. 11. READ DATA TO CGRAM o DDRAM: Igual que en el mando anterior, pero en esta ocasión en modo de lectura. 3.8. RELOJ DE TIEMPO REAL DS1307 El DS1307 es un reloj calendario de tiempo real con 64 bytes de NV SRAM. Los datos y las direcciones se envían serialmente por dos líneas bidireccionales. • Trabaja con un cristal de 32.768 Khz conectado en x1 y x2 • Este RTC suministra información de segundos, minutos, horas, días, fecha, meses y años. • Los meses son automáticamente ajustados incluyendo la corrección si el año es bisiesto. • El reloj trabaja a 24 o 12 horas de acuerdo a como se configure. • El año se configura de 00 a 99. • Posee 56 bytes de memoria libres para guardar información y 8 bytes del sistema. • El DS1307 está censando la fuente de alimentación y si ésta es desconectada, él conmuta automáticamente a una batería adicional de 3 Vdc que se conectaría en la terminal 3 del mismo RTC (cuando sucede esto el RTC no puede ser direccionado, por lo tanto no puede ser consultado ni configurado en esta condición). La programación y lectura de datos del RTC, se encuentra implementada con el protocolo I2C, a través de 2 líneas I/O del microcontrolador. Los puertos y señales del RTC que permiten la implementación del protocolo I2C se muestra a continuación: Tabla 3.10. Puertos y señales RTC. PUERTO FUNCION PORTC3 SCL (Serial Clock Input) PORTC4 SDA (Serial Data Imput/Output) En la implementación de la comunicación I2C se configura el microcontrolador como dispositivo Amo y el RTC como esclavo. Esta configuración se puede apreciar en la figura 3.5 Figura 3.5. Manejo del bus en la comunicación I2C. El microcontrolador como Amo es el encargado de generar el comienzo de transmisión y recepción de datos. En un principio la transmisión (escritura) de datos con el RTC, consiste en la actualización o iniciación de los registros de la hora y la fecha para que comience a contar y el de control, encargado de generar una la señal externa cuadrada. La información de tiempo y calendario es obtenida al leer los registros apropiados (con longitud de 1 byte), los cuales están localizados en las direcciones de memoria del RTC desde la 00H hasta 07H como se muestra en la tabla 3.11. Tabla 3.11. Mapeo de memoria del RTC. De igual manera, si se desea configurar el tiempo o el calendario del RTC se deben modificar los respectivos bytes de los registros de la anterior tabla. La batería de “respaldo” permite que el reloj continúe en funcionamiento manteniendo la hora actualizada; sin embargo, el usuario puede consultar y programar la hora después de un tiempo transcurrido cuando lo estime conveniente. CAPÍTULO IV DISEÑO DE PROTOTIPO BÁSCULA ELECTRÓNICA 4.1. INTRODUCCIÓN Este proyecto es un prototipo diseñado para la medición de peso, mediante un sistema de sensores (galga extensiométrica), sin pesas o cualquier otro tipo de palanca que provoque pérdida de tiempo, mediciones confusas ya sea por mala visibilidad o inexactitud del aparato. Por lo tanto este prototipo permite tener una mejor automatización y mayor rapidez para poderlo utilizar y aplicar en los hogares, comercios, hospitales, escuelas etc. En la figura 4.1 se muestra una fotografía del proyecto. Figura 4.1. Fotografía de la báscula electrónica. 4.2. DESARROLLO La báscula electrónica consta de cuatro partes principales: Fuentes de alimentación, sensor y etapa de amplificación, etapa digital y programacion. A continuación se hace una descripción más detallada de cada etapa. 4.3. FUENTES DE ALIMENTACIÓN Para proveer al sistema con los voltajes de alimentación necesarios, se diseñaron dos fuentes: a) La primera, trabaja con la etapa digital que requiere una tensión de 5 Vdc; con esta fuente se alimenta el PIC16F873, la pantalla de cristal líquido, el reloj de tiempo real y también el amplificador operacional LM324. b) La segunda, es la encargada de aplicar un voltaje de excitación de 10 Vdc que requiere el sensor. 4.3.1. FUENTE DE 5 Vdc La figura 4.2 muestra el diagrama esquemático del circuito de fuente para 5 Vdc. En esta, se emplea un transformador de 125 Vac a 9 Vac. Para la rectificación de este voltaje se emplea un puente de 2 A. Los capacitores C1 y C2 se usan para filtrar, además de aminorar el ruido del voltaje que sale del puente. El circuito incluye el arreglo de resistencia R1 y el led D2, para indicar cuando la fuente está encendida. 2 U3 LM7805C/TO D3 puente rect. 1 IN 3 OUT C3 .O1uf JP1 4 - 2 1 + 1 C1 470uf 9 Vac entrada C2 .1uf amp.op. D N G R1 470 ohms 2 3 0 0 D2 led 0 0 2 1 2 1 JP6 JP7 0 0 5 Vdc salida 5 Vdc salida Figura 4.2. Fuente de 5 Vdc. El LM7805 se usa para regular el voltaje de entrada de 9 Vdc a un voltaje de 5 Vdc. En la salida del regulador se encuentra el capacitor C3 de 0.01 uf para atenuar el nivel de ruido en la etapa digital, evitando la posibilidad de lecturas erróneas a causa de este factor. La fuente tiene disponibles los conectores JP6 y JP7, que son salidas de 5 Vdc, para la conexión con el circuito digital; sin embargo, sólo uno de ellos es usado, teniendo una salida disponible por si se necesitara más adelante. El conector JP1 es la entrada de 9 Vac que proviene del transformador. 4.3.2. FUENTE DE 10 Vdc En el diagrama esquemático de la figura 4.3 se puede ver el diseño de la fuente de 10 Vdc. Esta fuente utiliza un transformador que reduce el voltaje de 127 a 18 Vac. Para rectificar la señal se utiliza un puente de 2 A que provoca una caída de voltaje aproximadamente de 2 V por el efecto de conducción de los diodos rectificadores dando así un voltaje aproximado de 16 V. El LM7810 está regulando el voltaje a 10 Vdc. Los capacitores C4 y C2, de la misma manera que en la fuente anterior, son utilizados para filtrar la señal y reducir el ruido. La resistencia R1 de 1 kΩ y el led conforman el arreglo para indicar el funcionamiento de la fuente. Por último se coloca el capacitor C3 en la salida del regulador como supresor de ruido. U18 LM7810 1 IN R1 C4 1000uf 1 2 Entrada 18 Vac 1 2 3 4 + N F - OUT 3 D N G 1k C2 .01uf 2 JP1 salida 10 Vdc 1 2 C3 22uf Led P1 0 Figura 4.3. Fuente de 10 Vdc. 4.4. SENSOR Y ETAPA DE AMPLIFICACIÓN La salida de voltaje de la galga extensiométrica es de 0.5 mV/kg. Esto implica que para el intervalo de 0 – 40 kg., el voltaje máximo sería de 20 mv. Ya que el voltaje de referencia del convertidor es de 5 V, se tiene un intervalo dinámico de voltaje muy pequeño, por lo que se emplea una etapa de amplificación, que extienda este intervalo de voltaje a un valor cercano al máximo permisible. Para este caso, se fija su valor en Vmax = 3.92 Vdc, (dejando un margen de tolerancia de 1 V, respecto al voltaje de referencia). En la etapa de amplificación se utiliza uno de los cuatro amplificadores operacionales que contiene el circuito integrado LM324, en la forma de amplificador no inversor, ya que la configuración tiene una mejor estabilidad en la frecuencia. La ganancia requerida en esta configuración está dada en función del voltaje máximo que se desea aplicar al conversor A/D. Para este caso, se fija su valor en Vmax = 3.92 Vdc. De esta forma, la ganancia está dada por: G= Vmax 3.922Vdc = = 196.1 ………………( 3 ) Vsensor 20mV Con este valor de ganancia y fijando uno de los valores de las resistencias se diseña la configuración no inversora: La ganancia (G) en el amplificador se determina por: Rf G = 1 + ………………………… ( 4 ) Ri Por lo tanto, si Ri toma el valor de 1 kΩ, Rf se obtiene de la siguiente expresión: Rf 196.1 = 1 + …………….………. ( 5 ) 1000 Despejando, queda: Rf = 195.1kΩ Dado que este valor no existe comercialmente, se implementa mediante una resistencia fija de 100 kΩ, en serie con un potenciómetro de 100 kΩ (ajustado a 95 kΩ aproximadamente). • El voltaje de salida del amplificador es aplicada al canal 0 del convertidor (RA0/AN0). Para el conversor A/D se tiene: • Si de los 10 bits del conversor solo se toman en cuenta 8 bits, del resultado de la conversión, la resolución es de: Vesc = Voltaje _ de _ referencia 5 = = 19.61mV …….. ( 6 ) nivel _ de _ cuantizacion 255 La cuenta digital que arrojo el conversor para un voltaje de entrada amplificado Vamp queda dado por la siguiente ecuación: Nb = Vamp Vamp = …………….…..... ( 7 ) Vesc 19.61mV Nb = Cuenta digital. Vesc = Voltaje de escalón (mV). Vamp = Voltaje de entrada amplificado. Para determinar el peso equivalente a esta cuanta digital (Nb) se tiene lo siguiente: Vsensor = 0.5 mV Vamp = 0.5 mV Vamp = 0.5 mV kg kg kg ………………….…… ( 8 ) ∗ G ………….………… ( 9 ) (196.1) = 98.05 mV kg ……( 10 ) Para este voltaje de entrada amplificado Vamp = 98.05 mV cuenta Nb = 101 de aquí en este caso: 101 ⇒ 1kg 001 ⇒ K Por lo tanto la resolución de la báscula en kilogramos es: kg corresponde una K= 001 1 = = 0.200kg ……………..…. ( 11 ) 101 5 Finalmente la ecuación que permite determinar el peso en función de la cuenta digital Nb es: Peso = K ∗ Nb ……………….…. ( 12 ) En la tabla 4.1 se muestran algunos voltajes de entrada y sus equivalencias calculadas a cuenta digital y peso. Tabla 4.1 Tabla de correspondencia mV/kgs. Voltaje de entrada amplificado (mV) Vamp 0.00 19.61 39.22 58.83 78.44 98.05 117.66 490.25 980.50 1961.00 2941.50 3922.00 Cuenta digital (Nb) Peso ( kg ) 0000 0000 0000 0001 0000 0010 0000 0011 0000 0100 0000 0101 0000 0110 0001 1001 0011 0010 0110 0100 1001 0110 1100 1000 0 .2 .4 .6 .8 1.0 1.2 5.0 10 20 30 40 En la figura 4.4 se ilustra la conexión entre el sensor y el amplificador. La señal proveniente de la celda de carga llega al conector JP3 (terminal 6). En el conector JH1 se tiene disponible la salida ya amplificada por un factor G = 196. JP2 Entrada 10 Vdc 5 Vdc 1 2 3 JP3 U1A 4 + + V OUT 1 2 3 4 5 6 7 2 V LM324 1 1 0 1 Rf 199k 1 1 Galga ext. Ri 1k JH1 Salida amplif icada 0 0 Figura 4.4 Etapa de amplificación. 4.5. ETAPA DIGITAL El elemento principal de esta etapa es el PIC16F873, debido a que manipula todos los dispositivos como: reloj de tiempo real, botones para configuración de la hora, pantalla de cristal líquido e internamente su conversor A/D. En la figura 4.5 se muestra conjuntamente todas estas partes. 0 SW4 R8 VCC 10k RESET JP1 1 2 3 4 5 R9 INSENS 100 RA0/AN0 RA1/AN1 RA2/AN2 RA3/AN3/REF RA4/T0CLK RA5/AN4/SS RB0/INT 1 9 MCLR/VPP RB1 OSC1/CLK RB2 RB3 20 VDD RB4 RB5 RB6 RB7 RC0/T1OSO/T1CLK RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL RC4/SDI/SDA RC5/SDO RC6/TX/CK RC7/RX/DT OSC2/CLKOUT C1 22pf U2 VCC Y1 XM/SM C2 22pf 2 3 4 5 6 7 21 22 23 24 25 26 27 28 11 12 13 14 15 16 17 18 10 JP3 1 3 5 7 9 11 13 0 VCC 2 4 6 8 10 12 14 0 LCD 1 2 PARLANTE R4 4.7k R3 4.7k Y2 C3 10pf XM/SM_0 PIC16F873 0 VCC VCC GND 1 2 0 5 Vcd U8 1 5 SDA 2 X1 6 X2 7 SCLK SQW/OUT R2 3 8 VBAT VCC 2.2K VCC 2 1 DS1307 VCC R1 330 D2 BATERIA SW1 Ajuste SW2 Modo R5 2.2k R6 2.2k SW3 Incremento R7 2.2k 0 LED Title <Title> 0 Size A Date: Document Number <Doc> Tuesday, June 13, 2006 Figura 4.5. Etapa digital. Rev <RevCode> Sheet 1 of 1 4.5.1. CIRCUITO DE RESET Esta etapa permite reinicializar el microcontrolador, mediante el uso de un pulsador normalmente abierto (NA) y el arreglo de resistencias que se muestran en la figura 4.6. R9 100 MCLR/VDD 1 RESET SW4 2 R8 10k 0 VCC Figura 4.6. Circuito de Reset. La terminal de entrada del PIC, indicada con MCLR# es bajo activa, es decir, al aplicarle una entrada de 0 V (cero lógico) el sistema se reinicia automáticamente, colocando el apuntador del programa en la dirección cero de la memoria, donde deberá estar situada la primer instrucción del programa. Además, la mayoría de los registros de estado y de control del procesador toman un estado conocido y determinado como condición inicial o valor de reset del registro. Para operación normal del microcontrolador, debe haber un “1” lógico (5 V) en esta terminal, para lo cual se coloca R8 directamente a Vcc. Cuando el interruptor está abierto, se tiene una tensión positiva en la terminal MCLR#. En caso contrario, es decir, cuado se cierra el interruptor, la terminal MCLR# se aterriza a través de la resistencia R9. 4.5.2. CIRCUITO DEL OSCILADOR Es el encargado de generar los impulsos que sincronizan el funcionamiento de todo el sistema. Se utiliza un cristal de 4 MHz para aprovechar la velocidad máxima de trabajo del microcontrolador haciendo con esto más eficiente el sistema. Con dicha frecuencia del cristal, el microcontrolador tiene un ciclo de ejecución de instrucción de aproximadamente 1 µseg. Todas las instrucciones requieren este tiempo a excepción de las de salto, que duran el doble. Los capacitores C1 y C2 son utilizados para evitar ruido en el cristal, de esta forma se asegura una oscilación estable (ver figura 4.7). OSC1/CLKIN OSC2/CLKOUT Y1 C1 22pf C2 22pf XM/SM 0 Figura 4.7. Circuito del oscilador. 4.5.3. RELOJ DE TIEMPO REAL En la figura 4.8 se muestran las conexiones de este circuito. Las resistencias R3 y R4, así como la R2 que se conectan a 5 Vdc se agregan debido a que las líneas SDA, SCL y SQW/OUT son salidas de drenador abierto, por lo que requieren resistencias externas de PULL-UP. Estas líneas son conectadas a las líneas del PIC para entablar la comunicación requerida. La red formada por la resistencia R1 y el led D2 , permite visualizar las pulsaciones que cada segundo entrega la línea SQW/OUT, de acuerdo al periodo programado en el reloj. En otras palabras esta red sirve como testigo del correcto funcionamiento de RTC. El conector denominado BATERÍA es utilizado para proporcionar la entrada de voltaje externo o pila para una condición de falla de energía del sistema. El RTC cuenta con detección de falla, conmutando inmediatamente a la alimentación de la pila para no perder la información programada anteriormente. Por último el cristal Y2 tiene un valor de 32.768 Khz que permite utilizar un divisor exacto para la generación de una tasa de tiempo de un seg. VCC R3 4.7k R4 4.7k LINEA SCL del PIC (14) U1 Y2 XM/SM C3 10pf 1 2 6 3 8 X1 X2 SCLK SDA SQW/OUT 5 LINEA SDA del PIC (15) 7 R2 2.2k VBAT VCC R1 330 VCC DS1307 D2 LED 2 1 BATERIA 0 Figura 4.8. Circuito del reloj de tiempo real. 4.5.4. BOTONES PARA CONFIGURAR EL RELOJ DE TIEMPO REAL Otra parte importante del circuito principal es el arreglo mostrado en la figura 4.9 que consiste en una serie de botones (Normalmente abiertos), que tienen la función de programar el reloj de tiempo real. Los tres botones, conectados al puerto C del microcontrolador, tienen las siguientes funciones: a) SW1 funciona como AJUSTE. b) SW2 como MODO y por último. c) el SW3 como INCREMENTO. Con el botón de AJUSTE se inicia la configuración; por lo que después de haberlo presionado se utilizan los botones de MODO e INCREMENTO para modificar los segundos, minutos, horas, día, fecha, mes y año. Una vez que se ha configurado el tiempo y la fecha deseada, el SW2 funciona como modo de 24 horas, y el SW3 en formato de 12 horas (AM/PM). RC5(16) RC6(17) RC7(18) SW1 Ajuste SW2 Modo R5 2.2k R6 2.2k SW3 Incremento R7 2.2k 0 Figura 4.9. Botones para configurar el RTC. 4.5.5. CONECTORES PARA LOS CONVERSORES A/D Su principal función es la de conectar la señal externa que proviene del sensor hacia la entrada RA0 (Canal 0) del conversor A/D del microcontrolador. Se emplea un conector de 5 terminales, dejando disponibles los 4 canales restantes del conversor A/D para la eventual conexión de otras señales, como se muestra en la figura 4.10. JP1 RA0/AN0(2) RA1/AN1(3) RA2/AN2(4) RA3/AN3/REF(5) 1 2 3 4 5 INSENS RA5/AN4/SS(7) Figura 4.10. Entradas de conversores A/D. 4.5.6. PANTALLA DE CRISTAL LÍQUIDO La pantalla LCD, como se describió en el capítulo anterior, es un periférico de 14 terminales, de las cuales tres están conectadas a tierra, y una a 5 V para la polarización. También se tiene la opción para que Vo se conecte a un potenciómetro para variar la intensidad de los caracteres mostrados en la pantalla. Como es opcional, en este caso, se conectó a tierra. La terminal R/W# se conecta a tierra para poder escribir en la memoria RAM y no leerla ya que no se tiene ningún dato guardado ahí. Las líneas RS y E están conectadas a RC0 y RC1 respectivamente; estas dos patitas son para saber que se va a mandar: datos o comandos. Las últimas ocho líneas (D0-D7) están conectadas al puerto B del microcontrolador para enviar instrucciones o datos que se desean mostrar en la pantalla. La figura 4.11 muestra las conexiones de la pantalla LCD con el microcontrolador. Figura 4.11. Conexión del LCD con el microcontrolador. 4.6. PROGRAMACIÓN 4.6.1. DIAGRAMA DE FLUJO DEL FUNCIONAMIENTO GENERAL DE LA BÁSCULA Inicio Configuración de puertos Puerto A Entradas Puerto B Salidas Puerto C C0 - C4 Salidas C5, C6 y C7 Entradas Configuración de pantalla Mensaje de Bienvenida Inicialización del RTC Parámetros para activación del conv. A/D y config. Puerto A entradas analógicas No Apunta a la localidad 0 del RTC para recibir o enviar datos Si ¿ADRESH >= 0001? Configura pic en modo recepción Muestra tiempo y fecha en pantalla Cambia a modo 12 hrs. ¿H.AM/PM=1? No Muestra peso en pantalla Si No Cambia a modo 24 hrs. ¿H.MILIT=1? Si Si Permite al usuario modificar datos del RTC con botones: MODO e INCREMENTO No ¿Boton AJUSTE = 1? Si No ¿Boton AJUSTE= 1? Figura 4.12. Diagrama de flujo del funcionamiento de la báscula. 4.6.2. DIAGRAMA DE FLUJO DE OPERACIÓN DEL CONVERSOR A/D Configuración Conversor A/D - ADCON0 = 11000001 - Tipo osc., canal de entrada analógica, activar conversor. ¿ ADON = 1 ? No Si Adquisición canal seleccionado. ADCON1 = 00001110 ¿ GO/DONE# = 1 ? No Si Conversión en proceso. ¿ GO/DONE# = 0 ? Fin Si No Fin de conversión. Peso = ADRESH Mandar peso en Kg a pantalla. Resta peso de charola a ADRESH (calibración). Regla de tres ( Convierte resultado digital a Kg ). Figura 4.13. Diagrama de flujo del Conversor A/D. 4.6.3. DIAGRAMA DE FLUJO DE OPERACIÓN ESCRITURA PARA EL RTC Ajuste= 1 Generar condición de inicio SSPCON2 <SEN=1> Si ¿Modo= 1? No Cambia los demás datos del reloj (horas, años, días, etc.) ¿PIR1<SSPIF=1>? Si No Carga dirección del esclavo D0W (Modo escritura) Si ¿Ajuste= 1? Limpiar PIR1<SSPIF=0> No No ¿Incremento= 1? Si WSSPBUF RTC Limpia Min Min= 00 ¿PIR1<SSPIF=1>? Si Limpiar PIR1<SSPIF=0> No Si Incrementa minutos en 1 Min+1Min ¿Min > 59? No Cargar dirección puntero (0007) en W Manda datos a SSPBUF No Limpiar PIR1<SSPIF=0> Config. RC3/SCL y RC4/SDA como entradas ¿PIR1<SSPIF=1>? Si WSSPBUF RTC Limpiar PIR1<SSPIF=0> Config. Velocidad std . Con nivel I2C (80h SSPSTAT < SMP >) No Activa condición de paro SSPCON2<PEN=1> ¿PIR1<SSPIF=1>? Si Config. Velocidad del bus I2C= 100 Khz (09hSSPAD ) Carga el nuevo valor del dato a modificar (min, seg, hor,etc.) ¿PIR1<SSPIF=1>? No Si Activar bus I2C y escoger frecuencia de reloj (28hSSPCON) Fin Limpiar PIR1<SSPIF=0> Manda el byte a SSPBUF Limpiar PIR1<SSPIF=0> ¿PIR1<SSPIF=1>? Si No Carga valor 10h en W para configurar línea SQW/OUT del RTC para dar pulsos de 1Seg. Figura 4.14. Diagrama de flujo de modo escritura para el RTC. 4.6.4. DIAGRAMA DE FLUJO DE OPERACIÓN LECTURA PARA EL RTC Config. RC3/SCL y RC4/SDA como entradas ¿PIR1<SSPIF=1>? Si Config. Velocidad std. Con nivel I2C (80h SSPSTAT < SMP >) No Cargar dirección puntero (0007) en W Limpiar PIR1<SSPIF=0> Config. Velocidad del bus I2C= 100 Khz (09hSSPAD) Activar modo recepción SSPCON2<RSEN=1> Activar bus I2C y escoger frecuencia de reloj (28hSSPCON) ¿PIR1<SSPIF=1>? No Si Limpiar PIR1<SSPIF=0> Limpiar PIR1<SSPIF=0> Generar condición de inicio SSPCON2 <SEN=1> ¿SSPCON2<ACKDT=0>? No ¿PIR1<SSPIF=1>? Si No Si Activar condición de reconocimiento SSPCON2 <ACKEN=1> Leer byte SSPBUFW Carga dirección del esclavo D1W modo lectura Limpiar PIR1<SSPIF=0> Limpiar PIR1<SSPIF=0> D1 SSPBUF Activa condición de paro SSPCON2<PEN=1> ¿PIR1<SSPIF=1>? No Si Fin Figura 4.15. Diagrama de flujo de modo lectura para el RTC. 4.6.5. CÓDIGO DEL PROGRAMA LIST P=16F873 #include p16f873.inc ; Tipo de procesador ; Definiciones de registros internos __config _XT_OSC & _WDT_OFF & _PWRTE_ON &_LVP_OFF PCL DATO_H (ADRESH) DATO_L (ADRESL) CONT1 CONT2 cuenta J K J1 CONT16 PESO_HEX Multiplicando Multiplicador Resultado_H Resultado_L Estatus_Temp Contador Residuo Minuendo Sustraendo Resultado2 Decimal PESOC PESOD PESOU BCD_2 equ 0x02 equ 0x20 ; Localidad para almacenamiento de la conversión los 8 bits más altos equ 0x21 ; Almacenamiento de la conversión de los 2 bits MSB de la parte baja equ 0x22 equ 0x23 equ 0x24 equ 0x26 equ 0x27 equ 0x28 equ 0x32 equ 0x38 equ 0x39 equ 0x3A equ 0x3B equ 0x3C equ 0x3D equ 0x3E equ 0x3F equ 0x40 equ 0x41 equ 0x42 equ 0x43 equ 0x4C equ 0x4D equ 0x4E equ 0x4F ; Retardos para la adquisición de la conversión analógica a digital. BCD_1 BCD_0 CONT TEMPESO AÑOS conta DIAS FECHAS HORA MINUTO MESES SEGUNDO TEMP TEMP1 contg equ 0x50 equ 0x51 equ 0x52 equ 0x53 equ 0x54 equ 0x55 equ 0x56 equ 0x57 equ 0x58 equ 0x59 equ 0x60 equ 0x61 equ 0x62 equ 0x63 equ 0x64 ; Contadores para retardos de mandos y datos del LCD. ; contador para TMR0 con retardo de 1seg. ; se almacena dato de la conversión en hex. ; Variable para el multiplicando. ; Variable para el multiplicador. ; Parte alta del resultado. ; Parte baja del resultado. ; Reg. de estado temporal. ; Variable con número de veces a operar. ; Variable para guardar residuo de la resta la reg. de tres. ; Minuendo de la resta para regla de tres. ; Variable para guardar el sustraendo de la resta de la reg. de tres. ; variable para guardar el resultado de la multiplicación. ; Variable para guardar los decimales del peso. ; localidad para las centenas del peso ; localidad para las decenas del paso ; localidad para las unidades del peso ; Localidades para almacenamiento del resultado de conversión de bin a ; bcd ; contador para el proceso de la conversión de BIN a BCD ; localidad para datos temporales de la conversión del peso ; localidades para guardar datos de fecha y tiempo. ; Localidades para guardar datos temporales. ; Contador para checar las variables del RTC. DIREJ DATEMP equ 0x65 equ 0x66 MAX equ 0x67 CIETE7 DOSE12 MESE12 VEITE24 TREINTA31 CINCUNTAY9 NOVENTAY9 HORA1 equ 0x68 equ 0x69 equ 0x70 equ 0x71 equ 0x72 equ 0x73 equ 0x74 equ 0x75 org goto org 0x00 INICIO 0x05 ; Localidad de memoria para direccionar puntero en RTC. ; Localidad para almacenar un dato temporal que luego va a fecha y ; tiempo. ; Localidad de memoria donde se almaceno el valor de 7 días como valor ; máximo. ; Vector de Reset. ; Brinca a la etiqueta inicio. ; Salva el vector de interrupción. ;******************************************************************* ; INICIO DEL PROGRAMA. ;******************************************************************* INICIO ;******************************************************************* ; CONFIGURACIÓN DE PUERTOS. ;******************************************************************* bsf STATUS,5 ; Selección del banco 1. movlw 0x00 movwf PORTB ; Configura puerto B como salida. Movlw 0xF8 movwf PORTC ; Configura Pines C3 y C4 como entradas para el RTC y C5, C6 Y C7 para los botones. Bcf STATUS,5 ; Regresa al banco 0. ;******************************************************************* ; LLAMA RUTINAS DE CONFIGURACIÓN DE PANTALLA. ;******************************************************************* call INIT_DISP call LIMPIA_DISP call DUAL_LINE call LIMPIA_DISP call CLC_CONV ; Configuración del REG. ADCON1 (config. de las líneas del conv. A/D). call MENSAJE ; Llama al mensaje Hola Bienvenido. ;******************************************************************* ; MANDA MENSAJE DE BIENVENIDA A LA PANTALLA. ;******************************************************************* MENSAJE: movlw ' ' call DATO movlw ' ' call DATO movlw ' ' call DATO movlw ' ' call movlw call movlw call movlw call movlw call movlw call movlw call call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call call call call call call call call call call DATO '' DATO '' DATO 'H' DATO 'O' DATO 'L' DATO 'A' DATO LINEA2 '' DATO '' DATO '' DATO 'B' DATO 'I' DATO 'E' DATO 'N' DATO 'V' DATO 'E' DATO 'N' DATO 'I' DATO 'D' DATO 'O' DATO RET100 RET100 RET100 RET100 RET100 RET100 RET100 RET100 CONFI ; Llama rutina para brincar a la segunda línea. ; Llama rutina de parámetros para inicialización del RTC. ;******************************************************************* ; RUTINA DE FUNCIONAMIENTO GENERAL. ;******************************************************************* BUCLE call movlw subwf btfsc goto btfsc goto call btfsc goto call LEE_SENSOR 0x08 ADRESH,W STATUS,Z NEWPESO STATUS,C NEWPESO REIREL PORTC,5 MINUTOS MODREC ;CALL movlw call call btfsc call btfsc call CPARO 00h LCDIR MOSTRAR PORTC,6 CHECA PORTC,7 CHECA1 btfsc goto goto PORTC,5 MINUTOS BUCLE ; No, Se va a leer el sensor. ; Carga el numero 5-9 que es el valor que representa 1Kg. ; Resta/compara con ADRESH. ; Son iguales (Z=1)??. ; Si. ; No. ADRESH > 5 (C=1)?. ; Si. ; No. ; Checa si el bit 5 = 1 del puerto C. ; Si, se va a modificar datos del reloj. ; Configura PIC en modo de recepción. LIM ; Direcciona cursor de la pantalla en la posición h80. ; Muestra en pantalla tiempo y fecha. CHB5 ; Checa si el bit 5 = 1 del puerto C. ; Si, se va a modificar datos del reloj. ; No, Se va a leer el sensor. ;******************************************************************* ; RUTINA PARA CONFIGURAR AL PIC EN MODO DE RECEPCIÓN. ;******************************************************************* MODREC call CINI ; Llama la rutina para enviar la condición de inicio de transmisión. movlw 0xD1 ; Carga la dirección del esclavo (D0 para CI DS1307). call ENVDATO ; Llama a la rutina para envío de un byte de datos. LEEOTR bcf PIR1,3 ; Apaga bit 3 del registro PIR1. bsf STATUS,5 ; Cambio al banco1. bcf STATUS, bsf SSPCON2,3 ; Activación del modo receptor (RCEN=1). bcf STATUS,5 ; Regreso al banco 0. CICLO btfss PIR1,3 ; Espera que haya terminado la recepción del dato del RTC. goto CICLO2 bcf PIR1,3 ; Apaga bit 3 del registro PIR1. bsf STATUS,5 ; Cambio al banco 1. bcf STATUS,6 bcf SSPCON2,5 ; Limpia el bit ACKDT para transmisión del bit de reconocimiento. bsf SSPCON2,4 ; Pone en alto el bit ACKEN para iniciar la secuencia de generación de reconocimiento. bcf STATUS,5 ; Regreso al banco 0. CICLO3 btfss PIR1,3 ; Checa si el dato que mando el RTC ya fue recibido por el pic. goto CICLO3 ; Esta checando hasta que se reactiva el dato. movf SSPBUF,0 ; SSPBUF recibe el dato y lo pasa al registro W. movwf TEMP ; Guarda el dato en TEMP. decfsz call bcf bsf bcf bsf Bcf conta,1 GUARDAR PIR1,3 STATUS,5 STATUS,6 SSPCON2,3 STATUS,5 btfss goto bcf bsf bcf bsf PIR1,3 CICLO4 PIR1,3 STATUS,5 STATUS, SSPCON2,5 bsf SSPCON2,4 bcf STATUS,5 btfss goto movf call goto PIR1,3 CICLO5 SSPBUF,0 CPARO LIM ; Guarda los cambios en su respectiva variable. ; Cambio al banco 1. ; Activación del modo receptor (RCEN=1). ; Regreso al banco 0. CICLO4 ; Espera que Haya terminado la operación. ; Cambio al banco 1. ; Pone en el alto el bit ACKDT para transmisión del bit de reconocimiento. ; Pone en alto el bit ACKEN para iniciar la secuencia de generación de reconocimiento. ; Regreso al banco 0. CICLO5 ; Espera que Haya terminado la operación. ; Leer el registro SSPBUF y pasar le dato al registro W. ; Fin de la transmisión. ; Se va a mostrar los nuevos datos. ;******************************************************************* ; RUTINA PARA ENVIO DE DATOS AL RTC. ;******************************************************************* GRAVARTC call CINI ; Llama a la rutina para enviar la condición de inicio de transmisión. movlw 0xD0 ; Carga la dirección del esclavo (D0 pra CI DS1307). call ENVDATO ; Llama a la rutina para envío de un byte de datos. movlw 0x00 ; Carga la dirección de memoria o donde se va a escribir el dato. call ENVDATO movf SEGUNDO,0 ; Carga el dato para inicio de reloj (SEGUNDO). call ENVDATO movf MINUTO,0 ; Carga el dato para inicio de reloj (MINUTO). call ENVDATO movf HORA,0 ; Carga horas (HORAS). call ENVDATO movf DIAS,0 ; Carga día de la semana. call ENVDATO movf FECHAS,0 ; Manda día del mes. call ENVDATO movf MESES,0 ; Manda mes. call E NVDATO movf AÑOS,0 ; Manda año. call ENVDATO movlw 0x10 ; Configura la línea de salida (SQW/OUT) de reloj para dar pulso de 1 seg. call ENVDATO call CPARO ; Llama a la rutina para enviar la condición de PARO. return ;******************************************************************* ; RUTINA PARA ENVÍO DE CONDICIÓN DE PARO. ;******************************************************************* CPARO bcf bsf bcf bsf bcf PIR1,3 STATUS,5 STATUS,6 SSPCON2,2 STATUS,5 btfss goto return PIR1,SSPIF ESPER2 ; Cambio al banco 1. ; Pone en alto el bit PEN para la condición de paro. ; Cambia al banco 0. ESPER2 ; Espera que halla finalizado la operación. ;******************************************************************* ; RUTINA PARA EL ENVIO DE LA CONDICION DE INICIO DE TRANSMISION. ;******************************************************************* CINI bcf bsf bcf bsf bcf PIR1,3 STATUS,5 STATUS,6 SSPCON2,0 STATUS,5 btfss goto return PIR1,SSPIF ciclo ; Limpia la bandera de fin de transmisión de dato (SSPIF). ; Cambio al banco 1. ; Coloca en alto el bit SEN para dar la transición de inicio. ; Regreso al banco 0. ciclo ; Espera que halla terminado la operación. ;******************************************************************* ; RUTINA PARA ENVIAR DATOS AL RELOJ. ;******************************************************************* ENVDATO bcf movwf ESPER1 btfss goto return PIR1,3 SSPBUF ; Limpia la bandera de fin de transmisión. ; Manda el byte al buffer de salida. PIR1,3 ESPER1 ; Espera que halla terminado la transmisión del byte. ;******************************************************************* ; RUTINA PARA MANDAR LOS PARAMETROS DE INICIALIZACIÓN DEL RTC. ;******************************************************************* CONFI bsf STATUS,5 bcf STATUS,6 movlw 0x80 movwf SSPSTAT movlw 0x09 movwf SSPADD bcf STATUS,5 movlw 0x28 movwf SSPCON respectivamente. return ; Cambio al banco 1. ; Configuración de velocidad estándar con nivel I2C. ; Velocidad del bus I2C = 100 KHZ. ; Regresa al banco 0. ; configuración del PIC en modo amo. ; Configura las líneas del puerto c, C3 y C4 como SCL Y SDA ;******************************************************************* ; RUTINA PARA APUNTAR A LA LOCALIDAD 0 DEL RELOJ. ;******************************************************************* REIREL movlw movwf movlw movwf call movlw call movlw call call return 0x08 conta 0x00 contg CINI 0xD0 ENVDATO 0x00 ENVDATO CPARO ; Guarda en la localidad conta el valor 7 (para leer 7 localidades de reloj). ; Carga con 0 el contador para guardar los datos leídos mediante PCL. ; Llama a la rutina para enviar la condición de inicio de transmisión. ; Carga la dirección del esclavo (D0 PARA CI DS1307). ; Llama a la rutina para envío de un byte de datos. ; Carga la dirección de memoria o donde se va escribir el dato. ;******************************************************************* ; RUTINA PARA GUARDAR LOS DATOS DEL RTC A VARIABLES EN EL PIC. ;******************************************************************* GUARDAR movf contg,0 ; Carga w con el valor del contador contg. addwf PCL,f ; Suma al PCL lo que contiene w. movf TEMP,0 ; Mueve el contenido de la variable TEMP a W. movwf SEGUNDO ; Guarda nuevo dato ajustado en SEGUNDO. movlw 0x05 movwf contg goto LEEOTR movf TEMP,0 movwf MINUTO ; Guarda nuevo dato ajustado en MINUTO. movlw 0x0A movwf contg goto LEEOTR movf TEMP,0 movwf HORA ; Guarda nuevo dato ajustado en HORA. movlw 0x0F movwf contg goto LEEOTR movf TEMP,0 movwf DIAS ; Guarda nuevo dato ajustado en DIAS. movlw 0x14 movwf contg goto LEEOTR movf TEMP,0 movwf FECHAS ; Guarda nuevo dato ajustado en FECHAS. movlw 0x19 movwf contg goto LEEOTR movf TEMP,0 movwf MESES ; Guarda nuevo dato ajustado en MESES. movlw 0x1E movwf contg goto LEEOTR movf TEMP,0 movwf AÑOS ; Guarda nuevo dato ajustado en AÑOS. goto LEEOTR ;************************************************************************ ; RUTINA PARA MOSTRAR DIA, DIA DEL MES Y EL MES EN LA LCD EN 1erLINEA. ;************************************************************************ MOSTRAR call DESPDIA ; llamamos rutina para desplegar el día de la semana. movlw 0x00 addlw 0x8A ; direcciona el cursor en la línea 1 dirección 10 de la LCD. call MANDA movf FECHAS,0 ; movemos lo que hay en fechas a W. movwf TEMP1 ; movemos W a TEMP1. call UNOX1 ; llamamos la rutina para enviar el dato de fecha digito x digito. call DESPMES ; llamamos la rutina para desplegar el mes. call LINEA2 ; rutina para pasar a la segunda línea de la LCD. call LCDIR2 ; rutina para que ponga en la línea 2 posición 0. movlw '2' call DATO movlw '0' call DATO movf AÑOS,0 ; movemos lo que hay en años a W. movwf TEMP1 ; movemos W a TEMP1. call UNOX1 ; llamamos la rutina para enviar el dato del año digito x digito. movlw ' ' call DATO movf HORA,0 ; movemos lo que hay en hora a W. movwf btfsc bcf bcf movf DATEMP HORA,6 DATEMP,5 DATEMP,6 DATEMP,0 movwf call movlw call movf movwf call movlw call movf movwf call TEMP1 UNOX1 ':' DATO MINUTO,0 TEMP1 UNOX1 ':' DATO SEGUNDO,0 TEMP1 UNOX1 btfsc goto goto MODO12 movlw call btfsc HORA,6 MODO12 MODO24 '' DATO HORA,5 ; movemos W a TEMP1. ; llamamos la rutina para enviar el dato de la hora digito x digito. ; movemos lo que hay en minuto a W. ; movemos W a TEMP1. ; llamamos la rutina para enviar el dato de los minutos digito x digito. ; movemos lo que hay en segundos a W. ; movemos W a TEMP1. ; llamamos la rutina para enviar el dato de los segundos digito x digito. goto goto PM AM FUERA return ;******************************************************************* ; RUTINA PARA DESPLEGUE DEL DÍA DE LA SEMANA. ;******************************************************************* DESPDIA movf DIAS,0 ; Pasa el contenido de DIAS a W. xorlw 0x01 ; Compara si W = 1. btfsc STATUS,2 call LUNES ; Si, manada mensaje LUNES al LCD. movf DIAS,0 ; No, sigue comparando para mostrar día correspondiente. xorlw 0x02 btfsc STATUS,2 call MARTES movf DIAS,0 xorlw 0x03 btfsc STATUS,2 call MIERCOLES movf DIAS,0 xorlw 0x04 btfsc STATUS,2 call JUEVES movf DIAS,0 xorlw 0x05 btfsc STATUS,2 call VIERNES movf DIAS,0 xorlw 0x06 btfsc STATUS,2 call SABADO movf DIAS,0 xorlw 0x07 btfsc STATUS,2 call DOMINGO return ;******************************************************************* ; RUTINAS DE MENSAJES PARA LOS DIAS DE LA SEMANA. ;******************************************************************* LUNES movlw call movlw call movlw call movlw call movlw call movlw call 'L' DATO 'U' DATO 'N' DATO 'E' DATO 'S' DATO '' DATO movlw call movlw call movlw call movlw call return MARTES movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call return MIERCOLES movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call return JUEVES movlw '' DATO '' DATO '' DATO '' DATO 'M' DATO 'A' DATO 'R' DATO 'T' DATO 'E' DATO 'S' DATO '' DATO '' DATO '' DATO '' DATO 'M' DATO 'I' DATO 'E' DATO 'R' DATO 'C' DATO 'O' DATO 'L' DATO 'E' DATO 'S' DATO '' DATO 'J' call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call return VIERNES movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call return SABADO movlw call movlw call movlw call movlw call movlw call movlw call DATO 'U' DATO 'E' DATO 'V' DATO 'E' DATO 'S' DATO '' DATO '' DATO '' DATO '' DATO 'V' DATO 'I' DATO 'E' DATO 'R' DATO 'N' DATO 'E' DATO 'S' DATO '' DATO '' DATO '' DATO 'S' DATO 'A' DATO 'B' DATO 'A' DATO 'D' DATO 'O' DATO movlw call movlw call movlw call movlw call return DOMINGO movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call movlw call return '' DATO '' DATO '' DATO '' DATO 'D' DATO 'O' DATO 'M' DATO 'I' DATO N' DATO 'G' DATO 'O' DATO '' DATO '' DATO '' DATO ;*********************************************************************** ; RUTINA QUE ENVIAR MENSAJE AÑO, FECHA, HORA, MINUTOS Y SEGUNDOS ; AL LCD. ;*********************************************************************** UNOX1 swapf andlw addlw call movf andlw addlw call return TEMP1,0 0x0F 0x30 DATO TEMP1,0 0x0F 0x30 DATO ; Se cambia el nibble(medio byte = 4bits) el de la derecha. ; a la izquieda y el de la izquierda a la derecha. ; Conversion de BCD a ASCCI para mostrar datos en pantalla. ; envía el dato a la LCD ;******************************************************************* ; RUTINA PARA DESPLEGAR EL MES. ;******************************************************************* DESPMES movf MESES,0 ; Manda contenido de MESES a W. xorlw 0x01 ; Compara para ver si el contenido de W = 1. btfsc STATUS,2 call ENERO ; Si, manda el mensaje ENERO al LCD. movf xorlw btfsc call movf xorlw btfsc call movf xorlw btfsc call movf xorlw btfsc call movf xorlw btfsc call movf xorlw btfsc call movf xorlw btfsc call movf xorlw btfsc call movf xorlw btfsc call movf xorlw btfsc call movf xorlw btfsc call return MESES,0 0x02 STATUS,2 EBRERO MESES,0 0x03 STATUS,2 MARZO MESES,0 0x04 STATUS,2 ABRIL MESES,0 0x05 STATUS,2 MAYO MESES,0 0x06 STATUS,2 JUNIO MESES,0 0x07 STATUS,2 JULIO MESES,0 0x08 STATUS,2 AGOSTO MESES,0 0x09 STATUS,2 SEPTIEMBRE MESES,0 0x10 STATUS,2 OCTUBRE MESES,0 0x11 STATUS,2 NOVIEMBRE MESES,0 0x12 STATUS,2 DICIEMBRE ; No, sigue comparando. ;******************************************************************* ; RUTINAS DE MENSAJES PARA LOS DIAS DE LA SEMANA. ;******************************************************************* ENERO movlw call movlw call movlw '' DATO 'E' DATO 'N' call movlw call return FEBRERO movlw call movlw call movlw call movlw call return MARZO movlw call movlw call movlw call movlw call return ABRIL movlw call movlw call movlw call movlw call return MAYO movlw call movlw call movlw call movlw call return JUNIO movlw call movlw call movlw call movlw call return JULIO DATO 'E' DATO '' DATO 'F' DATO 'E' DATO 'B' DATO '' DATO 'M' DATO 'A' DATO 'R' DATO '' DATO 'A' DATO 'B' DATO 'R' DATO '' DATO 'M' DATO 'A' DATO 'Y' DATO '' DATO 'J' DATO 'U' DATO 'N' DATO movlw call movlw call movlw call movlw call return AGOSTO movlw call movlw call movlw call movlw call return SEPTIEMBRE movlw call movlw call movlw call movlw call return OCTUBRE movlw call movlw call movlw call movlw call return NOVIEMBRE movlw call movlw call movlw call movlw call return DICIEMBRE movlw call movlw call movlw '' DATO 'J' DATO 'U' DATO 'L' DATO '' DATO 'A' DATO 'G' DATO 'O' DATO '' DATO 'S' DATO 'E' DATO 'P' DATO '' DATO 'O' DATO 'C' DATO 'T' DATO '' DATO 'N' DATO 'O' DATO 'V' DATO '' DATO 'D' DATO 'I' call DATO movlw 'C' call DATO return ;******************************************************************* ; BRINCA A LA LÍNEA DOS DEL LCD ;******************************************************************* LINEA2: movlw 0XC1 call MANDO return ;******************************************************************* ; RUTINA DE INSTRUCCIONES PARA LCD ;******************************************************************* MANDO: bcf PORTC,0 movwf PORTB bsf PORTC,1 call RETARDO bcf PORTC,1 call RETARDO return ;******************************************************************* ; RUTINA PARA DEPLIEGAR DATOS EN LCD ;******************************************************************* DATO: bsf movwf bsf nop bcf call return INIT_DISP movlw call return LIMPIA_DISP movlw call return DUAL_LINE movlw call return PORTC,0 PORTB PORTC,1 PORTC,1 RETARDA 0X0C; MANDO 0X01 MANDO ;Configura bus de datos de 8 bits. 0x38 MANDO ;******************************************************************* ; POSICIÓN DE LA OPANTALLA: DDRAM DIRECCION. ;******************************************************************* LCDIR addlw call 80h MANDO return ;******************************************************************* ; POSICIÓN DE LA PANTALLA: DDRAM DIRECCION. ;******************************************************************* LCDIR2 addlw call return 0xC0 MANDO ;******************************************************************* ; MUEVE TEXTO HACIA LA DERECHA ;******************************************************************* MOVER: movlw d'16'; movwf J1 VER: movlw 0X1F call MANDO decfsz J1,f goto VER return ;******************************************************************* ; MUEVE TEXTO HACIA LA IZQUIERDA ;******************************************************************* MOVER1: movlw d'16'; movwf J1 VER1: movlw 0X1B call MANDO decfsz J1,f goto VER1 return ;******************************************************************* ; RUTINAS DE AJUSTE DE FECHA Y TIEMPO CON BOTONES. ;******************************************************************* MINUTOS call RET100 goto RETMIN RETMIN movlw 0x00 addlw 0xC8 call MANDA call PRENDER btfsc PORTC,7 call INCREMIN btfsc PORTC,6 goto HORASSS btfsc PORTC,5 goto RELL goto RETMIN INCREMIN movlw movwf call call call movf subwf btfss movlw movwf incf movfw xorlw btfsc goto goto 0x59 CINCUNTAY9 RETARDO RETARDO APAGAR MINUTO,0 CINCUNTAY9,1 STATUS,C 0x00 DATEMP DATEMP,1 DATEMP 0x0A STATUS,2 DIEZ DOS movf xorlw btfsc goto goto DATEMP,0 0x1A STATUS,2 VEINTE TRES DOS TRES movf xorlw btfsc goto goto CUATRO movf xorlw btfsc goto goto CINCO movf xorlw btfsc goto goto SEIS movf xorlw btfsc goto goto DIEZ movlw movwf goto VEINTE movlw movwf goto TREINTA DATEMP,0 0x2A STATUS,2 TREINTA CUATRO DATEMP,0 0x3A STATUS,2 CUARENTA CINCO DATEMP,0 0x4A STATUS,2 CINCUENTA SEIS DATEMP,0 0x5A STATUS,2 SECENTA SIGUE 0x10 DATEMP SIGUE 0x20 DATEMP SIGUE movlw 0x30 movwf DATEMP goto SIGUE CUARENTA movlw 0x40 movwf DATEMP goto SIGUE CINCUENTA movlw 0x50 movwf DATEMP goto SIGUE SECENTA movlw 0x00 movwf DATEMP goto SIGUE SIGUE movf DATEMP,0 movwf MINUTO movlw 00h call LCDIR call MOSTRAR return HORAS call RET100 goto RETHORA RETHORA btfss HORA,6 goto HORA2 movlw 0x00 addlw 0xC5 call MANDA call PRENDER btfsc PORTC,7 call INCREHORA btfsc PORTC,6 goto DIA btfsc PORTC,5 goto RELL goto RETHORA INCREHORA call RET100 call APAGAR bsf HORA,6 movf HORA,0 movwf DATEMP movwf DATEMP bcf DATEMP,5 bcf DATEMP,6 incf DATEMP,1 movf DATEMP,0 xorlw 0x0A btfsc STATUS,2 goto DIEZ1 goto DOSCE1 DOSCE1 movf xorlw btfsc goto goto DATEMP,0 0x13 STATUS,2 TRECE1 SIGUE1 DIEZ1 movlw 0x10 movwf DATEMP goto SIGUE1 TRECE1 movlw 0x01 movwf DATEMP goto SIGUE1 SIGUE1 btfsc HORA,5 bsf DATEMP,5 movf DATEMP,0 movwf HORA bsf HORA,6 movlw 00h call LCDIR call MOSTRAR return HORA2 call RET100 goto RETHORA2 RETHORA2 btfsc HORA,6 goto HORAS movlw 0x00 addlw 0xC5 call MANDA call PRENDER btfsc PORTC,7 call INCREHORA2 btfsc PORTC,6 goto DIA btfsc PORTC,5 goto RELL goto RETHORA2 INCREHORA2 movlw 0x24 movwf VEITE24 call RETARDO call RETARDO call APAGAR bcf HORA,6 movf HORA,0 subwf VEITE24,1 btfss STATUS,C movlw 0x00 movwf DATEMP incf DATEMP,1 movf DATEMP,0 xorlw 0x0A btfsc goto goto STATUS,2 DIEZ10 DOS10 movf xorlw btfsc goto goto DATEMP,0 0x1A STATUS,2 VEINTEX TRES10 movf xorlw btfsc goto goto DATEMP,0 0x24 STATUS,2 VCUATRO SIGUE10 DOS10 TRES10 DIEZ10 movlw 0x10 movwf DATEMP goto SIGUE10 VEINTEX movlw 0x20 movwf DATEMP goto SIGUE10 VCUATRO movlw 0x00 movwf DATEMP goto SIGUE10 SIGUE10 movf DATEMP,0 movwf HORA bcf HORA,6 movlw 00h call LCDIR call MOSTRAR return DIA call RET100 goto RETDIA RETDIA movlw 0x00 addlw 0x80 call MANDA call PRENDER btfsc PORTC,7 call INCREDIA btfsc PORTC,6 goto FECHA btfsc PORTC,5 goto RELL goto RETDIA INCREDIA movlw 0x07 movwf CIETE7 call RET100 call APAGAR movf subwf btfss movlw movwf incf movf movwf movlw call call movlw movwf movf subwf btfsc clrf return DIAS,0 CIETE7,1 STATUS,C 0x00 DATEMP DATEMP,1 DATEMP,0 DIAS 00h LCDIR MOSTRAR d'7' MAX DATEMP,W MAX,F STATUS,Z DIAS call goto RETFECHA movlw addlw call call btfsc call btfsc goto btfsc goto goto INCREFECHA movlw movwf call call call movf subwf btfsc movlw movwf incf movf xorlw btfsc goto goto DOS2 movf xorlw btfsc goto RET100 RETFECHA FECHA 0x00 0x8A MANDA PRENDER PORTC,7 INCREFECHA PORTC,6 MES PORTC,5 RELL RETFECHA 0x31 TREINTA31 RETARDO RETARDO APAGAR FECHAS,0 TREINTA31,1 STATUS,C 0x00 DATEMP DATEMP,1 DATEMP,0 0x0A STATUS,2 DIEZ2 DOS2 DATEMP,0 0x1A STATUS,2 VEINTE2 goto TRES2 movf xorlw btfsc goto goto DATEMP,0 0x2A STATUS,2 TREINTA2 TRE32 movf xorlw btfsc goto goto DATEMP,0 0x32 STATUS,2 TREINTAY2 SIGUE2 TRES2 TRE32 DIEZ2 movlw movwf goto VEINTE2 movlw movwf goto TREINTA2 movlw movwf goto TREINTAY2 movlw movwf goto SIGUE2 movf movwf movlw call call return MES call goto RETMES movlw addlw call call btfsc call btfsc goto btfsc goto goto INCREMES movlw movwf call 0x10 DATEMP SIGUE2 0x20 DATEMP SIGUE2 0x30 DATEMP SIGUE2 0x01 DATEMP SIGUE2 DATEMP,0 FECHAS 00h LCDIR MOSTRAR RET100 RETMES 0x00 0x8D MANDA PRENDER PORTC,7 INCREMES PORTC,6 AÑO PORTC,5 RELL RETMES 0x12 MESE12 RET100 call movf subwf btfss movlw movwf incf movf xorlw btfsc goto goto APAGAR MESES,0 MESE12,1 STATUS,C 0x00 DATEMP DATEMP,1 DATEMP,0 0x0A STATUS,2 DIEZ4 DOSCE movf xorlw btfsc goto goto DATEMP,0 0x13 STATUS,2 TRECE SIGUE4 DOSCE DIEZ4 movlw 0x10 movwf DATEMP goto SIGUE4 TRECE movlw 0x01 movwf DATEMP goto SIGUE4 SIGUE4 movf DATEMP,0 movwf MESES call MOSTRAR return AÑO call goto RETAÑO movlw addlw call call btfsc call btfss goto btfsc goto btfsc goto goto INCREAÑO call call call movf movwf incf RET100 RETAÑO 0x00 0xC0 MANDA PRENDER PORTC,7 INCREAÑO HORA,6 MINUTOS PORTC,6 AMPM PORTC,5 RELL RETAÑO RETARDO RETARDO APAGAR AÑOS,0 DATEMP DATEMP,1 movf xorlw btfsc goto goto DATEMP,0 0x0A STATUS,2 DIEZ3 DOS3 movf xorlw btfsc goto goto DATEMP,0 0x1A STATUS,2 VEINTE3 TRES3 movf xorlw btfsc goto goto CUATRO3 movf xorlw btfsc goto goto CINCO3 movf xorlw btfsc goto goto SEIS3 movf xorlw btfsc goto goto SIETE movf xorlw btfsc goto goto OCHO movf xorlw btfsc goto goto NUEVE movf xorlw btfsc goto goto CERO movf DATEMP,0 0x2A STATUS,2 TREINTA3 CUATRO3 DOS3 TRES3 DATEMP,0 0x3A STATUS,2 CUARENTA3 CINCO3 DATEMP,0 0x4A STATUS,2 CINCUENTA3 SEIS3 DATEMP,0 0x5A STATUS,2 SECENTA3 SIETE DATEMP,0 0x6A STATUS,2 SETENTA OCHO DATEMP,0 0x7A STATUS,2 OCHENTA NUEVE DATEMP,0 0x8A STATUS,2 NOVENTA CERO DATEMP,0 xorlw btfsc goto goto 0x9A STATUS,2 CIEN SIGUE3 DIEZ3 movlw movwf goto VEINTE3 movlw movwf goto TREINTA3 movlw movwf goto CUARENTA3 movlw movwf goto CINCUENTA3 movlw movwf goto SECENTA3 movlw movwf goto SETENTA movlw movwf goto OCHENTA movlw movwf goto NOVENTA movlw movwf goto CIEN movlw movwf goto SIGUE3 movf movwf movlw call call return AMPM call goto RETAMPM 0x10 DATEMP SIGUE3 0x20 DATEMP SIGUE3 0x30 DATEMP SIGUE3 0x40 DATEMP SIGUE3 0x50 DATEMP SIGUE3 0x60 DATEMP SIGUE3 0x70 DATEMP SIGUE3 0x80 DATEMP SIGUE3 0x90 DATEMP SIGUE3 0x00 DATEMP SIGUE3 DATEMP,0 AÑOS 00h LCDIR MOSTRAR RET100 RETAMPM movlw 0x00 addlw 0xCE call MANDO call PRENDER btfsc PORTC,7 call INCREAMPM btfsc PORTC,6 goto MINUTOS btfsc PORTC,5 goto RELL goto RETAMPM INCREAMPM call APAGAR call RET100 bsf HORA,6 movf HORA,0 movwf DATEMP btfsc DATEMP,5 goto APAGE goto PRENDA SIGUEAMPM call MOSTRAR return ;******************************************************************* ; RUTINA PARA CAMBIAR EL FORMATO DE HORA (AM/PM) ;******************************************************************* PRENDA bsf HORA,5 ; Activa el bit 5 (1=PM) del registro HORA del RTC movf HORA, movwf DATEMP goto SIGUEAMPM APAGE bcf HORA,5 ; Desactiva el bit 5 (0=AM) del registro HORA del RTC movf HORA,0 movwf DATEMP goto SIGUEAMPM ;******************************************************************* ; MENSAJES AM, PM Y HRS ;******************************************************************* AM movlw 'A' call DATO movlw 'M' call DATO goto FUERA PM movlw 'P' call DATO movlw 'M' call DATO goto FUERA MODO24 movlw 'H' call DATO movlw 'R' call DATO movlw 'S' call DATO goto FUERA ;******************************************************************* ; RUTINAS QUE CHECAN EL BIT 6 DEL REGISTRO HORA DEL RTC PARA ; CAMBIAR A MODO 24 O 12 HRS. ;******************************************************************* CHECA btfsc goto return CHECA1 btfsc return call LIMPIA mvf movwf bcf movlw btfsc addwf bcf movlw xorwf movlw btfsc mvwf movlw xorwf movlw btfsc movwf movlw xorwf movlw btfsc movwf call goto PRENDE movf movwf movlw subwf btfsc goto btfsc goto goto PREN_D1 bsf bsf call HORA,6 LIMPIA HORA,6 PRENDE HORA,0 HORA1 HORA,5 0x12 HORA1,5 HORA,1 HORA,6 0x1A HORA,0 0x20 STATUS,2 HORA 0x1B HORA,0 0x21 STATUS,2 HORA 0x24 HORA,0 0x12 STATUS,2 HORA GRAVARTC CHB5 HORA,0 DATEMP 0x12 DATEMP,1 STATUS,2 PREN_D1 STATUS,C PREN_D2 PREN_D3 HORA,5 HORA,6 GRAVARTC goto CHB5 PREN_D2 movf DATEMP,0 movwf HORA movlw 0x0E xorwf HORA,0 movlw 0x08 btfsc STATUS,2 movwf HORA movlw 0x0F xorwf HORA,0 movlw 0x09 btfsc STATUS,2 movwf HORA bsf HORA,5 bsf HORA,6 call GRAVARTC goto CHB5 PREN_D3 movlw 0x00 xorwf HORA,0 movlw 0x12 btfsc STATUS,2 movwf HORA bsf HORA,6 call GRAVARTC goto CHB5 ;******************************************************************* ; RUTINA PARA INCREMENTAR HASTA 23 O HASTA 12 HRS ;******************************************************************* HORASSS btfsc HORA,6 goto HORAS goto HORA2 ;******************************************************************* ; RUTINA DE INSTRUCCIONES PARA LCD ;******************************************************************* MANDA bcf PORTC,0 movwf PORTB bsf PORTC,1 call RETARDA bcf PORTC,1 call RETARDA return RETARDA movlw d'4' movwf J jloo: movwf K kloo: decfsz K,f goto kloo decfsz J,f goto return jloo ;******************************************************************* ; RUTINAS PARA PRENDER Y APAGAR EL CURSOR. ;******************************************************************* PRENDER movlw 0x0F ; Puede ser dependiendo de la posición 0F o 0D. call MANDA return APAGAR movlw 0X0C call MANDA return ;******************************************************************* ; RETARDO DE 100ms PARA EVITAR REBOTES EN LOS INTERRUPTORES. ;******************************************************************* RET100 movlw 0X64 movwf CONT1 RET1 movlw 0XC8 movwf CONT2 decf CONT1 RET2 decf nop nop nop nop nop nop movf btfss goto movf btfss goto return CONT2 CONT2,1 STATUS,2 RET2 CONT1,1 STATUS,2 RET1 ;******************************************************************* ; RETARDO ;******************************************************************* RETARDO: movlw d'80' movwf J jloop: movwf K kloop: decfsz K,f goto kloop decfsz J,f goto jloop return RELL call call call goto APAGAR RET100 GRAVARTC BUCLE ;******************************************************************* ; MENSAJE: TU PESO ES: ;******************************************************************* NEWPESO: call LIMPIA_DISP movlw ' ' call DATO movlw 'T' call DATO movlw 'U' call DATO movlw ' ' call DATO movlw 'P' call DATO movlw 'E' call DATO movlw 'S' call DATO movlw 'O' call DATO movlw ' ' call DATO movlw 'E' call DATO movlw 'S' call DATO movlw ':' call DATO ;******************************************************************* ; RUTINA PARA SENSAR PESO Y MOSTRARLO, SI NO HAY PESO MUESTRA ; TIEMPO FECHA. ;******************************************************************* REE: call call call call call movlw call call call call movlw subwf btfsc goto LEE_SENSOR REGLAD3 BIN_BCD LINEA2 RETARDO 46h LCDIR DESPESO EXDEC EXKG 0x05 ADRESH,W STATUS,Z REE ; Sensa el peso. ; Llama rutina REGLAD3. ; Llama rutina para la conversión de binario a BCD. ; Llama rutina para brincar a línea 2. ; Direcciona el cursor. ; Llama rutina para desplegar peso. ; Llama rutina para mostrar decimales. ; Llama rutina para mostrar mensaje Kg. ; Carga el numero 5 que es el valor que representa 1Kg. ; Resta/compara con ADRESH. ; Son iguales (Z=1)??. ; Si. btfsc goto goto STATUS,C REE BUCLE ; No, DATO_H mayor que 5 (C=1)??. ; Si. ;******************************************************************** ; CONFIGURACION DEL REG. ADCON1 (CONFIG DE LAS LINEAS DEL CONV. A/D) ;******************************************************************** CLC_CONV bsf STATUS,RP0 ; Selecciona banco 1. bcf STATUS,RP1 movlw B'00000001' ; Configura RA0 como entada. movwf TRISA movlw B'00001110' ; Configura línea RA0 como entrada analógica. movwf ADCON1 ; y RA1--> RA5 como E/S digitales. bcf STATUS,RP0 ; Regresa el banco 0. return ;******************************************************************* ; RUTINA DE LECTURA DEL SENSOR. ;******************************************************************* ;******************************************************************* ; CONFIGURACION DEL REG. ADCON0 (OPERACION DEL CONV. A/D). ; FRECUENCIA DE RELOJ : FRC => tAD=OSCLIDAOR INTERNO RC DEL C A/D. ; CANAL: 0. ;******************************************************************* LEE_SENSOR: clrf DATO_H clrf DATO_L clrf PORTA bsf STATUS,RP0 ; Selecciona banco 1. bcf STATUS,RP1 clrf ADCON1 bcf STATUS,RP0 movlw B'11000001' ; 0XC1 : osc interno, canal 0, conv A/D activado (ADON=1). movwf ADCON0 call RETADQ bsf ADCON0,GO ; Arranca el conv. A/D (GO/DONE#=1). ESP_ADC: btfsc ADCON0,GO ; Espera hasta que la conversión fue realizada. goto ESP_ADC movlw b'00000011' ; Resta 3 al resultado de la conversión para quitar subwf ADRESH,W ; el peso de la charola return ;******************************************************************* ; RUTINA QUE HACE UNA REGLA DE TRES. ; FF---------50Kg ; ADRESH-----x Kg ;******************************************************************* REGLAD3 movwf Multiplicador clrf Resultado_H clrf movlw movwf movlw movwf bcf Resultado_L 0x08 Contador 0x32 Multiplicando STATUS,C ; Pone a 0000 el resultado inicial ; Inicia el contador con 8 ; Borra el carry Bucle movf btfsc addwf rrf rrf Rota_sin_Carry movf movwf rrf movf movwf decfsz goto movfw addwf movwf movlw subwf btfss goto movwf movf movwf incf goto Rutina movf movwf movf movwf movlw movwf clrf bcf Otra subwf btfsc goto Multiplicando,W ; Carga el multiplicando Multiplicador,0 ; Es 1 el bit de menos peso del multiplicador ?? Resultado_H,F ; Si, se suma el multiplicando Resultado_H,F Resultado_L,F ; Desplazamiento a la derecha del resultado STATUS,W Estatus_Temp ; Salva temporalmente el carry Multiplicador,F ; Desplaza a la derecha el multiplicador Estatus_Temp,W STATUS ; Recupera el carry original Contador,F ; Repite el bucle 8 veces Bucle Resultado_H ; Mueve lo que hay en Resultado_H a W Resultado_L,W ; Suma el Resultado_L (+) W=Resultado_H Residuo ; El resultado de la suma que en Residuo 0xFF ; Carga W con 255 Residuo,0 ; Se le resta al resultado alto+el bajo el valor W=255 y resultado=W STATUS,Z ; checa si Z=1, si si salta goto Rutina Rutina Residuo ; El resultado de la resta queda en Residuo=0 Resultado_H,W Resultado2 ; Copea lo que esta Resultado_H en Resultado2 Resultado2,1 ; Si la resta=0 se incrementa lo que esta en Resultado2 una vez sigue Resultado_H,W Resultado2 Residuo,W Minuendo 0x1A Sustraendo Decimal STATUS,C Minuendo,1 STATUS,C In goto sigue incf Decimal,1 goto Otra ; Lo que sobro de la división se graba en W ; Minuendo se carga con este valor = W ; Se carga Sustraendo con el valor de 26 para así poder sacar el Decimal ; que va ha ser el resultado de Minuendo (-) Sustraendo ; Se limpia lo que hay en Decimal "por si hay algo" ; Se limpia el carry = 0 "por si estaba en 1" ; Se empieza la resta entre el minuendo y el sustraendo=(26) ; Checa si el resultado de la resta fue negativa si si salta a sigue ; Si el resultado fue positivo va a incrementar el contador que va ha dar el decimal ; Salto a la rutina de sigue que continua con la conversión de binario a BCD luego a ASSCI In sigue movf DECIMALES Resultado2,w ; Incrementa Decimal en 1 indicando que Sustraendo cupo otra vez en Minuendo ; Se realiza otra vez la resta por si cabe otra vez movwf movwf bsf movf bcf movwf return DATO_H PESO_HEX STATUS,RP0 ADRESL,W STATUS,RP0 DATO_L ; Manda el peso a DATO_H y PESO_HEX ;******************************************************************* ; RUTINA PARA DESPLEGAR EN PANTALLA EL PESO ;******************************************************************* DESPESO btfsc BCD_1,W goto DESPC goto DESPD DESPC movf BCD_1,W addlw 0x30 movwf PESOC movf PESOC,W call DATO DESPD swapf BCD_2,W andlw 0x0F xorwf 0x00 btfss STATUS,2 goto DESPD1 goto DESPU DESPD1 swapf BCD_2,W andlw 0x0F addlw 0x30 movwf PESOD movf PESOD,W call DATO DESPU movf BCD_2,W andlw 0x0F addlw 0x30 movwf PESOU movf PESOU,W call DATO return ;******************************************************************* ; RUTINA PARA EXHIBIR DECIMALES ;******************************************************************* EXDEC movlw call movlw subwf btfss clrf movf '.' DATO 0x05 Decimal,1 STATUS,C Decimal Decimal,W call call call return DECIMALES BIN_BCD DESPESO ;******************************************************************* ; RUTINA PARA DESPLEGAR EL MENSAJE Kg ;******************************************************************* EXKG movlw call movlw call movlw call movlw call movlw call movlw call return 0x4B DATO 0x67 DATO '' DATO '' DATO '' DATO '' DATO ;******************************************************************* ;RUTINA DE CONVERSION DE DATOS BINARIOS A BCD ;******************************************************************* BIN_BCD clrf DATO_L bcf STATUS,0 movlw 0X10 movwf CONT clrf BCD_0 clrf BCD_1 clrf BCD_2 CIC rlf DATO_H,F rlf DATO_L,F rlf BCD_2,F rlf BCD_1,F rlf BCD_0,F decfsz CONT,F goto ADJDEC retlw 0 ADJDEC movlw BCD_2 movwf FSR call ADJBCD movlw BCD_1 movwf FSR call ADJBCD movlw BCD_0 movwf FSR call ADJBCD goto CIC ADJBCD movlw addwf movwf btfsc movwf movlw addwf movwf btfsc movwf retlw return 3 0,W TEMPESO TEMPESO,3 0 30 0,W TEMPESO TEMPESO,7 0 0 ;pregunta si el resultado es mayor que 7 ;pregunta si el resultado es mayor que 7 ;******************************************************************* ; RETARDO DE 100mS ;******************************************************************* RETADQ movlw 0X01 ; debe ser 0X01 Retardo para la adquisición de la conversión A/D ret3 movlw 0x04 movwf CONT2 decf CONT1 ret4 decf CONT2 nop nop nop nop nop nop movf CONT2,1 btfss STATUS,2 goto ret4 movf CONT1,1 btfss STATUS,2 goto ret3 return RETARDO1: movlw movwf jloop1: movwf kloop1: decfsz goto decfsz goto return end d'250'; J K K,f kloop1 J,f jloop1 ; Fin de programa. CAPÍTULO V ANÁLISIS EXPERIMENTAL 5.1. ESTRUCTURA DEL PROTOTIPO Este prototipo está compuesto por 4 elementos principales que son: estructura mecánica, sensor de peso, tarjetas de control y pantalla visual. 5.1.1. Estructura mecánica: Está conformada por las siguientes partes. - Estructura metálica: Es una estructura en forma de trapecio formada con ángulo de hierro de 1.9 cm. de ancho. La estructura tiene una altura de 9 cm., mientras que la base inferior tiene 34 cm. de largo por 24 cm. de ancho. La base tiene un tramo de solera unida para sujetar el sensor de peso. También se añadió en uno de sus extremos, una base de sujeción en forma de L para sostener la canaleta. La base superior tiene 30 cm. de largo por 20 cm. de ancho. Todo esto se muestra en la figura 5.1. Figura 5.1. Estructura metálica. - Cruz de soporte: Esta pieza de aluminio vaciado, mostrada en la figura 5.2, tiene dos orificios en el centro que le permiten atornillarla al sensor. En cada uno de sus extremos tiene también orificios para atornillar la charola contenedora. Figura 5.2. Cruz de soporte. -Charola: La charola que se aprecia en la figura 5.3, está hecha de plástico. Tiene dimensiones de 29 cm. de ancho por 35 cm. de largo y es la encargada de sostener a la persona u objeto a pesar. Figura 5.3. Charola. -Canaleta y base: La canaleta tiene una longitud de 80 cm.; en su interior van los cables de alimentación y el de la señal del sensor. El objetivo principal es tener una mejor visibilidad de la lectura en la pantalla. La base forma parte del módulo de control y visualización y está hecha de acrílico ( figura 5.4). Figura 5.4. Canaleta y base. 5.1.2. Sensor de peso: Es el encargado de convertir el peso en una señal eléctrica, mediante el sistema de galgas en su interior. Este sensor está montado en una pieza de aluminio, como se observa en la figura 5.5. Figura 5.5. Sensor de peso. 5.1.3. Módulo de control: Su función es la de controlar y verificar los procesos que se llevan a cabo y está soportado por la canaleta para que el usuario pueda manipularla con facilidad (figura 5.6). Figura 5.6. Módulo de control. 5.1.4. Pantalla Visual: Tiene como finalidad mostrar los datos de salida como: fecha, hora, peso y mensajes; ésta va unida al módulo de control como puede apreciarse en la fotografía de la figura 5.7. Figura 5.7. Pantalla visual. 5.2. FUNCIONAMIENTO DEL PROTOTIPO La operación del prototipo es sencilla, lo primero que se debe hacer después de activa el interruptor de encendido de la báscula, es ajustar fecha y hora con los botones ajuste, modo e incremento exactamente como se explica en el manual del usuario en el apéndice A. Para pesar personas u objetos sólo tienen que colocarse sobre la charola y esperar unos segundos para que en la pantalla se despliegue el peso. Al momento en que se retira la persona o el objeto, el dato dejará de visualizarse y entonces se mostrará la hora y fecha nuevamente. Ya que se trata de un prototipo, sólo se puede medir hasta una carga máxima de 40 kg. debido a las especificaciones máximas que marca el sensor. Si se desea obtener rangos mayores, se tendrá que utilizar otro sensor de mayor capacidad. 5.3. ANÁLISIS DE PRUEBAS Hay 3 clases de pesos que es capaz de medir la báscula prototipo y son pesos humanos, muertos y líquidos; en todos se obtuvo la conversión del cambio físico en cambio eléctrico como lo muestra la tabla 5.1. Tabla 5.1. Relación Peso/Voltaje. kilogramos x 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 milivolts y 0.8 1.3 1.8 2.3 2.8 3.3 3.8 4.3 4.8 5.3 5.8 6.4 6.9 7.4 7.9 8.4 8.9 9.4 9.9 10.4 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 10.9 11.5 12 12.5 13 13.5 14 14.5 15 15.5 16 16.5 17 17.6 18.1 18.6 19.1 19.6 20.1 20.6 21.1 La ecuación de funcionamiento del sensor de peso se obtuvo por el método de mínimos cuadrados, para conocer el comportamiento del sensor al estar aplicando diferentes pesos. En la tabla 5.2 se observan los datos usados para aplicar este método. Tabla 5.2. Valores para método de mínimos cuadrados. kilogramos x 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 820 milivolts y 0.8 1.3 1.8 2.3 2.8 3.3 3.8 4.3 4.8 5.3 5.8 6.4 6.9 7.4 7.9 8.4 8.9 9.4 9.9 10.4 10.9 11.5 12 12.5 13 13.5 14 14.5 15 15.5 16 16.5 17 17.6 18.1 18.6 19.1 19.6 20.1 20.6 21.1 448.6 (kilogramos)² x² 0 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 289 324 361 400 441 484 529 576 625 676 729 784 841 900 961 1024 1089 1156 1225 1296 1369 1444 1521 1600 22140 (milivolts)² y² 0.64 1.69 3.24 5.29 7.84 10.89 14.44 18.49 23.04 28.09 33.64 40.96 47.61 54.76 62.41 70.56 79.21 88.36 98.01 108.16 118.81 132.25 144 156.25 169 182.25 196 210.25 225 240.25 256 272.25 289 309.76 327.61 345.96 364.81 384.16 404.01 424.36 445.21 (kilogramos*milivolts) x*y 0 1.3 3.6 6.9 11.2 16.5 22.8 30.1 38.4 47.7 58 70.4 82.8 96.2 110.6 126 142.4 159.8 178.2 197.6 218 241.5 264 287.5 312 337.5 364 391.5 420 449.5 480 511.5 544 580.8 615.4 651 687.6 725.2 763.8 803.4 844 11892.7 (milivolts)’ y' 0.8442 1.3501 1.856 2.3619 2.8678 3.3737 3.8796 4.3855 4.8914 5.3973 5.9032 6.4091 6.915 7.4209 7.9268 8.4327 8.9386 9.4445 9.9504 10.4563 10.9622 11.4681 11.974 12.4799 12.9858 13.4917 13.9976 14.5035 15.0094 15.5153 16.0212 16.5271 17.033 17.5389 18.0448 18.5507 19.0566 19.5625 20.0684 20.5743 21.0802 Una vez que se obtuvieron los valores necesarios en la tabla anterior, estos se analizaron con MATLAB. En la figura 5.8 se observa como se efectuó tal operación: Figura 5.8. Cálculo de matriz. Dando como resultado una ecuación que es la siguiente: mV = 0.8442 + (0.5059 ∗ Kg ) ……………………….( 7 ) Para un análisis gráfico se empleó Excel, en donde se obtiene la ecuación y la correlación que existe. En este caso R² = 1, lo que significa que la ecuación es bastante exacta y confiable. En la gráfica 5.9 se muestran las líneas de tendencia experimentada y calculada junto con la ecuación. Ánalisis gráfico y = 0.5059x + 0.8442 2 R =1 25 milivolts 20 15 Experimental Calculada Lineal (Calculada) 10 5 0 0 5 10 15 20 25 30 Kilogramos Gráfica 5.1. Análisis gráfico. 35 40 45 CONCLUSIONES El PIC16F873 es un dispositivo que controla de manera eficiente varias tareas, casi de una manera simultánea, que es un punto muy importante en la automatización; además ofrece una alta seguridad y confiabilidad, facilitando el manejo de los diferentes procesos que se pueden controlar; como: conversiones analógicas a digital para diferentes sensores, manejo de pantalla LCD para el despliegue de datos, manejo de dispositivos que ocupan una comunicación vía serial, ofreciendo una gran comodidad al utilizar el módulo del protocolo I2C, y otras muchas funciones. Refiriéndose a las mediciones de la báscula electrónica, es importante mencionar que la celda de carga entrega voltajes muy pequeños para pesos menores a 1 kg, por lo tanto necesita fuentes de alimentación con porcentajes de rizo cerca del 100% y circuitos de amplificación muy exactos; así como dispositivos que reduzcan las emanaciones de ruido, todo esto para tratar de llevara a cabo la medición lo mas exacta posible. TRABAJO A FUTURO Las propuestas para el trabajo a futuro se pueden resumir en los siguientes puntos: • Cambio de sensor para incrementar la capacidad de la báscula. • Incorporar un conversor A/D externo para mejorar la resolución. • Incorporar sensor de proximidad para determinación de la altura de una persona. ANEXOS ANEXO A MANUAL DE AJUSTE DEL RTC DS1307 PARA EL USUARIO 1. Una vez encendida la báscula, si se desea ajustar o cambiar los datos (minuto, hora, día de la semana, día del mes, mes y año) se debe presionar el botón “AJUSTE”. 2. Después de haber presionado este botón se ingresa a un estado en el cual se pueden modificar los valores que se muestran en la pantalla, en donde el primer dato a cambiar es MINUTOS. En los minutos se visualizará parpadeando el cursor en la posición en la que comience este valor, dando lugar a incrementarlo; pero si se desea cambiar ya sea la hora, día de la semana, día del mes, etc. se debe presionar el botón “MODO” las veces necesarias hasta llegar a el valor que se quiere alterar. 3. Una vez seleccionado el dato a cambiar se deberá presionar el botón de “INCREMENTAR”, el cual estará aumentando en uno el valor del dato hasta llegar así al valor deseado. 4. Después de haber modificado los valores mostrados en la pantalla, se procede a presionar nuevamente el botón “AJUSTE” el cual nos sacara del estado modificar, empezando a funcionar nuevamente el reloj incluido en la báscula electrónica. 5. Por último, al estarse visualizando la hora; si ésta aparece en formato militar o de 12 horas, se podrá cambiar con los botones H. MILIT y/o H. AM/PM. H. MILIT. cambiará el formato en horario uso militar. H. AM/PM cambiará el formato en horario 12 horas (AM/PM). ANEXO B ANEXO C ANEXO D BIBLIOGRAFÍA 1. Apuntes de la materia Metrología M. en C. N. Andrés Ramírez Rodríguez. 2. Microcontroladores PIC Diseño práctico de aplicaciones José María Angulo Usategui Ignacio Angulo Martínez Editorial McGraw-Hill 3. Microcontroladores PIC Diseño práctico de aplicaciones Segunda parte PIC16F87x José M.ª Angulo Usategui Susana Romero Yesa Ignacio Angulo Martínez Editorial McGraw-Hill 4. Apuntes de clase Amplificadores Operacionales Electrónica III Ingeniero Aurelio Beltrán Téllez 5. Apuntes de clase Diseño de circuitos en ORCAD M. P. R. H. Antonio Arellano Neri 6. Apuntes de clase Microcontroladores PIC M. C. José Manuel Cervantes Viramontes 7. Manual del microcontrolador PIC 16F873 http://www.microchip.com 8. Manual de celdas de carga http://www.proweigh.co.nz/index.html 9. Hojas de datos del Reloj de tiempo real DS1307 http://www.maxim-ic.com