Grupo7 EE604-P LAB3
Grupo7 EE604-P LAB3
Grupo7 EE604-P LAB3
LABORATORIO 3 - GRUPO 7
INTEGRANTES:
SECCIÓN: P
2021-2
1
UNIVERSIDAD NACIONAL DE INGENIERÍA Ciclo Académico: 2021-II
FACULTAD DE INGENIERÍA ELÉCTRICA Y ELECTRÓNICA Fecha: 20/11/21
DEPARTAMENTOS ACADÉMICOS Duración: 5 días
Nota: hay datos por omisión y/o exceso que deben ser evaluados con criterio ingenieril para
dar solución a la pregunta.
2
DIAGRAMA DE FLUJO
3
4
Codigo en C
void LCD_Inicio(void);
void LCD_Comando(char );
void LCD_Enable(void);
void LCD_Data(unsigned char x);
void LCD_Cadena(const char *);
void LCD_Gotoxy(char ,char);
void Mall_Logo(void);
void LCD_Borra(void);
void LCD_Custom_Char(unsigned char,unsigned char*);
void LCD_NumberInt(int number);
void __interrupt(high_priority) Int0ISR(void);
void __interrupt(low_priority) Int1ISR(void);
void __interrupt(low_priority) Int2ISR(void);
void __interrupt(low_priority) Tmr0ISR(void);
unsigned char smile[8] = {0x00,0x0A,0x0A,0x00,0x1F,0x11,0x0E,0x0F};
unsigned char sad[8] = {0x00,0x0A,0x0A,0x00,0x0E,0x11,0x1F,0x0F};
unsigned char blanco[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
// para LOGO
unsigned char linea_v[8] = {0x00,0x00,0x1F,0x1F,0x1F,0x00,0x00,0x00};
unsigned char linea_h[8] = {0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x0E,0x00};
// defino mensajes
void main(void)
{
// Configuro puertos como entradas o salidas
TRISBbits.TRISB0 = 1; // Configura el pin RB0 como entrada (INT0).
TRISBbits.TRISB1 = 1; // Configura el pin RB1 como entrada (INT1).
TRISBbits.TRISB2 = 1; // Configura el pin RB2 como entrada (INT2).
TRISCbits.TRISC2 = 0;
TRISBbits.TRISB3 = 0; //LED verde: aforo disponible
TRISBbits.TRISB4 = 0; //LED rojo: aforo lleno
TRISA=0x00;
LATA=0x00;
// Configuro las interrupciones INT0, INT1, INT2
INTCONbits.GIE = 0; // Deshabilita Interrupcion GLOBAL.
INTCONbits.INT0IE = 1; // Habilita interrupcion Externa INT0.
INTCON2bits.INTEDG0 = 0; // Interrupcion por flanco de bajada.
INTCON3bits.INT1IE = 1; // Habilita interrupcion Externa INT1.
INTCON2bits.INTEDG1 = 0; // Interrupcion por flanco de bajada.
INTCON3bits.INT2IE = 1; // Habilita interrupcion Externa INT2.
INTCON2bits.INTEDG2 = 0; // Interrupcion por flanco de bajada.
INTCON3bits.INT1IP = 1; // Alta prioridad.
INTCON3bits.INT2IP = 1; // Alta prioridad.
RCONbits.IPEN = 1; // Habilita las Interrupciones de Prioridad.
INTCONbits.TMR0IE = 1; // Habilita interrupcion TMR0.
INTCON2bits.TMR0IP = 0; // TMR0 en baja prioridad.
INTCONbits.GIEL = 1; // Habilita Interrupcion de baja prioridad.
INTCONbits.GIE = 1; // Habilita Interrupcion GLOBAL.
//configuro Timer0
T0CON = 0xC3; // Ftmr0= 4MHz/16= 250KHz
// Ttmr0= 4uS, Arranca el timer
TMR0L = 5; // Se inicia con ese valor, para 1 ms
char j;
LCD_Inicio();
// LOGO dura 5s
Mall_Logo();
while(1){
k=e-o;
if(k<1000){
LATBbits.LATB3=1; //Led verde encendido
LATBbits.LATB4=0; //Led rojo apagado
}
else{
LATBbits.LATB4=1; //Led rojo encendido
LATBbits.LATB3=0; //Led verde apagado
}
// for(j=1;j<3;j++)
// {
// LCD_Gotoxy(4,20);
// __delay_ms(100);
// LCD_Data(j); /*To display custom character send address as data to point stored character */
// }
};
}
if(INTCON3bits.INT1IF == 1){
k--;
o++;
LCD_Gotoxy(2,13);
LCD_NumberInt(e);
LCD_Gotoxy(3,13);
LCD_NumberInt(o);
if(k<=9){
LCD_Gotoxy(4,13);
LCD_NumberInt(k);
7
}
if(10<=k){
LCD_Gotoxy(4,13);
LCD_NumberInt(k);
}
INTCON3bits.INT1IF = 0; // Borra el flag de interrupcion
}
if(INTCON3bits.INT2IF == 1){
k--;
o++;
LCD_Gotoxy(2,13);
LCD_NumberInt(e);
LCD_Gotoxy(3,13);
LCD_NumberInt(o);
if(k<=9){
LCD_Gotoxy(4,13);
LCD_NumberInt(k);
}
if(10<=k){
LCD_Gotoxy(4,13);
LCD_NumberInt(k);
}
INTCON3bits.INT2IF = 0; // Borra el flag de interrupcion
}
}
else{
if(INTCON3bits.INT1IF == 1){
k--;
o++;
LCD_Gotoxy(2,13);
LCD_NumberInt(e);
LCD_Gotoxy(3,13);
LCD_NumberInt(o);
LCD_Gotoxy(4,13);
LCD_NumberInt(k);
INTCON3bits.INT1IF = 0; // Borra el flag de interrupcion
}
if(INTCON3bits.INT2IF == 1){
k--;
o++;
LCD_Gotoxy(2,13);
LCD_NumberInt(e);
LCD_Gotoxy(3,13);
LCD_NumberInt(o);
LCD_Gotoxy(4,13);
LCD_NumberInt(k);
INTCON3bits.INT2IF = 0; // Borra el flag de interrupcion
}
if(k==999){
LCD_Gotoxy(4,16);
LCD_Data(5);
}
INTCONbits.INT0IF = 0;
}
}
8
void __interrupt(low_priority) Tmr0ISR(void)
{
TMR0L = 5; // Se inicia con ese valor, para 1 ms
cuenta++;
if(cuenta==300){ //Cada 300ms entra al condicional
if(s==0){
l++;
}
if(s==1){
l--;
}
if(l==1){
LATCbits.LATC2=1;
LATA=0x3E;
s=0;
}
if(l==2){
LATCbits.LATC2=1;
LATA=0x3D;
}
if(l==3){
LATCbits.LATC2=1;
LATA=0x3B;
}
if(l==4){
LATCbits.LATC2=1;
LATA=0x37;
}
if(l==5){
LATCbits.LATC2=1;
LATA=0x2F;
}
if(l==6){
LATCbits.LATC2=1;
LATA=0x1F;
}
if(l==7){
LATCbits.LATC2=0;
LATA=0x3F;
s=1;
}
cuenta = 0;
}
INTCONbits.TMR0IF = 0;
}
/****************************Functions********************************/
void LCD_Inicio(void)/*Configuracion*/
{
TRISD = 0x00; /* Puerto D como salida*/
TRISCbits.TRISC0 = 0x00; /* Pin 0D como salida*/
TRISCbits.TRISC1 = 0x00; /* Pin 1D como salida*/
/* LCD 8 BITS */
LCD_Comando(0x38); /*uses 2 line and initialize 5*7 matrix of LCD*/
LCD_Comando(0x0C); /*display on cursor off*/
LCD_Comando(0x01); /*clear display screen*/
LCD_Comando(0x06); /*increment cursor (shift cursor to right)*/
}
void LCD_Borra(void)
{
10
LCD_Comando(0x01); /*clear display screen*/
__delay_ms(3);
}
void LCD_Enable(void)
{
/************ ENABLE ************/
__delay_ms(1); // Demora superior a 100 useg
E=1; //Enable
__delay_ms(1); // Demora superior a 100 useg
E=0; //Disable
/********************************/
}
void Mall_Logo(void)
{
char i;
//LCD_Borra();
LCD_Custom_Char(1,smile);
LCD_Custom_Char(2,sad);
LCD_Custom_Char(3,linea_v);
LCD_Custom_Char(4,linea_h);
for(i=7;i<16;i++)
{
LCD_Gotoxy(1,i);
__delay_ms(10);
LCD_Data(3); /*To display custom character send address as data to point stored character */
__delay_ms(10);
}
for(i=2;i<4;i++)
{
LCD_Gotoxy(i,16);
__delay_ms(10);
LCD_Data(4);
}
for(i=15;i>6;i--)
{
LCD_Gotoxy(4,i);
__delay_ms(10);
LCD_Data(3); /*To display custom character send address as data to point stored character */
__delay_ms(10);
}
for(i=3;i>1;i--)
{
LCD_Gotoxy(i,5);
__delay_ms(10);
LCD_Data(4);
}
LCD_Gotoxy(2,9);
LCD_Cadena(Logo1);
LCD_Gotoxy(3,7);
LCD_Cadena(Logo2);
__delay_ms(1000);
12
LCD_Borra();
}
2. (10.0 puntos) Diseñe y simule un circuito basado en el Microcontrolador PIC18F4550, usando
programación en C, que permita lo siguiente mostrar la temperatura en un LCD de 2x40:
a) En el LCD de 4 filas x 20 columnas, se mostrará inicialmente el LOGO de la pregunta 1 que se
mostrará durante 5 segundos, luego se borra y debe aparecer en la primera fila el nombre del
proyecto que ustedes elijan, referente a usar un sensor de temperatura LM35 (usar en todo su rango
desde -55° hasta 150°), en la tercera fila se debe mostrar la temperatura leída del proceso con
intervalos de 10mV, ósea con tres decimales.
b) La lectura del ADC se realizará a intervalos de dos segundos programado por interrupciones del
timer 0 (modo 16 bits) y para leer la temperatura del ADC también se usará su interrupción.
c) En las filas 2 y 4 del LCD llenar con ***** o con ==== u otro que usted crea conveniente.
Nota: hay datos por omisión y/o exceso que deben ser evaluados con criterio ingenieril para
dar solución a la pregunta.
SE PIDE:
a) Diagrama de flujo.
b) Códigos del programa en lenguaje C, debidamente comentados.
c) Circuitos de simulación en proteus.
d) Archivos con el código fuente y el circuito en Proteus (aquí deben comprimir toda la carpeta creada
en el MPLAB más su simulación).
e) En sus nombres de archivos USAR LA NOMENCLATURA USADA EN EL LABORATORIO 2.
13
14
Código en C:
/*
* File: Sensor_Temperatura_LCD.c
* Autores: Agapito Quiñones Daniel Eduardo 20194016J
* Cruz Chavarría Miguel Angel 20192060A
* López Diestra Javier Rodrigo 20192100C
* Soria Pinedo Franck David 20190235I
*
* El proyecto elegido consiste en medir Temperatura en un determinado espacio del centro comercial Mall
Aventura
* para luego enviar este dato al sistema de aire acondicionado con el fin de controlar la Temperatura del
Mall.
*
* Este programa solo se limita a extraer la información de la temperatura del sensor LM35 con un tiempo de
muestreo
* de 2seg controlado por la interrupción del timer0 en 16bits y por la interrupción del convertidor ADC.
*/
#include <xc.h>
#include <stdio.h>
#define _XTAL_FREQ 20000000
// Programa Principal
void main(void) {
//Definimos variable
char temperatura[5];
//MOSTRAMOS EL LOGO
LCD_Inicio(); //Inicializo el LCD
Mall_Logo(); // Se muestra el Logo por 5 seg
//Configuramos el Timer0
T0CON = 0x86; // 0x86 = 10000110 Iniciamos timer,16bits,Fosc/4,flanco de bajada,Usamos
Pre-scaler,1:128
// Fosc = 16MHz -> Fosc/4 = 4MHz
// 4MHz/128 = 31.25 kHz -> T = 32us
// N*T = 2 -> N = 62500 Max = 65535
TMR0 = 3035; // Iniciamos en 3035 para llegar a 62500 pulsos y obtener 2seg
ADCON0bits.GO = 1; // Iniciamos por primera vez la conversion ADC
//Bucle Infinito
while(1){
if(flag_fin_conversion==1){ // Esperamos a que termine de realizar la conversión
16
flag_fin_conversion = 0;
sprintf(temperatura,"%.3f",temp); // Convertimos temp (float) a cadena para mostrar en LCD.
/****************************Interrupciones****************************/
void __interrupt(high_priority) Tmr0ISR(void){
TMR0 = 3035; // Iniciamos el contador en 3035 para generar 2seg
ADCON0bits.GO = 1; // Cuando llegue a 2seg empieza la conversion ADC
INTCONbits.TMR0IF = 0;
}
/****************************Functions********************************/
void LCD_Inicio(void)/*Configuracion*/
{
__delay_ms(15); // Espera de 15 ms
LATD= 0x30; // DB[7..4] X EN R/W RS
// 0011 0 0 0 0
EN = 1; // Genero pulso en EN (1-to-0)
NOP(); // Retarda un ciclo
EN = 0;
__delay_ms(5); // Demora superior a 4,1 msg
void LCD_Borra(void)
{
LCD_Comando(0x01); /*clear display screen*/
__delay_ms(3);
}
if(fila==1)
{
posicion=(0x80) | (columna); // Posiciona cursor en la fila 1
LCD_Comando(posicion);
}
18
if(fila==2)
{
posicion=(0xC0) | (columna); // Posiciona cursor en la fila 2
LCD_Comando(posicion);
}
if(fila==3)
{
posicion=(0x80) | (0x14+columna); // Posiciona cursor en la fila 3
LCD_Comando(posicion);
}
if(fila==4)
{
posicion=(0xC0) | (0x14+columna); // Posiciona cursor en la fila 4
LCD_Comando(posicion);
}
}
void Mall_Logo(void)
{
char i;
LCD_Custom_Char(1,smile);
LCD_Custom_Char(2,sad);
LCD_Custom_Char(3,linea_v);
LCD_Custom_Char(4,linea_h);
for(i=7;i<16;i++)
{
LCD_Gotoxy(1,i);
__delay_ms(10);
LCD_Data(3); /*To display custom character send address as data to point stored character */
__delay_ms(10);
}
for(i=2;i<4;i++)
{
LCD_Gotoxy(i,16);
__delay_ms(10);
LCD_Data(4);
}
for(i=15;i>6;i--)
{
LCD_Gotoxy(4,i);
__delay_ms(10);
LCD_Data(3); /*To display custom character send address as data to point stored character */
__delay_ms(10);
}
19
for(i=3;i>1;i--)
{
LCD_Gotoxy(i,5);
__delay_ms(10);
LCD_Data(4);
}
LCD_Gotoxy(2,9);
LCD_Cadena(Logo1);
LCD_Gotoxy(3,7);
LCD_Cadena(Logo2);
__delay_ms(1000);
LCD_Borra();
}
20