TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Cesareus01 en 19 de Junio de 2021, 20:07:37
-
Hola, mi primera vez con i2c y la verdad se me quemaron los papeles, no solo no encuentro librerías para el sht35 para ccs sino que tengo problemas al emular mi código en proteus con un sht11 o 15 con un par de librerías que encontré (http://robotypic.blogspot.com/2013/09/Libreria-C-para-SHT11.html) y necesito tener un aparatejo que ya tengo listo con un 16f886. Alguien me puede dar una mano? :(. uso el PIC-C y proteus 8. arranque de mi programa:
#include <main.h>
#include <lcd.c>
#include <SHTxx_RyP.c>
#define INTRAC PIN_C6
#define LUZ PIN_C7
#define CALOR PIN_C5
#define FRIO PIN_C1
#define HUMEDAD PIN_C0
#define BLIGHT PIN_A1 //PORTA RA1
#define SET PIN_A2 //PORTA RA2
#define MAS PIN_A3 //PORTA RA3
#define MENOS PIN_A4 //PORTA RA4
#define BLLCD PIN_C2 //luz backlight
#use i2c(master, sda=PIN_C4, scl=PIN_C3, slow)
#use STANDARD_IO(C)
#use STANDARD_IO(A)
#use FIXED_IO( B_outputs=PIN_B3 )
#define LCD_ENABLE_PIN PIN_B0
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7
-
Esa libreria no hace uso del I2C ....
El tema del Arduino y que la mayoria quiere hacer librerias para todos, es que no usan los modulos que les provee el micro..
mi primera vez con i2c y la verdad se me quemaron los papeles,
Correctamente cual es tu problema? Porque hasta ahora decis que no encontraste libreria... Pero no trataste de ver como funciona el I2C?
-
Hola, si no tienes tiempo o puedes hacer librerias puedes usar el sensor de humedad y temperatura
dht22 humidity +-2%RH(Max +-5%RH); temperature <+-0.5Celsius
sht35 accuracy of 1.5 % RH and 0.2 °C
con un poco menos preciso pero con la ventaja de haber libreria para ccs y poder simular en proteus :)
-
Hola, ya tengo implementado el DHT22 en el circuito , pero satura arriba de 90% de humedad y tarda bastante en bajar, no solo es una cuestión de resolución :?, el sht35 tiene una curva a la temperatura que trabajo más suave, ya lo probe en arduino y funciona 100 veces mejor. Sería interesante hacer un par de librerías entre todos para la nueva linea de Sensirion para ccs, seguramente sería de mucha ayuda para todos los que seguimos programando en este lenguaje. Ya me voy a poner a ver algo más de I2C y un poco más a fondo el funcionamiento de este sensor. Por el momento seguire con el DHT22, empezare un proyecto nuevo con el sht35 en arduino y empezaré a ver la forma de implementar el sensor en ccs en una protoboard.
-
Hola Cesareus01, como estás.
El problema de que alguien del foro te ayude, es que es necesario tener el sensor, para ayudarte a ver algo del código. Caso contrario, programar en el aire no sirve.
Yo lo que te recomiendo es que veas la librería para Arduino, que tiene directivas de I2C similares a CCS y portes el código.
Por ejemplo:
Teniendo en cuenta la siguiente librería: https://github.com/Seeed-Studio/Seeed_SHT35/blob/master/Seeed_SHT35.cpp (https://github.com/Seeed-Studio/Seeed_SHT35/blob/master/Seeed_SHT35.cpp)
typedef int s32;
typedef long unsigned int u32;
typedef short s16;
typedef unsigned short u16;
typedef char s8;
typedef unsigned char u8;
typedef enum {
NO_ERROR = 0,
ERROR_PARAM = -1,
ERROR_COMM = -2,
ERROR_OTHERS = -128,
} err_t;
err_t SHT_IIC_OPRTS::send_command(u16 cmd) {
s32 ret = 0;
Wire.beginTransmission(_IIC_ADDR);
Wire.write((cmd >> 8) & 0xFF);
Wire.write(cmd & 0xFF);
ret = Wire.endTransmission();
if (!ret) {
return NO_ERROR;
} else {
return ERROR_COMM;
}
}
Esa sería la primer función que analizaría.
Primero en la declaración de variables y el arreglo de respuestas, hay que ver de manera preliminar, el tipo de datos de Arduino.
Donde..
typedef int s32;
typedef long unsigned int u32;
typedef short s16;
typedef unsigned short u16;
typedef char s8;
typedef unsigned char u8;
Podría quedar para CCS, como...
typedef signed int32 s32;
typedef unsigned int32 u32;
typedef signed int16 s16;
typedef unsigned int16 u16;
typedef signed int8 s8;
typedef unsigned int8 u8;
Luego para el arreglo de respuestas quedaría igual.
En la etapa de la función, hay que tener en cuenta que está declarada como método de una clase, pero se resuelve de la siguiente manera.
err_t SHT_IIC_OPRTS_send_command(u16 cmd) {
s32 ret = 0; // Indica que la respuesta tiene signo y es de 32 bits, esto me parece erróneo, pero lo podrías probar.
i2c_start(); // Inicializa la comunicación.
i2c_write(_IIC_ADDR); // Envía la dirección I2C del dispositivo.
i2c_write((cmd >> 8) & 0xFF); // MSB del comando.
i2c_write(cmd & 0xFF); // LSB del comando.
ret = i2c_read(0); // Lee la respuesta del dispositivo.
i2c_stop(); // Para la comunicación I2C.
if (!ret) {
return NO_ERROR;
} else {
return ERROR_COMM;
}
}
Tené en cuenta que lo que te expuse es por mi experiencia, tendrías que probarlo y empezar a portar el código. No es algo que te va a llevar un montón de tiempo. A lo sumo en un fin de semana lo sacas andando.
Saludos !