Ключевое ?лово

vk

Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
Железо для умного дома

ТЕМА: Прошивка NRF24le1

Прошивка NRF24le1 17 Авг 2017 16:19 #19472

  • fixxxer
  • fixxxer аватар
  • Не в сети
  • Новый участник
  • Сообщений: 11
  • Спасибо получено: 3
  • Репутация: 1
Adminhs пишет:
Код дать не могу - там он генерируется на лету, а вот пример как хранить данные в спящем режиме подскажу:

Объявляем переменную как __xdata __at(0x0100) unsigned int countsleep ;

Следующий адрес прибавляем в зависимости от размера переменной.
Спасибо, с этим разобрались.

Уважаемый Adminhs, не прокомментируете по возможности пост #19464?
Последнее редактирование: 17 Авг 2017 16:20 от fixxxer.
Администратор запретил публиковать записи гостям.

Прошивка NRF24le1 17 Авг 2017 16:22 #19473

  • Adminhs
  • Adminhs аватар
  • Не в сети
  • Администратор
  • Сообщений: 7195
  • Спасибо получено: 1114
  • Репутация: 194
Я года 3 не занимался этим чипом и уже не помню все что есть в даташите...
Основной канал проекта в Telegram t.me/wifi_iot
Администратор запретил публиковать записи гостям.

Прошивка NRF24le1 17 Авг 2017 16:23 #19474

  • loginkr
  • loginkr аватар
  • Не в сети
  • Осваиваюсь на форуме
  • Сообщений: 24
  • Спасибо получено: 1
  • Репутация: 0
fixxxer, можете поделиться кодом для вашего датчика ?
Администратор запретил публиковать записи гостям.

Прошивка NRF24le1 17 Авг 2017 16:35 #19475

  • fixxxer
  • fixxxer аватар
  • Не в сети
  • Новый участник
  • Сообщений: 11
  • Спасибо получено: 3
  • Репутация: 1
loginkr пишет:
fixxxer, можете поделиться кодом для вашего датчика ?
Могу неким промежуточным вариантом, так как окончательный искать надо. Вроде бы вполне рабочий. Можно раскомментировать DEBUG - тогда будет выводить некоторую отладочную информацию в последовательный порт.
//#define DEBUG //enable or disable debugging on serial port 38400 8n1
#define DEVICE_ID 1 //Device ID, uint8_t
#define INTERVAL 15 //sensor update interval
#define RF_CHANNEL 70 //channel number 0-126
#define RF_AUTOACK //Enable or disable autoAck
#define RF_DATARATE DR_1M //data rate - DR_250K, DR_1M or DR_2M
#define RF_RETRDELAY 10 //autoretries delay in 250mkSeconds
#define RF_RETRCOUNT 10 //autoRetries count
#define RF_CRC CRC16 //CRC - CRC8, CRC16 or OFF
#define RF_ADDR0 0xAA
#define RF_ADDR1 0x0E
#define RF_ADDR2 0x0E
#define RF_ADDR3 0x0E
#define RF_ADDR4 0x0E

#include <stdint.h>
#include <stdio.h>
#include "delay.h"
#include "gpio.h"
#include "rf.h"
#include "watchdog.h"
#include "pwr_clk_mgmt.h"
#include "rtc2.h"
#ifdef DEBUG
#include "uart_int.h"
#include "uart.h"
#endif

#define _BV(bit) (1 << (bit))
#define RF_DR_LOW   5
#define RF_DR_HIGH  3
#define RF_EN_CRC  3
#define RF_CRCO    2
#define PWR_UP  1
#define RF_PWR_LOW  1
#define RF_PWR_HIGH 2
#define RF_ERX_P0   0
#define WD_SAFE watchdog_calc_timeout_from_sec(5)


#define LEDPIN GPIO_PIN_ID_P0_0
#define DHTPIN GPIO_PIN_ID_P1_4

uint8_t datadht[5];

uint8_t dhtread () {
  uint8_t j = 0, i = 0;
  datadht[0] = datadht[1] = datadht[2] = datadht[3] = datadht[4] = 0;
  gpio_pin_configure(DHTPIN, GPIO_PIN_CONFIG_OPTION_DIR_OUTPUT);
  delay_ms(18);
  gpio_pin_val_set(DHTPIN);
  gpio_pin_configure(DHTPIN,GPIO_PIN_CONFIG_OPTION_DIR_INPUT);
  delay_us(51);
  if (gpio_pin_val_read(DHTPIN)) return 0;
  delay_us(81);
  if (!gpio_pin_val_read(DHTPIN)) return 0;
  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;
}

void main() {
  uint8_t tmp,pipeAddr[5];
__xdata __at(0x0100) uint8_t sleepCnt;
__xdata __at(0x0101) unsigned long pktCnt;
struct rfPacket_t {
    uint8_t deviceId;
    uint8_t powerLow;
    int errorCode;
    unsigned long packetCount;
    float temp;
    float hum;
} rfPacket;
#ifdef DEBUG
  uint8_t tmpVal=0, tmpArr[5];
#endif

  pwr_clk_mgmt_open_retention_latches();
  watchdog_setup();
  watchdog_set_wdsv_count(WD_SAFE);
  rtc2_configure(RTC2_CONFIG_OPTION_COMPARE_MODE_0_RESET_AT_IRQ ,65535); //65535=2 сек, 32767=1 сек
  pwr_clk_mgmt_wakeup_sources_configure(PWR_CLK_MGMT_WAKEUP_CONFIG_OPTION_WAKEUP_ON_RTC2_TICK_ALWAYS);
  pwr_clk_mgmt_pwr_failure_configure(PWR_CLK_MGMT_PWR_FAILURE_CONFIG_OPTION_POF_ENABLE|PWR_CLK_MGMT_PWR_FAILURE_CONFIG_OPTION_POF_THRESHOLD_2_3V);
  interrupt_control_global_enable();
#ifdef DEBUG
  uart_int_init();
  uart_rx_disable();
#endif
  if ((PWRDWN&0x7)==0x3) {
#ifdef DEBUG
    printf("\n**** Waked up, cycle #%d\n",sleepCnt);
    delay_ms(7);
    printf("PWRDWN=0x%02X\n",PWRDWN);
    printf("RSTREAS=0x%02X\n",RSTREAS);
    delay_ms(10);
#endif
    PWRDWN=0x0;
    RSTREAS=0x0;
    if (sleepCnt<(INTERVAL/2)) {
      sleepCnt++;
#ifdef DEBUG
      puts("Will sleep again");
      delay_ms(5);
#endif
      rtc2_run();
      watchdog_set_wdsv_count(WD_SAFE);
      pwr_clk_mgmt_close_retention_latches();
      pwr_clk_mgmt_enter_pwr_mode_memory_ret_tmr_on();
    }
    rfPacket.packetCount=++pktCnt;
  } else {
#ifdef DEBUG
    puts("\n**** Started up");
    printf("PWRDWN=0x%02X\n",PWRDWN);
    printf("RSTREAS=0x%02X\n",RSTREAS);
    delay_ms(14);
#endif
    pktCnt=0;
    rfPacket.packetCount=0;
  }
#ifdef DEBUG
  gpio_pin_configure(LEDPIN,
	    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(LEDPIN);
#endif
  rfPacket.deviceId=DEVICE_ID;
  rfPacket.packetCount=0;
  rfPacket.temp=0;
  rfPacket.hum=0;
  if (pwr_clk_mgmt_was_prev_reset_watchdog(pwr_clk_mgmt_get_reset_reason())) rfPacket.errorCode=128; else rfPacket.errorCode=0;
  RSTREAS=0x0;
  rf_spi_configure_enable();
  tmp=16*RF_RETRDELAY+RF_RETRCOUNT;
  rf_write_register(RF_SETUP_RETR,&tmp,1);    
  tmp=RF_CHANNEL;
  rf_write_register(RF_RF_CH,&tmp,1);
  rf_read_register(RF_RF_SETUP,&tmp,1);
  #if RF_DATARATE==DR_250k
    tmp|=_BV(RF_DR_LOW);
  #elif RF_DATARATE==DR_1M
    tmp&= ~(_BV(RF_DR_LOW)|_BV(RF_DR_HIGH));
  #else
    tmp |=_BV(RF_DR_HIGH);
  #endif
  tmp&=~(_BV(RF_PWR_LOW)|_BV(RF_PWR_HIGH));
  #if RF_POWER==MAX
    tmp|=(3<<RF_PWR_LOW);
  #elif RF_POWER==HIGH
    tmp|=(2<<RF_PWR_LOW);
  #elif RF_POWER==LOW
    tmp|=(1<<RF_PWR_LOW);
  #endif
  rf_write_register(RF_RF_SETUP,&tmp,1);
  #ifdef RF_AUTOACK
    tmp=63;
  #else
    tmp=0;
  #endif
  rf_write_register(RF_EN_AA,&tmp,1);
  rf_read_register(RF_CONFIG,&tmp,1);
  tmp&=~(_BV(RF_CRCO)|_BV(RF_EN_CRC));
  #if RF_CRC==CRC8
    tmp|=_BV(RF_EN_CRC);
  #elif RF_CRC==CRC16
    tmp|=(_BV(RF_EN_CRC)|_BV(RF_CRCO));
  #endif
  rf_write_register(RF_CONFIG,&tmp,1);
  pipeAddr[0]=RF_ADDR0;
  pipeAddr[1]=RF_ADDR1;
  pipeAddr[2]=RF_ADDR2;
  pipeAddr[3]=RF_ADDR3;
  pipeAddr[4]=RF_ADDR4;
  tmp=32;
  rf_write_register(RF_RX_ADDR_P0,pipeAddr,5);
  rf_write_register(RF_TX_ADDR,pipeAddr,5);
  rf_write_register(RF_RX_PW_P0,&tmp,1);
  rf_power_up(false);
  rf_set_as_tx();
  delay_us(150);

#ifdef DEBUG
  puts("RF register dump:");
  delay_ms(5);
  for(tmp=0;tmp<=0x17;tmp++) {
   if ((tmp!=RF_RX_ADDR_P0)&&(tmp!=RF_RX_ADDR_P1)&&(tmp!=RF_TX_ADDR)) {
     rf_read_register(tmp,&tmpVal,1);
     printf("0x%02X=0x%02X\n",tmp,tmpVal);
     delay_ms(3);
   } else {
     rf_read_register(tmp,tmpArr,5);
     printf("0x%02X=0x%02X,0x%02X,0x%02X,0x%02X,0x%02X\n",tmp,tmpArr[0],tmpArr[1],tmpArr[2],tmpArr[3],tmpArr[4]);
     delay_ms(12);
   }
  }
  rf_read_register(RF_FEATURE,&tmp,1);
  printf("0x1C=0x%02X\n",tmp,tmpVal);
  rf_read_register(RF_DYNPD,&tmp,1);
  printf("0x1D=0x%02X\n",tmp,tmpVal);
  delay_ms(14);
#endif

  if (pwr_clk_mgmt_is_vdd_below_bor_threshold()) rfPacket.powerLow=1; else rfPacket.powerLow=0;
  if (dhtread()) {
    if (datadht[1]==0 && datadht[3]==0) { // dht11
      rfPacket.hum=datadht[2];
      rfPacket.temp=datadht[0];
    } else  { // dht22
      rfPacket.hum = (float)(datadht[0] * 256 + datadht[1])/10;
      rfPacket.temp = (float)((datadht[2] & 0x7F)* 256 + datadht[3])/10;
      if (datadht[2] & 0x80)  rfPacket.temp *= -1;
    }
  } else {
    rfPacket.errorCode|=0x1;
    rfPacket.temp=-273;
    rfPacket.hum=111;
  }

#ifdef DEBUG
  gpio_pin_val_clear(LEDPIN);
  printf("\nPKT Id=%u,cnt=%u,err=%d,temp=%d,hum=%d,pwr=%u\n",rfPacket.deviceId,rfPacket.packetCount,rfPacket.errorCode,(int)rfPacket.temp,(int)rfPacket.hum,rfPacket.powerLow);
  delay_ms(20);
  puts("RF register dump:");
  for(tmp=0;tmp<=0x17;tmp++) {
   if ((tmp!=RF_RX_ADDR_P0)&&(tmp!=RF_RX_ADDR_P1)&&(tmp!=RF_TX_ADDR)) {
     rf_read_register(tmp,&tmpVal,1);
     delay_ms(5);
     printf("0x%02X=0x%02X\n",tmp,tmpVal);
   } else {
     rf_read_register(tmp,tmpArr,5);
     printf("0x%02X=0x%02X,0x%02X,0x%02X,0x%02X,0x%02X\n",tmp,tmpArr[0],tmpArr[1],tmpArr[2],tmpArr[3],tmpArr[4]);
     delay_ms(5);
   }
  }
  rf_read_register(RF_FEATURE,&tmp,1);
  printf("0x1C=0x%02X\n",tmp,tmpVal);
  rf_read_register(RF_DYNPD,&tmp,1);
  printf("0x1D=0x%02X\n",tmp,tmpVal);
  puts("Sleeping");
  delay_ms(14);
#endif

  rf_write_tx_payload((const uint8_t*) &rfPacket, sizeof(rfPacket), true);
  rf_read_register(RF_EN_AA,&tmp,1);
  while((!((tmp&0xF)&&rf_irq_max_rt_active()))&&(!(rf_irq_pin_active() && rf_irq_tx_ds_active())));
  rf_irq_clear_all();
  rf_power_down();
  sleepCnt=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();
}
Администратор запретил публиковать записи гостям.
Спасибо сказали: Andrey_T

Прошивка NRF24le1 17 Авг 2017 16:36 #19476

  • fixxxer
  • fixxxer аватар
  • Не в сети
  • Новый участник
  • Сообщений: 11
  • Спасибо получено: 3
  • Репутация: 1
Adminhs пишет:
Я года 3 не занимался этим чипом и уже не помню все что есть в даташите...
А что сейчас актуально для постройки мелких датчиков с батарейным питанием?
Администратор запретил публиковать записи гостям.

Прошивка NRF24le1 17 Авг 2017 16:38 #19477

  • Adminhs
  • Adminhs аватар
  • Не в сети
  • Администратор
  • Сообщений: 7195
  • Спасибо получено: 1114
  • Репутация: 194
Народ использует RCswitch и VirtualWire на частотах 433.
Основной канал проекта в Telegram t.me/wifi_iot
Администратор запретил публиковать записи гостям.
Модераторы: FlyRouter
Время создания страницы: 0.168 секунд

Home`s Smart © 2013-2016. г.Киров.
Цитирование материалов возможно только со ссылкой на сайт. Использование фотоматериалов только с разрешения авторов.