ТЕСТОВЫЙ СКЕТЧ КОНТРОЛЯ ПОНИЖЕННОГО ЭНЕРГОПОТРЕБЛЕНИЯ В РЕЖИМЕ СНА С ПРЕРЫВАНИЯМИ ДЛЯ nRF5

О программировании Arduino, использование библиотек, примеры и общие вопросы программирования.
Ответить
Berk
Сообщения: 57
Зарегистрирован: 11 окт 2017, 22:05

ТЕСТОВЫЙ СКЕТЧ КОНТРОЛЯ ПОНИЖЕННОГО ЭНЕРГОПОТРЕБЛЕНИЯ В РЕЖИМЕ СНА С ПРЕРЫВАНИЯМИ ДЛЯ nRF5

Сообщение Berk » 25 фев 2019, 15:18

https://youtu.be/vcou4tGG4dE

Код: Выделить всё

/**
ТЕСТОВЫЙ СКЕТЧ КОНТРОЛЯ ПОНИЖЕННОГО ЭНЕРГОПОТРЕБЛЕНИЯ В РЕЖИМЕ СНА С ПРЕРЫВАНИЯМИ

После загрузки скетча рекомендуется сбросить питание с модуля.
*/

#define MY_RADIO_NRF5_ESB
#define MY_PASSIVE_NODE
#define MY_NODE_ID 100
#define MY_LED 27
#define MY_BUTTON_ADC_PIN 1 // номер пина АЦП смотреть в MyBoardNRF5.cpp
#include <MySensors.h>
bool detection;

void preHwInit() {
pinMode(MY_LED, OUTPUT);  
}

void before()
{
NRF_POWER->DCDCEN = 1; // закоментировать если E73
NRF_UART0->ENABLE = 0;  
}

void setup() {
  analogReference(AR_DEFAULT);
  lpComp();
  led(2,1);
  detection = false;
  wait(5000);
}

void loop() {
  sleep(10000);
  if (detection) {
    s_lpComp();
    led(10,3);
    detection=false;
    NRF_LPCOMP->EVENTS_UP=0;
    r_lpComp();
  } else {
    led(1,1);
  }
}


void led(uint8_t flash, uint8_t iteration) {
  for (int x = 0; x < iteration; x++) {
    for (int i=0; i < flash; i++) {
      digitalWrite(MY_LED, HIGH);
      wait(30);
      digitalWrite(MY_LED, LOW);
      wait(70);
    }    
      wait(500);
  }
}

void lpComp() {
  NRF_LPCOMP->PSEL=MY_BUTTON_ADC_PIN;
  NRF_LPCOMP->ANADETECT=1; // детектирование EVENTS_UP.
  NRF_LPCOMP->INTENSET=B0100; // активация прерывания для EVENTS_UP
  NRF_LPCOMP->ENABLE=1;
  NRF_LPCOMP->TASKS_START=1;
  NVIC_SetPriority(LPCOMP_IRQn, 15);
  NVIC_ClearPendingIRQ(LPCOMP_IRQn);
  NVIC_EnableIRQ(LPCOMP_IRQn);
}

void s_lpComp() {
  if ((NRF_LPCOMP->ENABLE) && (NRF_LPCOMP->EVENTS_READY)) {
    NRF_LPCOMP->INTENCLR=B0100; //деактивация прерывания для LPCOMP
  }
}

void r_lpComp() {
  NRF_LPCOMP->INTENSET=B0100;
}

#if __CORTEX_M == 0x04
#define NRF5_RESET_EVENT(event)                                                 \
        event = 0;                                                                   \
        (void)event
#else
#define NRF5_RESET_EVENT(event) event = 0
#endif

//В одну строку..
extern "C" { void LPCOMP_IRQHandler(void) {detection=true; NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_UP); NRF_LPCOMP->EVENTS_UP=0; MY_HW_RTC->CC[0]=(MY_HW_RTC->COUNTER+2);}}
Последний раз редактировалось Berk 07 июл 2019, 19:21, всего редактировалось 1 раз.

Berk
Сообщения: 57
Зарегистрирован: 11 окт 2017, 22:05

Re: ТЕСТОВЫЙ СКЕТЧ КОНТРОЛЯ ПОНИЖЕННОГО ЭНЕРГОПОТРЕБЛЕНИЯ В РЕЖИМЕ СНА С ПРЕРЫВАНИЯМИ ДЛЯ nRF5

Сообщение Berk » 07 июл 2019, 13:27

Проверочная "шляпа" для nrf51822 - Тест прерываний на любом пине gpio, тест прерывания через LPCOMP (AIN2-AIN7)

Видосик - https://youtu.be/EQ-yw1gGC0A

Тестовая прожка

Код: Выделить всё

#define MY_RADIO_NRF5_ESB
#define MY_PASSIVE_NODE
#define MY_NODE_ID 9
#define MY_LED 22
#define MY_BUTTON_ADC_PIN 7 // номер пина АЦП смотреть в MyBoardNRF5.cpp
#define MY_BUTTON_PIN (MY_BUTTON_ADC_PIN - 1)  //this is the same pin number MY_BUTTON_ADC_PIN, see the pins table above (only nrf51, I think so)

//############## NRF51 ################
//p0.01 - AIN2
//p0.02 - AIN3
//p0.03 - AIN4
//p0.04 - AIN5
//p0.05 - AIN6
//p0.06 - AIN7
//############## NRF51 ################


#include <MySensors.h>
int8_t  detection;

void preHwInit() {
  pinMode(MY_LED, OUTPUT);
  pinMode(MY_BUTTON_PIN, INPUT_PULLUP);
  digitalWrite(MY_LED, LOW);
}

void before()
{
  NRF_POWER->DCDCEN = 1; // закоментировать если E73
  NRF_UART0->ENABLE = 0;
}

void setup() {
  analogReference(AR_DEFAULT);
  lpComp();  // if y use lpcomp interrupt
  led(2, 1);
  detection = 0;
  wait(3000);
}

void loop() {


/*
  detection = sleep(digitalPinToInterrupt(MY_BUTTON_PIN), FALLING, 3600000, false);
  if (detection == MY_BUTTON_PIN) {
    led(10, 3);
  }
  if (detection == -1) {
    led(1, 1);
  }
*/


  sleep(3600000);
  if (detection == 1) {
    s_lpComp();
    led(10, 3);
    detection = 0;
    NRF_LPCOMP->EVENTS_DOWN = 0;
    r_lpComp();
  } else {
    led(1, 1);
  }

  
}


void led(uint8_t flash, uint8_t iteration) {
  for (int x = 0; x < iteration; x++) {
    for (int i = 0; i < flash; i++) {
      digitalWrite(MY_LED, HIGH);
      wait(30);
      digitalWrite(MY_LED, LOW);
      wait(70);
    }
    wait(500);
  }
}

void lpComp() {
  NRF_LPCOMP->PSEL = MY_BUTTON_ADC_PIN;
  NRF_LPCOMP->ANADETECT = 2; // детектирование EVENTS_DOWN.
  //ANADETECT=0; // детектирование EVENTS_CROSS.
  //ANADETECT=1; // детектирование EVENTS_UP.
  //ANADETECT=2; // детектирование EVENTS_DOWN.
  NRF_LPCOMP->INTENSET = B0010; // активация прерывания для EVENTS_DOWN
  //B1000; // прерываниt для EVENTS_CROSS
  //B0100; // прерываниt для EVENTS_UP
  //B0010; // прерываниt для EVENTS_DOWN
  NRF_LPCOMP->ENABLE = 1;
  NRF_LPCOMP->TASKS_START = 1;
  NVIC_SetPriority(LPCOMP_IRQn, 15);
  NVIC_ClearPendingIRQ(LPCOMP_IRQn);
  NVIC_EnableIRQ(LPCOMP_IRQn);
}

void s_lpComp() {
  if ((NRF_LPCOMP->ENABLE) && (NRF_LPCOMP->EVENTS_READY)) {
    NRF_LPCOMP->INTENCLR = B0010; //деактивация прерывания для LPCOMP
  }
}

void r_lpComp() {
  NRF_LPCOMP->INTENSET = B0010;
}

#if __CORTEX_M == 0x04
#define NRF5_RESET_EVENT(event)                                                 \
  event = 0;                                                                   \
  (void)event
#else
#define NRF5_RESET_EVENT(event) event = 0
#endif

extern "C" {
  void LPCOMP_IRQHandler(void) {
    detection = 1;
    NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_DOWN);
    NRF_LPCOMP->EVENTS_DOWN = 0;
    MY_HW_RTC->CC[0] = (MY_HW_RTC->COUNTER + 2);
  }
}

Ответить