Autor Tema: PIC16f18313 DHT22 nunca lee  (Leído 2595 veces)

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

Desconectado vmetal2020

  • PIC10
  • *
  • Mensajes: 6
PIC16f18313 DHT22 nunca lee
« en: 22 de Agosto de 2020, 11:20:12 »
Buenas tardes,

Llevo todo el día intentando recibir la medida de temperatura del sensor DHT22 con el pic 16f18313 y no lo consigo. Aver si podeis ayudarme que seguro que es una tontería lo que me falta. He buscado ejemplos por internet y los he aplicado a mi código. En primer lugar, intenté utilizar Standar_IO pero al no funcionar, he puesto FAST_IO para ir configurando cada entrada/salida a mano. He probado también a usar set_tris_a con valores 0x1E y 0x0E y por último mapeando el bit A4 para ir cambiándolo de valor. El resultado es siempre "timeout" nunca consigo que pase de ahí. He comprobado los tiempos y parece que están bien. El sensor lo he probado con arduino y funciona correctamente por lo que es un fallo de código. ¿Que puede ser?
Código: [Seleccionar]
#include <16F18313.h>
//#device ADC=10

//#FUSES WDT                      //Watch Dog Timer

#use delay(internal=2MHz)
#use FAST_IO( A )
#define DHT22   PIN_A4
#define led     PIN_A5

#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8,stream=PORT1,FORCE_SW)
Código: [Seleccionar]
#include <pic16f18313.h>
#BIT Data_Pin = 0x00C.4                       // Pin mapped to PORTA.0
#BIT Data_Pin_Direction = 0x08C.4             // Pin direction mapped to TRISA.0
 
char message1[] = "Temp = 00.0 C";
char message2[] = "RH   = 00.0 %";
short Time_out ;
unsigned int8 T_byte1, T_byte2, RH_byte1, RH_byte2, CheckSum ;
unsigned int16 Temp, RH;

void start_signal(){
  Data_Pin_Direction = 0;              // Configure connection pin as output
  Data_Pin = 0;                        // Connection pin output low
  delay_ms(25);
  Data_Pin = 1;                        // Connection pin output high
  delay_us(30);
  Data_Pin_Direction = 1;              // Configure connection pin as input
}
short check_response(){
  delay_us(40);
  if(!Data_Pin){                     // Read and test if connection pin is low
    delay_us(80);
    if(Data_Pin){                    // Read and test if connection pin is high
      delay_us(50);
      return 1;}
    }
}
unsigned int8 Read_Data(){
  unsigned int8 i, k, _data = 0;     // k is used to count 1 bit reading duration
  if(Time_out)
    break;
  for(i = 0; i < 8; i++){     k = 0;     while(!Data_Pin){ // Wait until pin goes high       k++;       if (k > 100) {Time_out = 1; break;}
      delay_us(1);}
    delay_us(30);
    if(!Data_Pin)
      bit_clear(_data, (7 - i));               // Clear bit (7 - i)
    else{
      bit_set(_data, (7 - i));                 // Set bit (7 - i)
      while(Data_Pin){                         // Wait until pin goes low
      k++;
      if (k > 100) {Time_out = 1; break;}
      delay_us(1);}
    }
  }
  return _data;
}
void main(){
// set_tris_a(0x0E);
   /*
   0 salida
   1 entrada
   A5_led_ salida valor 0
   A4_DHT22 a veces entrada a veces salida
   A3_nada_ entrada
   A2_nada_ entrada
   A1_RX_RS232 valor 1
   A0_TX_RS232 valor 0
   Los dos codigos son 0x0E Para A4 como entrada y 0x1E para A4 como salida.
   */
set_tris_a(0x0E);
  while(TRUE){
    delay_ms(1000);
    Time_out = 0;
    Start_signal();
    if(check_response()){                    // If there is response from sensor
      RH_byte1 = Read_Data();                 // read RH byte1
      RH_byte2 = Read_Data();                 // read RH byte2
      T_byte1 = Read_Data();                  // read T byte1
      T_byte2 = Read_Data();                  // read T byte2
      Checksum = Read_Data();                 // read checksum
      if(Time_out){                           // If reading takes long time
        printf("timeout\r\n");
      }
      else{
       if(CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF)){
        RH = RH_byte1;
        RH = (RH << 8) | RH_byte2;
        Temp = T_byte1;
        Temp = (Temp << 8) | T_byte2;         if (Temp > 0x8000){
         message1[6] = '-';
         Temp = Temp & 0x7FFF; }
        else
         message1[6] = ' ';
        message1[7]  = (Temp / 100) % 10  + 48;
        message1[8]  = (Temp / 10) % 10  + 48;
        message1[10] = Temp % 10  + 48;
        message2[7]  = (RH / 100) % 10 + 48;
        message2[8]  = (RH / 10) % 10 + 48;
        message2[10] = RH % 10 + 48;
        message1[11] = 223;                   // Degree symbol

        printf("correcto\r\n");
       }
        else {

          printf("checsum error\r\n");
        }
      }
    }
    else {

     printf("Sin respuesta\r\n");
    }
   
    delay_ms(2500);
   output_high(led);
   printf("encendido\r\n");
   delay_ms(1000);
   
   output_low(led);
   printf("apagado\r\n");
    delay_ms(1000);
  }
 
 
}


Muchas gracias

Desconectado vmetal2020

  • PIC10
  • *
  • Mensajes: 6
Re:PIC16f18313 DHT22 nunca lee
« Respuesta #1 en: 22 de Agosto de 2020, 13:14:03 »
Sigo realizando pruebas y veo que se configura bien cuando se configura como salida y cuando se configura como entrada. el codigo entra en el if check_response(). Usando printf veo que el problema esta en la parte de READ_DATA. ¿Puede que sean los tiempos?. El problema me surge en esta parte:
Código: [Seleccionar]
T_byte2 = Read_Data(); la cual activa el timeout.
« Última modificación: 22 de Agosto de 2020, 13:19:03 por vmetal2020 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16f18313 DHT22 nunca lee
« Respuesta #2 en: 22 de Agosto de 2020, 13:34:02 »
Inicialmente arrancan como entradas analógicas, ¿los definiste como entradas digitales?

Ademas estos PIC tienen una gran variedad de modos de utilizarse. Mi problema es que no utilizo CSS es como configurar estos.

Ya que poseen ademas de lo dicho: digital/analogico, registros de manejo de puertos como PORTx, LATx, y el TRIS. Tambien:

• WPUx registers (weak pull-up)
• INLVLx (input level control)
• SLRCONx registers (slew rate)
• ODCONx registers (open-drain)

Donde el set_tris_x queda corto para definir todo esto.. el input tambien. y Finalmente terminarias modificando registro a registro... que no es diferente de XC8.

Desconectado vmetal2020

  • PIC10
  • *
  • Mensajes: 6
Re:PIC16f18313 DHT22 nunca lee
« Respuesta #3 en: 22 de Agosto de 2020, 14:07:47 »
En principio con el wizard que trae las je seleccionado como digitales. De hecho, he hecho pruebas con un led configurada como salida y otra prueba leyendo la entrada con pullup y funciona bien.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16f18313 DHT22 nunca lee
« Respuesta #4 en: 22 de Agosto de 2020, 14:46:06 »
Es que no veo en ninguna parte que este definido las entradas como digitales, usualmente en CCS tenes una funcion:

Código: C
  1. SETUP_ADC_PORTS( ALL_DIGITAL );

Desconectado vmetal2020

  • PIC10
  • *
  • Mensajes: 6
Re:PIC16f18313 DHT22 nunca lee
« Respuesta #5 en: 22 de Agosto de 2020, 15:16:33 »
Si no me equivoco por defecto son digitales y solo se definen si las quieres analógicas. De todas formas probare a definirlas digitales

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PIC16f18313 DHT22 nunca lee
« Respuesta #6 en: 22 de Agosto de 2020, 15:19:30 »
Del datasheet:

Citar
The ANSELA bits default to the Analog mode after Reset. To use any pins as digital general purpose or peripheral inputs, the corresponding ANSEL bits must be initialized to ‘0’ by user software


Desconectado vmetal2020

  • PIC10
  • *
  • Mensajes: 6
Re:PIC16f18313 DHT22 nunca lee
« Respuesta #7 en: 22 de Agosto de 2020, 16:06:48 »
Si lo configurara por ejemplo con el xc8 si que tendría que hacerlo como dices, pero con ccs si las seleccionas como digitales no aparece ningún mensaje. Si las selecciono como analógicas si que aparece. De todas formas he probado de varias formas las entradas y salidas y funcionan como digitales. He implementado un código en el que configuro como salida la puerta A4 y la hago parpadear durante 10 segundos. He medido con un multímetro y lo hace bien. Luego en ese mismo código cambio el set_tris_a para que sea entrada y mediante el puerto serie puedo ver en que estado se encuentra. Poniendo a Vcc y Gnd el pin veo que coincide con el estado. Por eso pienso que el problema no es de configuración de puertas sino de algo de tiempos. Te agradezco el tiempo que le estas dedicando. Gracias!

Desconectado vmetal2020

  • PIC10
  • *
  • Mensajes: 6
Re:PIC16f18313 DHT22 nunca lee
« Respuesta #8 en: 23 de Agosto de 2020, 08:07:53 »
Del datasheet:

Citar
The ANSELA bits default to the Analog mode after Reset. To use any pins as digital general purpose or peripheral inputs, the corresponding ANSEL bits must be initialized to ‘0’ by user software

Ya he conseguido que funcione, el problema era la velocidad configurada. Lo había puesto a 2MHz porque quería menor consumo y probando a 8MHz funciona correctamente.

Problema resuelto.
Muchas gracias KILLERJC


 

anything