E.P.
de Ingeniería de Gijón 22 de mayo de 2018
Desarrollo de Prototipo curso 3º Grado en Ingeniería Electrónica Industrial y Automática (GEIEA)
BLOQUE 2: (4 puntos sobre 12)
Ejercicio 2.1.- Se desea realizar un sistema de monitorización de temperatura, que utilice un sensor TC74
con interfaz I2C para su medida y que emplee, como núcleo del diseño, un microcontrolador PIC16F877A.
La temperatura se solicitará cada 2 segundos, se mostrará en la línea superior de un LCD con driver
HD44780 y se enviará el último valor obtenido del sensor, hacia un computador dotado de un puerto serie
RS232, cada vez que se reciba el código ASCII del carácter ‘T’ en la entrada serie asíncrona del
microcontrolador. La temporización de 2 segundos se realizará con el módulo TMR1, que utilizará un
oscilador externo de baja frecuencia (32,768kHz) para obtener la señal de reloj.
En el laboratorio disponemos de los siguientes elementos y componentes:
Microcontrolador PIC16F877A
Sensor de temperatura TC74 con interfaz I2C
Transceiver/Adaptador de niveles MAX232
LCD de caracteres alfanuméricos con driver compatible HD44780
Conector DB9 hembra para conexión externa RS232
Cristales de cuarzo de frecuencias 8MHz y 32,768kHz
Resistencias y potenciómetros de valores normalizados
Condensadores de valores normalizados
Pulsadores normalmente abiertos
Fuente de alimentación con 5V de tensión continua como salida
Los pines de los componentes más significativos que se utilizarán, se muestran en la figura 2.1.
Utilizando la utilidad “Project Wizard” del entorno del compilador de C de CCS (IDE de PCWHD) se generan,
de manera parcial, los ficheros Temperatura.c y Temperatura.h a partir de los cuales se pretende completar
el código necesario para conseguir el funcionamiento deseado. Para el manejo del LCD, se dispone de un
fichero denominado Driver_LCD.c, que contiene la biblioteca con las habituales funciones de manejo de un
LCD con driver HD44780, las líneas iniciales del fichero que se muestran en las páginas del reverso.
Apartado 1 (35% valoración): Detalle y explique un posible esquema de conexiones de componentes
disponibles para conseguir el funcionamiento deseado, atendiendo al código fuente de partida que se
suministra. De cara a facilitar la clara y rápida interpretación del esquema, represente sólo los pines que se
van a utilizar en la conexión, cualquier pin de los componentes que aparecen en el esquema que no se
muestre, se interpretará como no conectado. Cualquier esquema, sin su correspondiente justificación, será
valorado con calificación nula.
Apartado 2 (35% valoración): Detalle y explique un posible algoritmo para el programa que haga posible
el funcionamiento especificado, que se ajuste a la parte del código fuente ya escrito que se suministra y que
usted tendrá que completar en el apartado 3 de este ejercicio. En el algoritmo debe contemplarse la
posibilidad de que se produzcan errores de comunicación tanto en el bus I2C como en la comunicación
serie asíncrona y en ambos casos, se deben mostrar mensajes de advertencia en la pantalla del LCD.
Apartado 3 (30% valoración): De acuerdo con el algoritmo detallado en el apartado 2 y el conexionado
especificado en el apartado 1, complete el código fuente que aparece en el fichero Temperatura.c.
Concretamente el código necesario en los siguientes bloques del fichero:
a) Configuración inicial de los módulos internos del microcontrolador que se vayan a emplear,
justificando el motivo y cálculos que sean necesarios de cara a la configuración
b) Bucle continuo de ejecución
c) Función correspondiente al programa de tratamiento de la interrupción generada por el módulo TMR1
d) Función para el programa de tratamiento de interrupción por recepción serie asíncrona
NOTA: no es necesario copiar el código de partida ya escrito, añada la parte de código que falta e indique
claramente en qué lugar se insertaría su aportación
E.P. de Ingeniería de Gijón 22 de mayo de 2018
Desarrollo de Prototipo curso 3º Grado en Ingeniería Electrónica Industrial y Automática (GEIEA)
Sensor de Temperatura I2C
LCD de caracteres
MAX232 con sus
Condensadores Auxiliares (C1 a C5)
Conector DB9 para RS232
Figura 2.1.- Pines de los componentes más significativos del diseño (aparte del PIC16F877A)
E.P. de Ingeniería de Gijón 22 de mayo de 2018
Desarrollo de Prototipo curso 3º Grado en Ingeniería Electrónica Industrial y Automática (GEIEA)
Ficheros de código fuente disponibles inicialmente:
/////////////////////////////
// Fichero Temperatura.h //
/////////////////////////////
#include <16F877A.h>
#FUSES NOLVP
#use delay(crystal=8000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)
#use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3,force_hw)
////////////////////////////
// Fichero Driver_LCD.c //
////////////////////////////
struct lcd_pines {
int
BOOLEAN rs; //línea RS de control del LCD
BOOLEAN no; //línea no utilizada para el LCD
BOOLEAN rw; //línea RW de control del LCD
BOOLEAN enable; //línea E de control del LCD
data : 4; //líneas de datos del LCD
} lcd;
#locate lcd = 0x08 //el PORTD está en dirección 0x08 de RAM
#byte tris_lcd = 0x88 //registro TRISD en dirección 0x88 de RAM
//Prototipos de la biblioteca de funciones de manejo del LCD
void lcd_init();//Inicialización del LCD
void lcd_reset();//Reset software del LCD
byte lcd_read_byte();//Lectura del byte del LCD señalado por el puntero
void lcd_send_nibble(byte n);//Envío de un nibble al LCD
void lcd_send_byte(byte address, byte n);//Envío de un byte a un dirección
void lcd_gotoxy(byte x, byte y);//Posicionamiento de puntero escritura LCD
void lcd_putc(char c);//Envío de character a DDRAM del LCD
void lcd_clr_line(char fila);//Limpia la línea del LCD
void lcd_set_cgram(char cgram_p);//Posicionamiento de puntero en CGRAM
//El fichero sigue con la definición de las funciones declaradas...
E.P. de Ingeniería de Gijón 22 de mayo de 2018
Desarrollo de Prototipo curso 3º Grado en Ingeniería Electrónica Industrial y Automática (GEIEA)
/////////////////////////////
// Fichero Temperatura.c //
/////////////////////////////
#include "Temperatura.h"
#include "Driver_LCD.c"
//////Variables globales
#BYTE RCSTA=0x18 //Registro de configuración de la recepción de la USART
#BIT CREN=RCSTA.4 //Bit que habilita o desahabilita la recepción serie
#BIT OERR=RCSTA.1 //Bit que señala el error de Overrun (sólo lectura)
#BIT FERR=RCSTA.2 //Bit que señala error de trama (sólo lectura)
boolean _ACK_sensor;
///////////////////////////////////////////////////////////////////////
char leer_temperatura(void)
//Función para lectura del sensor de temperatura TC74
//Los valores de retorno: -65º hasta 127º
{
char lectura;
i2c_start(); //Bit de start
//Se envía Dirección del sensor: 1001101 y bit de R/W = 0, recogemos bit de ACK
_ACK_sensor=i2c_write(0b10011010);
if (!_ACK_sensor) //Si hubo respuesta, seguimos, si no, no enviamos el resto
{
i2c_write(0x00); //Comando: lectura registro de temperatura
i2c_start(); //Repetición de start
i2c_write(0b10011011); //Dirección del sensor y bit de R/W = 1
lectura=i2c_read(0); //Recogemos temperatura y colocamos NO ACK
}
i2c_stop(); //Se cierra actividad bus I2C
return(lectura); //Devolución valor, si no hubo respuesta sensor, no tendrá
validez
}
#INT_TIMER1
void Desbordamiento_TMR1()
{
¿Código apartado 3.c?
}
#INT_RDA
void Recepcion_serie()
{
}
¿Código apartado 3.d?
void main()
{
///Configuración de los módulos utilizados ¿Código apartado 3.a?
lcd_reset(); //Reset software del LCD de caracteres
lcd_init(); //Inicialización del LCD de caracteres
enable_interrupts(INT_TIMER1); //Habilitación máscara interrupción de TMR1
enable_interrupts(INT_RDA); //Habilitación máscara interrupción recepción
enable_interrupts(GLOBAL); //Máscara global
while(TRUE)
{ //Bucle de ejecución continuo
¿Código apartado 3.b?
}
}