Autor Tema: Analog Input + PIC16F1827  (Leído 2735 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado joseluislo12

  • PIC10
  • *
  • Mensajes: 20
Analog Input + PIC16F1827
« en: 05 de Agosto de 2015, 12:33:57 »
Estoy haciendo un programa en el que dependiendo de un valor de una LDR se enviará por el puerto serial un comando específico

Para "supervisar" el comando que se ha de enviar, estoy utilizando una serie de cinco LEDs que se prenderán en diferentes rangos

Primero dejo el programa:

Código: C
  1. #include <16f1827.h>
  2. #use     delay (internal = 32MHz)
  3. #use RS232(BAUD=9600, XMIT=PIN_B2, RCV=PIN_B1, stream=com,errors)
  4.  
  5. #define NIVEL_0         PIN_B6
  6. #define NIVEL_1         PIN_B7
  7. #define NIVEL_2         PIN_B3
  8. #define NIVEL_3         PIN_B5
  9. #define NIVEL_4         PIN_B4
  10.  
  11. #BYTE TRISA = 0x85
  12.  
  13. #define LDR       PIN_A0
  14.  
  15. void main(){
  16.    int nivel_luz;
  17.    int luz_ant;
  18.    int porc;
  19.    int checksum;
  20.    int trama[23]={0x7E, 0x00, 0x13, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x00, 0x00, 0x01, 0x20, 0x83, 0x08, 0x00, 0x48};
  21.    
  22.    setup_adc_ports(LDR|VSS_VDD);         //Canal 0 analogico
  23.    setup_adc(ADC_CLOCK_INTERNAL);
  24.    
  25.    nivel_luz = read_adc();
  26.    luz_ant = nivel_luz;
  27.    while(TRUE){
  28.       set_adc_channel(0);        //Habilitacion canal0
  29.       delay_us(20);
  30.       nivel_luz = read_adc();
  31.       delay_us(20);
  32.       // RANGOS:
  33.       // VREF = 3 V
  34.       // LUZ MÁXIMA: 0.60 V -> (0.60*255)/3 = 51
  35.       // LUZ MÍNIMA: 1.23 V -> (1.23*255)/3 = 104
  36.       if(nivel_luz < 50){        // V < 0.58V
  37.          output_low (NIVEL_0);
  38.          output_low (NIVEL_1);
  39.          output_low (NIVEL_2);
  40.          output_low (NIVEL_3);
  41.          output_low (NIVEL_4);
  42.          delay_ms(20);
  43.          porc = 0x00;
  44.          checksum = 0x48;
  45.       }
  46.       else if(nivel_luz > 51 && nivel_luz < 65){         // 0.6V < V < 0.76V
  47.          output_high (NIVEL_0);
  48.          output_low (NIVEL_1);
  49.          output_low (NIVEL_2);
  50.          output_low (NIVEL_3);
  51.          output_low (NIVEL_4);
  52.          delay_ms(20);
  53.          porc = 0x14;
  54.          checksum = 0x34;
  55.       }
  56.       else if(nivel_luz > 64 && nivel_luz < 80){         // 0.75V < V < 0.94V
  57.          output_high (NIVEL_0);
  58.          output_high (NIVEL_1);
  59.          output_low (NIVEL_2);
  60.          output_low (NIVEL_3);
  61.          output_low (NIVEL_4);
  62.          delay_ms(20);
  63.          porc = 0x28;
  64.          checksum = 0x20;
  65.       }
  66.       else if(nivel_luz > 79 && nivel_luz < 95){         // 0.92V < V < 1.11V
  67.          output_high (NIVEL_0);
  68.          output_high (NIVEL_1);
  69.          output_high (NIVEL_2);
  70.          output_low (NIVEL_3);
  71.          output_low (NIVEL_4);
  72.          delay_ms(20);
  73.          porc = 0x3C;
  74.          checksum = 0x0C;
  75.       }
  76.       else if(nivel_luz > 94 && nivel_luz < 105){         // 1.10V < V < 1.23V
  77.          output_high (NIVEL_0);
  78.          output_high (NIVEL_1);
  79.          output_high (NIVEL_2);
  80.          output_high (NIVEL_3);
  81.          output_low (NIVEL_4);
  82.          delay_ms(20);
  83.          porc = 0x50;
  84.          checksum = 0xF8;
  85.       }
  86.       else if(nivel_luz > 104){         // 1.22V < V
  87.          output_high (NIVEL_0);
  88.          output_high (NIVEL_1);
  89.          output_high (NIVEL_2);
  90.          output_high (NIVEL_3);
  91.          output_high (NIVEL_4);
  92.          delay_ms(20);
  93.          porc = 0x64;
  94.          checksum = 0xE4;
  95.       }
  96.       if(luz_ant-5 < nivel_luz < luz_ant+5){delay_ms(50);}
  97.       else{
  98.          trama[21] = porc;
  99.          trama[22] = checksum;
  100.          for(int pos=0;pos<=22;pos++){
  101.             putc(trama[pos],com);
  102.             delay_ms(500);
  103.          }
  104.       luz_ant = nivel_luz;
  105.       }
  106.    }
  107. }

Y dejo también un esquema en Proteus



No me interesa que en Proteus los valores correspondan a los del programa o que los LEDs no enciendan como deberían, porque esta parte está funcionando correctamente en la vida real, los cinco LEDs se pueden prender o apagar dependiendo si se tapa más o menos la LDR

La simulación la estoy utilizando para probar la comunicación serial, pero ni en la vida real ni en Proteus funciona correctamente y se generan los siguientes errores:

  • ADC conversion started before 'wait' time has expired followig previous conversion or channel charge
  • PORTA<0> is not configured as an analog input

Lo que no entiendo es por qué dice que no está configurado como una entrada análoga y sí varía la cantidad de LEDs que se encienden y apagan

Desconectado LEDER

  • PIC10
  • *
  • Mensajes: 2
Re: Analog Input + PIC16F1827
« Respuesta #1 en: 14 de Agosto de 2015, 23:14:25 »
yo solo estoy apena entrando en el mundo de los pic pero por lo que veo tienes un pequeño error en tu código
creo que estos códigos se supone sean así
   

   while(TRUE){
      set_adc_channel(0);        //Habilitación canal 0
      delay_us(20);
      nivel_luz = read_adc();
      luz_ant = nivel_luz;
      delay_us(20);                              :)

y no como tu los tienes

   
   nivel_luz = read_adc();
   luz_ant = nivel_luz;
   while(TRUE){
      set_adc_channel(0);        //Habilitación canal 0
      delay_us(20);
      nivel_luz = read_adc();
      delay_us(20); 

                                                       :-/

"Lo que nos hace grandes es el hecho de que podemos ver lo pequeños que somos"