Anda di halaman 1dari 13

Circuito

Figura #1

Diagrama de flujo

Cdigo

#include <REG8253.H>
#include <stdio.h >
#include "lcd.h"
#define cs_ADC P3_5
#define vref 4.096
void ISR(void);
void lectura_adc (void);
void main2(void);
void main3(void);
void peticion(void);
void manual (void);
void petr(void);

//Prototipos de Funciones

void act(void);
void autol(void);
void print_serial(const char *cadena);
void lecturaserial (void);
void peticion1();
void send_byte(unsigned char dato);
unsigned char

get_byte(void);

char putchar (char dato);


float volt=0;

//Asignar 0 a volt.

unsigned int adc_value=0;

//Asignar un cero a adc_value

float dato=0.0;

//Asignar 0.0 a dato

int st;

//Declarar st como entero

unsigned int valor1=0x00;

//Asignar 0 a valor1

unsigned int valor2=0x40;

//Asignar 40 a valor2

unsigned int valor3=0x80;

//Asignar 80 a valor3

unsigned int valor4=0xc0;

//Asignar c0 a valor4

void main (void)


{

cs_ADC=1;

//Asignar 1 a cs_ADC

ISR();

//LLamar a funcion

LCD_init();

//Llamar a lcd_init

_LCD_Cursoroff();

//Llamar a lcd_cursor

lcd_puts ("Chosse Mode");


print_serial("Bienvenido Usuario");
send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

print_serial("Elija modo de operacion Local(L) o Remoto(R)");


send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

while(1)
{

get_byte();
if(SBUF=='R')

//Si es igual a R

{
main2();

//Llamada Funcion

}
else if(SBUF=='L')

//Si es igual a L

main3();

//Cerrar Llamada

}
}
void main2(void)
{
_LCD_Clear();

//LLamar a lcd_clear

lcd_puts("Lectura Remota");//Pasar parametros


send_byte(10);
send_byte(13);

//Pasar parametros
//Pasar parametros

print_serial("Selecciona modo por Peticion(P) o modo Automatico(A)");


send_byte(10);
send_byte(13);

while(1)

//Pasar parametros
//Pasar parametros

//Mientras

get_byte();
if(SBUF=='P')

//Llamar a funcion
//Si es igual a R

{
peticion();

//Llamada Funcion

}
else if(SBUF=='A')

//Si es igual a L

peticion1();

//LLamar a la funcion

}
}
void peticion(void)
{

send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

print_serial("Modo Por Peticion Activado");


send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

print_serial("Introduce una V seguido del canal a medir");

send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

while(1)
{

get_byte();

//LLamar a funcion

if(SBUF=='V')

//Si es igual a R

{
break;

///Cerrar Llamada

}
send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

print_serial("Introduce el numero de canal a medir");


send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

while(1)
{

get_byte();

//Llamar a funcion

if(SBUF=='1')

//Si es igual a R

{
send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

print_serial("Canal #1");//Pasar parametros


send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

valor1=0x00;

//Asignar 0 a valor1

lecturaserial();

//Llamar a funcion

}
else if(SBUF=='2')
{

send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

print_serial("Canal #2");//Pasar parametros


send_byte(10);
send_byte(13);
valor1=0x40;
lecturaserial();

//Pasar parametros
//Pasar parametros
//Asignar 40h a valor1
//LLamar a funcion

}
else if(SBUF=='3')
{
send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

print_serial("Canal #3");//Pasar parametros


send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

valor1=0x80;

//Asinar 80h a valor1

lecturaserial();

//LLamar a funcion

}
else if(SBUF==4)
{
send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

print_serial("Canal #4");//Pasar parametros


send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

valor1=0xc0;

//Asignar C0 a valor1

lecturaserial();

//LLamar a funcion

}
void peticion1(void)
{

send_byte(10);

//Pasar parametros

send_byte(13);

//Pasar parametros

print_serial("Modo automatico introduce la configuracion del tiempo");//Pasar parmetros


}

void lectura_adc (void)


{
st=0;

//Asignar 0 a st
cs_ADC=0;

//Asignar 0 a CS_ADC

SPCR=0x53; //SPI=Enable, MSB primero,clk=fosc/128=62.5khz


SPDR=0x06; //Start, single,D2=0
while(!(SPSR & 0x80)); // esperar transmision, hacer una AND
adc_value = SPDR; // se lee nada

SPDR= valor1; //D1=D2=0


while (!(SPSR & 0x80)); //Esperar nuevamente transmision
adc_value = SPDR & 0x0f; //leer nada
SPDR=0x00;

//Asignar 0 a SPDR

while (!(SPSR & 0x80));//Mientras


adc_value = adc_value << 8 | SPDR; //Asignar valor a adc_value

cs_ADC=1;

//Asignar 1 a cs_ADC

_LCD_Gotoxy(2,2);//Pasar parametros

volt=(vref * adc_value)/ 4095;//Asignar valor a volt.

if (adc_value > 2050) //Si sucede


printf("Volt= %0.2f",volt);//Pasar parametros
else

//Si no sucede

printf("Volt= %0.2f",volt);//Pasar parametros

void lecturaserial (void)


{

st=1;

//Asignar a st=1

cs_ADC=0;

//Asignar 0 a cs_ADC

SPCR=0x53; //SPI=Enable, MSB primero,clk=fosc/128=62.5khz


SPDR=0x06; //Start, single,D2=0
while(!(SPSR & 0x80)); // esperar transmision, hacer una AND
adc_value = SPDR; // se lee nada

SPDR= valor1; //D1=D2=0


while (!(SPSR & 0x80)); //Esperar nuevamente transmision
adc_value = SPDR & 0x0f; //leer nada
SPDR=0x00;

//ASignar 0 a SPDR

while (!(SPSR & 0x80));//Mientras


adc_value = adc_value << 8 | SPDR;//Asignar a adc_value

cs_ADC=1;

//Asignar 1 a cs_ADC

///_LCD_Gotoxy(2,2);

volt=(vref * adc_value)/ 4095;//Asignar a volt valor


send_byte(volt);

//LLamar a funcion

if (adc_value > 2050)

//Si el valor es mayor que 2050

printf("Volt= %0.2f",volt);//Pasar parametros


else

//Si no sucede

printf("Volt= %0.2f",volt); //Pasar parametros

void main3(void)
{
_LCD_Clear();

//LLamar a funcion

_LCD_Gotoxy(0,1);

//Pasar parametros

lcd_puts("Peticion o");

//Pasar parametros

_LCD_Gotoxy(4,2);

//Pasar parametros

lcd_puts("Automatico");

//Pasar parametros

while(1)

//Mientras

if(!P1_0)

//Si P1_0 es cero

{
petr();

//Llamar a funcion

}
else if(!P1_2)

//Si P1_2 es cero

autol();

//Llamar a funcion

}
}
void petr(void)
{
_LCD_Clear();

//LLamar a lcd_clear

_Delay_ms (1000);

//Pasar parametros

lcd_puts("Presiona Botones");

//Pasar parametros

while(1)
{

if(!P3_7)

//Si es cero

{
_Delay_ms (10);

//Pasar parametros

_LCD_Clear();

//Llamar a lcd_clear

_LCD_Gotoxy(0,1);

//Pasar parametros

lcd_puts("Canal 1 Voltaje");//Pasar parametros


valor1=0x00;
lectura_adc();

//Asignar 0 a valor1
//LLamar a funcion

}
else if(!P3_6)
{

//Si es cero

_Delay_ms (10);

//Pasar parametros

_LCD_Clear();

//Llamar a funcion

_LCD_Gotoxy(0,1);

//Pasar parametros

lcd_puts("Canal 2 Voltaje");//Pasar parametros


valor1=0x40;
lectura_adc();

//Asignar 40h a valor1


//Llamar a funcion

}
else if(!P3_5)

//Si es cero

_Delay_ms (10);

//Pasar parametros

_LCD_Clear();

//Llamar a funcion

_LCD_Gotoxy(0,1);

//Pasar parametros

lcd_puts("Canal 3 Voltaje");//Pasar parametros


valor1=0x80;

//Asignar 80h a valor1

lectura_adc();

//LLamar a funcion

}
else if(!P3_4)

//Si es cero

_Delay_ms (10);

//Pasar parametros

_LCD_Clear();

//Llamar funcion

_LCD_Gotoxy(0,1);

//Pasar parametros

lcd_puts("Canal 4 Voltaje");//Pasar parametros


valor1=0xc0;
lectura_adc();

//Asignar c0 a valor1

//LLamar a funcion

}
void autol(void)
{

while(1 && P3_7)

//Mientras

_LCD_Clear();
_LCD_Gotoxy(0,1);

//Llamar a lcd_clear
//Pasar parametros

lcd_puts("Canal 1 Voltaje");//Pasar parametros


valor1=valor1;
lectura_adc();

//Asignar valor
//LLamar a funcion

_Delay_ms(500);

//Pasar parametros

valor1=valor2;

//Asignar valor

_LCD_Clear();

//LLamar a funcion

_LCD_Gotoxy(0,1);

//Pasar parametros

lcd_puts("Canal 2 Voltaje"); //Pasar parametros


lectura_adc();
_Delay_ms(500);

//Llamar a funcion
//Pasar parametros

valor1=valor3;

//Asignar valor

_LCD_Clear();

//LLamar a funcion

_LCD_Gotoxy(0,1);

//Pasar parametros

lcd_puts("Canal 3 Voltaje"); //Pasar parametros


lectura_adc();

//LLamar a funcion

_Delay_ms(500);

//Pasar parametros

valor1=valor4;

//Asignar valor

_LCD_Clear();

//LLamar a funcion

_LCD_Gotoxy(0,1);

//Pasar parametros

lcd_puts("Canal 4 Voltaje"); //Pasar parametros


lectura_adc();
_Delay_ms(500);

//LLamar a funcion
//Pasar parametros

main3();

//LLamar a funcion

}
void ISR(void)
{

RCAP2H = 0xff;

//Configurar baudrate = 9600bps

RCAP2L = 0xe6;

T2CON = 0x30;

//TMR2 para baud rate generator

SCON = 0x50;

//8,n,1

TR2 = 1;

}
void send_byte(unsigned char dato)
{
SBUF = dato;
TI = 0;

//Funcion enviar dato via serial

while(!TI);
}
unsigned char

get_byte(void)

{
while(!RI);
RI = 0;
return SBUF;
}
char putchar (char dato)
{
if(st==0)
{

lcd_putchar(dato);

//Funcion obtener dato via serial

}
else
{
TI = 0;
SBUF = dato;
while(!TI);
return dato;
}
}
void print_serial(const char *cadena)
{
while(*cadena)
send_byte(*cadena++);

//Funcion para imprimir cadena

Conclusin
Para finalizar la prctica se puede concluir que se pudo
desarrollar un programa que pudiera cumplir con todas las
especificaciones planteadas al inicio de esta cumpliendo
as con los objetivos de la prctica.
La interfaz de comunicacin SPI

permiti conectar al

microcontrolador con otro dispositivo integrado dentro del


sistema el cual en este caso fue el ADC MCP3204 el cual es
un convertidor anlogo digital que se encargaba de
transformar estos voltajes a una representacin numrica
para as poder saber qu valor de voltaje posean cada una
de las salidas.
Para desarrollar el sistema lo primero que se creo fue la
lectura de un canal logrando esto configurando una funcin
la cual maneja los registros que controlar el SPI del
microcontrolador y una vez logrado esto se procedi a
variar el valor que posea la variable valor1 para que
mostrara el valor de voltaje

de

los diversos canales que

se queran medir. Por lo tanto, una vez logrado todo lo


anterior se procedi a crear los modos remoto y local lo
cual utilizando la prctica anterior de comunicacin serial

se facilit mucho realizar esto ya que se tena previamente


guardada dichas funciones solo se peda el modo de
operacin al iniciar el sistema y despus se trabajaba en
el seleccionado.
Al finalizar la prctica se puede concluir que el
microcontrolador puede comunicarse y obtener datos a travs
del SPI que este posee y que es posible obtener la
representacin numrica de un voltaje medido para despus
ser manejado segn la necesidad.

Anda mungkin juga menyukai