Подскажите в чем может быть проблема :
не читаются данные с датчика d18b20
код:
#define chclient 1 // номер клиента 1...
#define SPEED 1 // 1 - 250кб , 2 - 1 мб , 3 -2 мб.
#define PAlevel 3 // мощность 0..3
#define CHANNEL 75 // 123
#define Crclength 2 // 0 - crc off ,1 - 8bit ,2 - 16bit
#define AutoAck false // выключить аппаратное потверждение
#define WD_SAFE watchdog_calc_timeout_from_sec(5)
#define DHTPIN GPIO_PIN_ID_P0_4
#define DSPIN GPIO_PIN_ID_P0_4
#define useDHT 0 // 1 - DHT , 0 - DS18b20
#define POWER_PIN GPIO_PIN_ID_P0_6
#define nofloat 1 // без float , данные передаются умноженные на 10.Очень экономит место.
#define INTERVAL 10 //sec
#include "../libs.h"
#include "../nRFLE.c"
typedef struct{
unsigned char identifier;// номер передатчика.МЕНЯТЬ НЕЛЬЗЯ
long count;
#if nofloat
int temperature_Sensor; //передаём температуру.
#if useDHT
int Humidity_Sensor;// передаём влажность
#endif
#else
float temperature_Sensor;// передаём температуру.
#if useDHT
float Humidity_Sensor;// передаём влажность
#endif
#endif
}
nf1;
nf1 clientnf;
#if useDHT
unsigned char datadht[5];
uint8_t dhtread ()
{
unsigned char j = 0, i = 0;
datadht[0] = datadht[1] = datadht[2] = datadht[3] = datadht[4] = 0;
//pin as output and set 0
gpio_pin_configure(DHTPIN, GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT);
delay_ms(18);
gpio_pin_val_set(DHTPIN); //set 1
//pin as input
gpio_pin_configure(DHTPIN,GPIO_PIN_CONFIG_OPTION_DIR_INPUT);
//=============check DHT response
delay_us(51);
if (gpio_pin_val_read(DHTPIN)) return 0;
delay_us(81);
if (!gpio_pin_val_read(DHTPIN)) return 0;
//===============receive 40 data bits
while (gpio_pin_val_read(DHTPIN));
for (j=0; j<5; j++)
{
datadht[j]=0;
for(i=0; i<8; i++)
{
while (!gpio_pin_val_read(DHTPIN));
delay_us (30);
if (gpio_pin_val_read(DHTPIN))
datadht[j]|=1<<(7-i);
while (gpio_pin_val_read(DHTPIN));
}
}
return 1;
}
#else
// OneWire библиотеки-----------
void OneWireReset()
{
gpio_pin_val_clear(DSPIN);
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT);
delay_us(500);
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_INPUT);
delay_us(500);
}
void OneWireOutByte(uint8_t d)
{
uint8_t n;
interrupt_control_global_disable();
for(n=8; n!=0; n--)
{
if ((d & 0x01) == 1)
{
gpio_pin_val_clear(DSPIN);
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT);
delay_us(2); //5
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_INPUT);
delay_us(60);
}
else
{
gpio_pin_val_clear(DSPIN);
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT);
delay_us(60);
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_INPUT);
}
d=d>>1;
}
interrupt_control_global_enable();
}
uint8_t OneWireInByte()
{
uint8_t d=0, n,b=0;
interrupt_control_global_disable();
for (n=0; n<8; n++)
{
gpio_pin_val_clear(DSPIN);
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT);
delay_us(2); // 5
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_INPUT);
delay_us(2); // 5
b = gpio_pin_val_read(DSPIN);
delay_us(50);
d = (d >> 1) | (b<<7);
}
interrupt_control_global_enable();
return(d);
}
#endif
//====================main========================
void main()
{
__xdata __at(0x0100) long countloop; //counter for loop
__xdata __at(0x0110) int sleep_counter;
#if useDHT
unsigned int crcdata;
#else
// ds
uint8_t SignBit;
uint8_t DSdata[2];
int TReading;
#endif
CLKLFCTRL = 1;
rtc2_configure(RTC2_CONFIG_OPTION_COMPARE_MODE_0_RESET_AT_IRQ , 65535); //65535=2 сек, 32767=1 сек
rtc2_run();
pwr_clk_mgmt_wakeup_configure(PWR_CLK_MGMT_WAKEUP_CONFIG_OPTION_WAKEUP_ON_RTC2_TICK_ALWAYS,0);
if ((PWRDWN&0x7)==0x3) {
PWRDWN=0x0;
RSTREAS=0x0;
if (sleep_counter<(INTERVAL/2)) {
sleep_counter++;
// rtc2_run();
// watchdog_set_wdsv_count(WD_SAFE);
// pwr_clk_mgmt_close_retention_latches();
pwr_clk_mgmt_enter_pwr_mode_memory_ret_tmr_on();
}
if (countloop <= 2147483646) countloop++; /// счетчик передач для контроля качества канала
else countloop = 0;
clientnf.count=countloop;
} else {
countloop = 0;
clientnf.count = 0;
}
radiobegin(); //
openAllPipe(); // открываем прием/передачу
// или по ардуиновски:
//penWritingPipe(0xD2); // канал передачи
//openReadingPipe(1,0xE1); // Открываем канал приема
setChannel(CHANNEL);
setDataRate(SPEED);
setAutoAck(AutoAck);
setCRCLength(Crclength);
setPALevel(PAlevel);
clientnf.identifier=chclient;
#if useDHT
gpio_pin_configure(POWER_PIN, // укажем необходимые параметры
GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT |
GPIO_PIN_CONFIG_OPTION_OUTPUT_VAL_CLEAR |
GPIO_PIN_CONFIG_OPTION_PIN_MODE_OUTPUT_BUFFER_NORMAL_DRIVE_STRENGTH);
gpio_pin_val_clear(DHTPIN);
gpio_pin_configure(DHTPIN, GPIO_PIN_CONFIG_OPTION_DIR_INPUT);
gpio_pin_val_set(POWER_PIN);
delay_ms(850);
dhtread ();
gpio_pin_val_clear(POWER_PIN);
crcdata= (datadht[0] + datadht[1] + datadht[2] + datadht[3]);
if (datadht[0]==0 && datadht[1]==0 && datadht[2]==0 && datadht[3]==0) {
clientnf.temperature_Sensor=0;
clientnf.Humidity_Sensor=0;
//обработка ошибки:не подключен датчик !!
} else if ( crcdata == datadht[4]) {
#if nofloat
if (datadht[1]==0 && datadht[3]==0) {
// dht11
clientnf.temperature_Sensor=datadht[2]*10; // умножение на 10,чтобы было однинаково как у dht22,можно убрать.
clientnf.Humidity_Sensor=datadht[0]*10;
}else { // dht22
clientnf.Humidity_Sensor = (datadht[0] * 256 + datadht[1]);
clientnf.temperature_Sensor = ((datadht[2] & 0x7F)* 256 + datadht[3]);
if (datadht[2] & 0x80) clientnf.temperature_Sensor *= -1;
}
#else
if (datadht[1]==0 && datadht[3]==0) {
// dht11
clientnf.temperature_Sensor=datadht[2];
clientnf.Humidity_Sensor=datadht[0];
}else { // dht22
clientnf.Humidity_Sensor = (float)(datadht[0] * 256 + datadht[1])/10;
clientnf.temperature_Sensor = (float)((datadht[2] & 0x7F)* 256 + datadht[3])/10;
if (datadht[2] & 0x80) clientnf.temperature_Sensor *= -1;
}
#endif
} else {/* обработка ошибки:ошибка CRC */}
#else
gpio_pin_configure(POWER_PIN, // укажем необходимые параметры
GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT |
GPIO_PIN_CONFIG_OPTION_OUTPUT_VAL_CLEAR |
GPIO_PIN_CONFIG_OPTION_PIN_MODE_OUTPUT_BUFFER_NORMAL_DRIVE_STRENGTH);
gpio_pin_val_set(POWER_PIN);
delay_ms(2000);
gpio_pin_val_clear(DSPIN);
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_INPUT);
OneWireReset();
OneWireOutByte(0xcc);
OneWireOutByte(0x44);
//strong
gpio_pin_val_set(DSPIN);
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT);
//delay_ms(1000);
gpio_pin_configure(DSPIN, GPIO_PIN_CONFIG_OPTION_DIR_INPUT);
gpio_pin_val_clear(DSPIN);
OneWireReset();
OneWireOutByte(0xcc);
OneWireOutByte(0xbe);
gpio_pin_val_clear(POWER_PIN);
DSdata[0] = OneWireInByte();
DSdata[1] = OneWireInByte();
TReading = (int)(DSdata[1] << 8) + DSdata[0];
SignBit = TReading & 0x8000;
if (SignBit) TReading = (TReading ^ 0xffff) + 1;
#if nofloat
clientnf.temperature_Sensor =(int)((6 * TReading) + TReading / 4)/100;
#else
clientnf.temperature_Sensor =(float)((6 * TReading) + TReading / 4)/100;
#endif
#endif
adc_power_up();
rf_power_up(1);
rf_write_tx_payload((const uint8_t*)&clientnf, 32, true); //transmit received char over RF
//wait until the packet has been sent or the maximum number of retries has been reached
while(!(rf_irq_pin_active() && rf_irq_tx_ds_active()));
//disconnectGPIO();
rf_irq_clear_all();
rf_power_down();
sleep_counter=0;
//rtc2_run();
//watchdog_set_wdsv_count(WD_SAFE);
//pwr_clk_mgmt_close_retention_latches();
pwr_clk_mgmt_enter_pwr_mode_memory_ret_tmr_on();
}
С dht22 проблем yнет