Bascula electrónica controlada con PIC16F873 - Inicio

Anuncio
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
Descargar