Vistas de página en total

jueves, 1 de diciembre de 2011

Informe del Proyecto

Proyecto 2011

Comunicación Serie


     Materia:   Laboratorio II
Profesor:  José Faginas
         Alumnos:  Kevin Garro y Jorge Palacio
Escuela:   E.T. N° 28 “República Francesa”
Año:          5°      División:           3°




Índice

            Para recibir datos
            Para cambiar el estado de los LEDS




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:







  Alimentación
  Microcontrolador PIC16F887
  Entradas (Pulsadores, DIP SWICH y potenciómetro)
  LCD
  LEDS
  MAX 232 y Conector DB9




-       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)