Proyecto 2011
Comunicación Serie
Materia: Laboratorio
II
Profesor: José Faginas
Profesor: José Faginas
Alumnos: Kevin
Garro y Jorge Palacio
Escuela: E.T. N°
28 “República Francesa”Año: 5° División: 3°
Índice
Nuestro
proyecto sobre comunicación serie se encarga de establecer un vínculo entre un
microcontrolador y una PC. Se conectan por medio de un cable con conectores DB9,
y usan el protocolo de comunicación serie RS-232. La PC interpreta los datos
recibidos con el programa HyperTerminal. La placa se alimenta con 9 V, pero el
circuito funciona con 5 V, ya que posee un regulador de tensión LM7805.
Uno
de los usos que se le puede dar a nuestro proyecto es el de la práctica o
enseñanza, para que alguien intente conseguir prender los LEDS, leer los
estados de las entradas y mostrarlos en el LCD, como hicimos acá. También podría
usarse, con algunas modificaciones, para controlar artefactos en la casa
(luces, ventiladores, portón eléctrico, etc.) en lugar de los LEDS, o para
saber si puertas o ventanas se encuentran cerradas o abiertas, en vez de saber
el estado de las llaves del DIP SWITCH.
Para
poder comenzar, primero se deben realizar los siguientes pasos:
-
Se debe conectar la placa a una fuente de
tensión continua de 9 V.
- Luego se la conecta con la PC por medio de un
cable con conectores DB9 (macho para la placa y hembra para la PC).
- Ahora debemos configurar el HyperTerminal de
la siguiente manera:
- Finalmente,
prendemos la llave y el LED rojo de encendido debería iluminarse. El
microcontrolador envía un mensaje de bienvenida a la PC y al display LCD:
-
Luego de haber transcurrido un tiempo de 5
segundos, ya podemos enviar comandos desde la PC al microcontrolador. El LCD
indica el valor de la entrada analógica del potenciómetro y el estado de las 7
entradas digitales del DIP-SWITCH:
Aclaración: si el LCD no se ve muy bien, se le puede regular su contraste con el preset que se encuentra a su lado.
Alimentación:
MAX 232 y Conector DB9:
LEDS:
Pulsadores:
Entradas Digitales:
Potenciómetro:
LCD:
-
Al presionar el “0” en el HyperTerminal, se
recibe el valor de tensión que cae en el potenciómetro de 5 KΩ conectado al pin
RA 0 (AN 0). El valor de ésta tensión estará entre 0 y 5 V:
-
Al presionar alguno de los números entre “1”
y “7”, se recibe el estado de la respectiva llave del DIP-SWITCH (al presionar
“3”, por ejemplo, se recibe el estado de la llave DIG 3). Éstas están
conectadas al resto de los pines del Puerto A (RA1 – RA7):
- Además, para recibir ayuda, se puede presionar la tecla “?” y se recibe en la PC una lista con los comandos disponibles:
-
Cuando se presiona algunas de las letras
entre la “a” y la “h” se prende o se apaga alguno de los 8 LEDS asociado a esa
letra de acuerdo a su estado anterior. Esto es lo que se ve si se apretaran las
teclas “b”, “c”, “f”, y “h” (si todos los LEDS se encontraban apagados
previamente):
Aclaración:
las letras deben ser minúsculas.
Además, hay 2 pulsadores que
se encuentran a un lado del DIP-SWITCH cuyas funciones se explican a
continuación:
- Al
presionar el Pulsador 1 (PULS_1) se
apagan todos los LEDS y se envía el siguiente mensaje a la PC:
- Al
presionar el Pulsador 2 (PULS_2) se
recibe en la PC el valor de la entrada analógica (potenciómetro) y el estado de
las 7 entradas digitales (DIP-SWITCH):
-Diseño en el Protel:
- Lado de las pistas de cobre:
- Lado de los componentes:
/* Proyecto
2011
Comunicación
Serie
Profesor: José Faginas
Alumnos: Kevin Garro y Jorge Palacio
Este
proyecto se encarga de establecer una comunicación entre un
microcontrolador
PIC16F887 y una PC, por medio del protocolo
RS-232.
También muestra los valores de las entradas en el LCD.
Por
medio del programa HyperTerminal, se pueden obtener en la PC el valor
de la
tensión que cae en el potenciómetro o los estados de las entradas
digitales.
También se pueden cambiar los estados de los LEDS.
*/
#include
"C:\Documents and Settings\Administrador\Mis documentos\Tareas\Laboratorio
II\Proyecto\C\Proyecto.h"
#include
"flex_lcd.c"
#include
<stdio.h>
//Declaración
de variables
unsigned
long temp;
float
ANALOG;
int
DIG1, DIG2, DIG3, DIG4, DIG5, DIG6, DIG7;
int
LED0, LED1, LED2, LED3, LED4, LED5, LED6, LED7;
char
PC;
int i;
void
main()
{
//Código hecho por el WIZARD
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);// This device
COMP currently not supported by the PICWizard
setup_oscillator(OSC_8MHZ);
//Mensaje de bienvenida al PC
printf("CUBA 2011\r",);
printf("COM. SERIE\r",);
//Mensaje de bienvenida al LCD
setup_timer_0(1);
lcd_init();
lcd_gotoxy(4,1);
lcd_putc("CUBA 2011");
lcd_gotoxy(4,2);
lcd_putc("COM. SERIE");
delay_ms(5000);
//Mensaje de ayuda
printf("\rPresione /?/ para obtener
ayuda\r\r");
//Se borra la pantalla del LCD
lcd_init();
//Se ejecuta infinitamente
while(1){
//Si no recibe nada desde la PC ejecuta
lo que está adentro
while(!kbhit()){
//Acá se muestra la primera parte de la
información en el LCD
for (i=1;i<=3;++i){
//Se obtiene el valor de AN_0
set_adc_channel(0); //Canal AN_0
delay_ms(50);
temp=read_adc(); //Mide la tensión
ANALOG=temp/204.8; //Divide para que de en V
delay_ms(200);
//Se obtiene el valor de las entradas
digitales
DIG1 = INPUT_STATE(DIG_1);
DIG2 = INPUT_STATE(DIG_2);
DIG3 = INPUT_STATE(DIG_3);
DIG4 = INPUT_STATE(DIG_4);
DIG5 = INPUT_STATE(DIG_5);
DIG6 = INPUT_STATE(DIG_6);
DIG7 = INPUT_STATE(DIG_7);
//Si se presiona PULS_1 se apagan todos
los LEDS
if(input(PULS_1)){
output_d(0);
printf("Todos los LEDS fueron
apagados\r\r");
}
//Si se presiona PULS_2 se envían los
valores de las entradas a la PC
while(!input(PULS_2)){
printf("Las entradas
valen:\r");
printf("\rAN 0 =
%1.3fV\r",ANALOG);
printf("\rD1 = %d\r",DIG1);
printf("\rD2 = %d\r",DIG2);
printf("\rD3 = %d\r",DIG3);
printf("\rD4 = %d\r",DIG4);
printf("\rD5 = %d\r",DIG5);
printf("\rD6 = %d\r",DIG6);
printf("\rD7 = %d\r\r",DIG7);
delay_ms(200);
}
//Se muestra la primera parte de la
información en el LCD
lcd_gotoxy(1,1);
printf (lcd_putc," %1.2fV
D1 %d", ANALOG, DIG1);
lcd_gotoxy(1,2);
printf (lcd_putc," D2 %d
D3 %d", DIG2, DIG3);
}
//Acá se muestra la segunda parte de la
información en el LCD
for (i=1;i<=3;++i){
//Se obtiene el valor de AN_0
set_adc_channel(0); //Canal AN_0
delay_ms(50);
temp=read_adc(); // Mide la tensión
ANALOG=temp/204.8; //Para que de en V
delay_ms(200);
//Se obtiene el valor de las entradas
digitales
DIG1 = INPUT_STATE(DIG_1);
DIG2 = INPUT_STATE(DIG_2);
DIG3 = INPUT_STATE(DIG_3);
DIG4 = INPUT_STATE(DIG_4);
DIG5 = INPUT_STATE(DIG_5);
DIG6 = INPUT_STATE(DIG_6);
DIG7 = INPUT_STATE(DIG_7);
//Si se presiona PULS_1 se apagan todos
los LEDS
if(input(PULS_1)){
output_d(0);
printf("Todos los LEDS fueron
apagados\r\r");
}
//Si se presiona PULS_2 se envían los
valores de las entradas a la PC
while(!input(PULS_2)){
printf("Las entradas
valen:\r");
printf("\rAN 0 =
%1.3fV\r",ANALOG);
printf("\rD1 = %d\r",DIG1);
printf("\rD2 = %d\r",DIG2);
printf("\rD3 = %d\r",DIG3);
printf("\rD4 = %d\r",DIG4);
printf("\rD5 = %d\r",DIG5);
printf("\rD6 = %d\r",DIG6);
printf("\rD7 = %d\r\r",DIG7);
delay_ms(200);
}
//Se muestra la segunda parte de la
información en el LCD
lcd_gotoxy(1,1);
printf (lcd_putc," D4 %d
D5 %d", DIG4, DIG5);
lcd_gotoxy(1,2);
printf (lcd_putc," D6 %d
D7 %d", DIG6, DIG7);
}
}
//Si no recibe ningún comando de la PC, vuelve a realizar todo lo
anterior
//Si recibe algún comando desde la PC
//Guarda el caracter recibido en la variable
PC
PC = getc();
//De acuerdo al caracter obtenido realiza la
tarea deseada
switch (PC){
//Para recibir ayuda con la tecla
"?"
case 63: printf("\r\rAYUDA\r");
printf("\rPresione
la tecla 0 para\r");
printf("recibir
la tensión en el potenciómetro\r");
printf("\rPresione
los números del 1 al 7 para\r");
printf("recibir
el estado de las entradas digitales\r");
printf("\rPresione
las letras entre la /a/ y la /h/ (minúscula) para\r");
printf("cambiar
el estado de los LEDS\r\r");
break;
//Envía el valor de las entradas a la PC
case 48: printf("\r\rAN_0 =
%1.3fV\r\r",ANALOG); //0
break;
case 49: printf("\r\rDIG_1 =
%d\r\r",DIG1); //1
break;
case 50: printf("\r\rDIG_2 =
%d\r\r",DIG2); //2
break;
case 51: printf("\r\rDIG_3 =
%d\r\r",DIG3); //3
break;
case 52: printf("\r\rDIG_4 =
%d\r\r",DIG4); //4
break;
case 53: printf("\r\rDIG_5 =
%d\r\r",DIG5); //5
break;
case 54: printf("\r\rDIG_6 =
%d\r\r",DIG6); //6
break;
case 55: printf("\r\rDIG_7 =
%d\r\r",DIG7); //7
break;
//Cambia el estado de los LEDS
case 97:
LED0 = INPUT_STATE(LED_0); //a
if(LED0==1){
output_bit(LED_0,0);}
else{output_bit(LED_0,1);}
printf("\r\r");
break;
case 98:
LED1 = INPUT_STATE(LED_1); //b
if(LED1==1){
output_bit(LED_1,0);}
else{output_bit(LED_1,1);}
printf("\r\r");
break;
case 99:
LED2 = INPUT_STATE(LED_2); //c
if(LED2==1){
output_bit(LED_2,0);}
else{output_bit(LED_2,1);}
printf("\r\r");
break;
case 100:
LED3 = INPUT_STATE(LED_3); //d
if(LED3==1){
output_bit(LED_3,0);}
else{output_bit(LED_3,1);}
printf("\r\r");
break;
case 101:
LED4 = INPUT_STATE(LED_4); //e
if(LED4==1){
output_bit(LED_4,0);}
else{output_bit(LED_4,1);}
printf("\r\r");
break;
case 102:
LED5 = INPUT_STATE(LED_5); //f
if(LED5==1){
output_bit(LED_5,0);}
else{output_bit(LED_5,1);}
printf("\r\r");
break;
case 103:
LED6 = INPUT_STATE(LED_6); //g
if(LED6==1){
output_bit(LED_6,0);}
else{output_bit(LED_6,1);}
printf("\r\r");
break;
case 104:
LED7 = INPUT_STATE(LED_7);
//h
if(LED7==1){
output_bit(LED_7,0);}
else{output_bit(LED_7,1);}
printf("\r\r");
break;
}
}
}
·
Resistencias:
Ø 9 de
390 Ω (0.5 $)
Ø 9 de
10 KΩ (0.5 $)
Ø 1 de
100 Ω /1W (Metalfilm) (2 $)
·
Capacitores:
Ø 5 de
1uF (Electrolíticos) (1 $)
Ø 1 de
470uF/25V (Electrolítico) (0.25 $)
Ø 2 de
100nF (Cerámicos) (0.3 $)
Ø 1 de
100nF/16V (electrolítico) (0.25 $)
·
LEDS:
Ø 5
rojos de 3mm. (1.25 $)
Ø 4
verdes de 3mm. (1 $)
·
1 diodo rectificador (0.75 $)
·
1 potenciómetro de 5 KΩ lineal (4 $)
·
1 preset de 10 KΩ (1.5 $)
·
1 display LCD 2x16 (40 $)
·
1 regulador de tensión: LM 7805 (3.5 $)
·
2 pulsadores (3 $)
·
1 llave deslizante (2 $)
·
1 dip switch de 16 pines (4 $)
·
1 microcontrolador PIC 16F887 (20 $)
·
1 integrado MAX 232 (5 $)
·
1 conector DB9 hembra (4.5 $)
·
1 conector Jack hembra (3.5 $)
·
1 zócalo de 40 pines (1.5 $)
·
1 zócalo de 16 pines (0.5 $)
·
16 pines macho (2.5 $)
·
16 pines hembra (13 $)
·
4 tornillos y 12 tuercas de 3/32 ’’ (4 $)
·
1 plaqueta epoxi de 10x15 (12 $)
·
Total: 131,35$
Tiendas de Electrónica:
- Musikman (Blanco Encalada 2274 – Belgrano, Capital Federal)
- Electrocuba (Blanco Encalada 2179 – Belgrano, Capital Federal)
- T.V. Norte (Gob. Ugarte 2605 – Vicente López, Buenos Aires)