Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. My Project
  3. nRF5 action!

nRF5 action!

Scheduled Pinned Locked Moved My Project
1.9k Posts 49 Posters 630.9k Views 44 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • NeverDieN Offline
    NeverDieN Offline
    NeverDie
    Hero Member
    wrote on last edited by
    #1197

    Of course, I couldn't stop until I tried hooking it up to the 4w boost amplifier:
    0_1508445375879_RFaxis4.jpg
    Wow! That really kicks tail. I don't think there's a nook or cranny anywhere that I don't get a great signal now, and all from a single gateway. :)

    1 Reply Last reply
    1
    • NeverDieN Offline
      NeverDieN Offline
      NeverDie
      Hero Member
      wrote on last edited by
      #1198

      I just now ordered a number of Fanstel modules to go with the breakout boards I recently posted. It's worth noting that Fanstel's lowest cost nRF52832 module is only $3.75, which is lower than the Ebyte module: http://www.fanstel.com/buy/bt832-ble42-hardware-ready-for-bluetooth-5-module-2fhya
      I ordered one, and I'll see how it compares in actual use.

      scalzS Nca78N 2 Replies Last reply
      0
      • NeverDieN NeverDie

        I just now ordered a number of Fanstel modules to go with the breakout boards I recently posted. It's worth noting that Fanstel's lowest cost nRF52832 module is only $3.75, which is lower than the Ebyte module: http://www.fanstel.com/buy/bt832-ble42-hardware-ready-for-bluetooth-5-module-2fhya
        I ordered one, and I'll see how it compares in actual use.

        scalzS Offline
        scalzS Offline
        scalz
        Hardware Contributor
        wrote on last edited by scalz
        #1199

        @NeverDie said in nRF5 Bluetooth action!:

        It's worth noting that Fanstel's lowest cost nRF52832 module is only $3.75, which is lower than the Ebyte module: http://www.fanstel.com/buy/bt832-ble42-hardware-ready-for-bluetooth-5-module-2fhya

        interesting for US customers only I think. Because last time I looked, shipping were too expensive (plus add extra shipping fee like customs etc.).

        1 Reply Last reply
        1
        • NeverDieN NeverDie

          I just now ordered a number of Fanstel modules to go with the breakout boards I recently posted. It's worth noting that Fanstel's lowest cost nRF52832 module is only $3.75, which is lower than the Ebyte module: http://www.fanstel.com/buy/bt832-ble42-hardware-ready-for-bluetooth-5-module-2fhya
          I ordered one, and I'll see how it compares in actual use.

          Nca78N Offline
          Nca78N Offline
          Nca78
          Hardware Contributor
          wrote on last edited by
          #1200

          @NeverDie said in nRF5 Bluetooth action!:

          It's worth noting that Fanstel's lowest cost nRF52832 module is only $3.75, which is lower than the Ebyte module: http://www.fanstel.com/buy/bt832-ble42-hardware-ready-for-bluetooth-5-module-2fhya
          I ordered one, and I'll see how it compares in actual use.
          It's woth noting that despite it's "832" name it's in fact an nrf52810 :P

          @scalz said in nRF5 Bluetooth action!:

          interesting for US customers only I think. Because last time I looked, shipping were too expensive (plus add extra shipping fee like customs etc.).
          43$ shipping if you're not in the US. And with DHL meaning (at least for me) 10 extra dollars of DHL fee for custom processing + highest tax possible.

          NeverDieN 1 Reply Last reply
          0
          • NeverDieN Offline
            NeverDieN Offline
            NeverDie
            Hero Member
            wrote on last edited by
            #1201

            What are the pin assignments when you have one linear list of pin names next to a double row of pins? In this case: https://www.aliexpress.com/item-img/NRF51822-pa-Bluetooth-module-external-antenna-module-column-industrial-self-timer-heart-rate-meter/32815682890.html?spm=2114.10010108.1000017.2.35e823afSFYACg

            1 Reply Last reply
            0
            • Nca78N Nca78

              @NeverDie said in nRF5 Bluetooth action!:

              It's worth noting that Fanstel's lowest cost nRF52832 module is only $3.75, which is lower than the Ebyte module: http://www.fanstel.com/buy/bt832-ble42-hardware-ready-for-bluetooth-5-module-2fhya
              I ordered one, and I'll see how it compares in actual use.
              It's woth noting that despite it's "832" name it's in fact an nrf52810 :P

              @scalz said in nRF5 Bluetooth action!:

              interesting for US customers only I think. Because last time I looked, shipping were too expensive (plus add extra shipping fee like customs etc.).
              43$ shipping if you're not in the US. And with DHL meaning (at least for me) 10 extra dollars of DHL fee for custom processing + highest tax possible.

              NeverDieN Offline
              NeverDieN Offline
              NeverDie
              Hero Member
              wrote on last edited by NeverDie
              #1202

              It's too bad Fanstel's shipping rates outside the US are high. I received the modules I ordered from Fanstel in just a couple of days. I'll try them out after I receive the PCB's from OSH PARK, which should happen in about another 1-2 weeks. The pinout for Fanstel's "micro" version (BC832) is different, and obviously the land pattern is much smaller, so I just now did a separate breakout board for it and sent it to the fab.

              I'm trying to think now as to whether I'll have any future need for nRF24L01's. The very small and cheap nRF51822 seems to supplant it now with its 4dbm higher Tx power, and the nRF52 affords lower current consumption while in Tx or Rx, because of its DCDC option.

              T 1 Reply Last reply
              0
              • NeverDieN Offline
                NeverDieN Offline
                NeverDie
                Hero Member
                wrote on last edited by NeverDie
                #1203

                @d00616 Is it still the case that we're limited to a single interrupt? For instance, I'd like to put the nRF52832 to wake-up periodically as a heartbeat where it reports its battery level, and I also want it to wake-up if a particular pin goes HIGH (e.g. if a PIR sensor is triggered). Presently I'm using the RTC to provide the one interrupt, and I use the PPI to create an RTC interrupt if it detects that the PIR sensor pin has gone HIGH. Then the interrupt code must determine the true cause of the interrupt. It would be cleaner if I could separate them into separate interrupts. This is just a simple example to explain what I mean by the question.

                d00616D 1 Reply Last reply
                0
                • NeverDieN NeverDie

                  It's too bad Fanstel's shipping rates outside the US are high. I received the modules I ordered from Fanstel in just a couple of days. I'll try them out after I receive the PCB's from OSH PARK, which should happen in about another 1-2 weeks. The pinout for Fanstel's "micro" version (BC832) is different, and obviously the land pattern is much smaller, so I just now did a separate breakout board for it and sent it to the fab.

                  I'm trying to think now as to whether I'll have any future need for nRF24L01's. The very small and cheap nRF51822 seems to supplant it now with its 4dbm higher Tx power, and the nRF52 affords lower current consumption while in Tx or Rx, because of its DCDC option.

                  T Offline
                  T Offline
                  Toyman
                  wrote on last edited by
                  #1204

                  @NeverDie said in nRF5 Bluetooth action!:

                  It's too bad Fanstel's shipping rates outside the US are high

                  No issue for me as I am a using a mail forwarder(s) and I can highly recommend them to others. Bringing nrf52Dk from Arrow to Russia costed me $10 (inter-US shipping is free at Arrow).
                  I am considering switching to Fanstel modules completely, especially to their PA+LNA ones

                  Nca78N 1 Reply Last reply
                  0
                  • NeverDieN NeverDie

                    @d00616 Is it still the case that we're limited to a single interrupt? For instance, I'd like to put the nRF52832 to wake-up periodically as a heartbeat where it reports its battery level, and I also want it to wake-up if a particular pin goes HIGH (e.g. if a PIR sensor is triggered). Presently I'm using the RTC to provide the one interrupt, and I use the PPI to create an RTC interrupt if it detects that the PIR sensor pin has gone HIGH. Then the interrupt code must determine the true cause of the interrupt. It would be cleaner if I could separate them into separate interrupts. This is just a simple example to explain what I mean by the question.

                    d00616D Offline
                    d00616D Offline
                    d00616
                    Contest Winner
                    wrote on last edited by
                    #1205

                    @NeverDie said in nRF5 Bluetooth action!:

                    @d00616 Is it still the case that we're limited to a single interrupt? For instance, I'd like to put the nRF52832 to wake-up periodically as a heartbeat where it reports its battery level, and I also want it to wake-up if a particular pin goes HIGH (e.g. if a PIR sensor is triggered). Presently I'm using the RTC to provide the one interrupt, and I use the PPI to create an RTC interrupt if it detects that the PIR sensor pin has gone HIGH. Then the interrupt code must determine the true cause of the interrupt. It would be cleaner if I could separate them into separate interrupts.

                    You can wake up the MCU via:

                    • GPIO pin sense; used for sleep()
                    • GPIOTE; consumes less engergy but pin must be dedected in software (0.1µA-0.5µA)
                    • LPCOMP (0.5µA)
                    • QDEC (5µA)

                    The interrupts for LPCOMP and QDEC are not allocated by the arduino-port. I think the LPCOMP is a good point to start with.

                    NeverDieN 1 Reply Last reply
                    1
                    • T Toyman

                      @NeverDie said in nRF5 Bluetooth action!:

                      It's too bad Fanstel's shipping rates outside the US are high

                      No issue for me as I am a using a mail forwarder(s) and I can highly recommend them to others. Bringing nrf52Dk from Arrow to Russia costed me $10 (inter-US shipping is free at Arrow).
                      I am considering switching to Fanstel modules completely, especially to their PA+LNA ones

                      Nca78N Offline
                      Nca78N Offline
                      Nca78
                      Hardware Contributor
                      wrote on last edited by
                      #1206

                      @Toyman said in nRF5 Bluetooth action!:

                      Bringing nrf52Dk from Arrow to Russia costed me $10 (inter-US shipping is free at Arrow).

                      Do they ask you for shipment fee directly to Russia ?
                      I'm in Vietnam and bringing nrf52DK from Arrow was free, like everything I order from them, and over US$20 it's even express shipment (By the way they have a 25% flash sale right now !)

                      I'm interested on info on your mail forwarder if it's not only for Russia.

                      T 1 Reply Last reply
                      0
                      • Nca78N Nca78

                        @Toyman said in nRF5 Bluetooth action!:

                        Bringing nrf52Dk from Arrow to Russia costed me $10 (inter-US shipping is free at Arrow).

                        Do they ask you for shipment fee directly to Russia ?
                        I'm in Vietnam and bringing nrf52DK from Arrow was free, like everything I order from them, and over US$20 it's even express shipment (By the way they have a 25% flash sale right now !)

                        I'm interested on info on your mail forwarder if it's not only for Russia.

                        T Offline
                        T Offline
                        Toyman
                        wrote on last edited by
                        #1207

                        @Nca78 Arrow ships free to Russia, but only to companies, not to direct consumers this is linked to the fact they use couriers (DHL/Fedex) and not vanilla USPS.
                        Have a look at www.shipito.com, it's not the one I am currently using, but Shipito works with the whole world. Pricing might be a bit steep, but I haven't looked at it for a long time.

                        1 Reply Last reply
                        1
                        • T Offline
                          T Offline
                          Toyman
                          wrote on last edited by
                          #1208

                          http://blog.nordicsemi.com/getconnected/power-consumption-explained?utm_campaign=Blog update notifications&utm_source=hs_email&utm_medium=email&utm_content=57717514&_hsenc=p2ANqtz-9HxcPCGqL9z_8UZBj38TZu8vg-vE-JmEgmzOlt-uiiGj32PO4Vm0brgVaCxtEly5tGV5aioj1vJezIbGK_-xZVXV6zxQ&_hsmi=57717514

                          1 Reply Last reply
                          0
                          • O Offline
                            O Offline
                            Omemanti
                            wrote on last edited by Omemanti
                            #1209

                            Had the nrf52dk shipped from arrow to the Netherlands. Because it was above 22 euro( something like that) DHL had to let it apply tax and some administration cost.

                            The board costed 28 euro(inc shipping). The tax office estimate was that is was around 120 euro??? so they charged me a little to much. I filled in some forms to get some of the taxes back.

                            When the board arrived I had to pay DHL 43 euro . So getting it though customes cost more than the board itself. 😏

                            Nca78N 1 Reply Last reply
                            0
                            • O Omemanti

                              Had the nrf52dk shipped from arrow to the Netherlands. Because it was above 22 euro( something like that) DHL had to let it apply tax and some administration cost.

                              The board costed 28 euro(inc shipping). The tax office estimate was that is was around 120 euro??? so they charged me a little to much. I filled in some forms to get some of the taxes back.

                              When the board arrived I had to pay DHL 43 euro . So getting it though customes cost more than the board itself. 😏

                              Nca78N Offline
                              Nca78N Offline
                              Nca78
                              Hardware Contributor
                              wrote on last edited by
                              #1210

                              @Omemanti said in nRF5 Bluetooth action!:

                              When the board arrived I had to pay DHL 43 euro .
                              DHL is selling it's shipment service cheaper to shops so the cost seems interesting for buyer. But their trick is to force you to pay some "service fee" when you receive your parcel in addition to custom taxes. This is borderline scam IMHO as this fee is mandatory and has a fixed value for each destination country, so DHL should include it upfront when customer orders.
                              No more DHL shipment for me.

                              1 Reply Last reply
                              0
                              • d00616D d00616

                                @NeverDie said in nRF5 Bluetooth action!:

                                @d00616 Is it still the case that we're limited to a single interrupt? For instance, I'd like to put the nRF52832 to wake-up periodically as a heartbeat where it reports its battery level, and I also want it to wake-up if a particular pin goes HIGH (e.g. if a PIR sensor is triggered). Presently I'm using the RTC to provide the one interrupt, and I use the PPI to create an RTC interrupt if it detects that the PIR sensor pin has gone HIGH. Then the interrupt code must determine the true cause of the interrupt. It would be cleaner if I could separate them into separate interrupts.

                                You can wake up the MCU via:

                                • GPIO pin sense; used for sleep()
                                • GPIOTE; consumes less engergy but pin must be dedected in software (0.1µA-0.5µA)
                                • LPCOMP (0.5µA)
                                • QDEC (5µA)

                                The interrupts for LPCOMP and QDEC are not allocated by the arduino-port. I think the LPCOMP is a good point to start with.

                                NeverDieN Offline
                                NeverDieN Offline
                                NeverDie
                                Hero Member
                                wrote on last edited by NeverDie
                                #1211

                                @d00616 said in nRF5 Bluetooth action!:

                                @NeverDie said in nRF5 Bluetooth action!:

                                @d00616 Is it still the case that we're limited to a single interrupt?  For instance, I'd like to put the nRF52832 to wake-up periodically as a heartbeat where it reports its battery level, and I also want it to wake-up if a particular pin goes HIGH (e.g. if a PIR sensor is triggered).  Presently I'm using the RTC to provide the one interrupt, and I use the PPI to create an RTC interrupt if it detects that the PIR sensor pin has gone HIGH.  Then the interrupt code must determine the true cause of the interrupt.  It would be cleaner if I could separate them into separate interrupts. 
                                

                                You can wake up the MCU via:

                                • GPIO pin sense; used for sleep()
                                • GPIOTE; consumes less engergy but pin must be dedected in software (0.1µA-0.5µA)
                                • LPCOMP (0.5µA)
                                • QDEC (5µA)

                                The interrupts for LPCOMP and QDEC are not allocated by the arduino-port. I think the LPCOMP is a good point to start with.

                                I have it now where LPCOMP does detect pin AIN1 (i.e. pin P0.03) going HIGH, but it still doesn't wake-up the MCU, and the interrupt code never runs. I could use the PPI to trigger an RTC interrupt when it detects the NRF_LPCOMP->EVENTS_UP event, which would wake up the MCU, but then I'm back to square one. Is that the best that can be done given the current state of the software?

                                #define MY_CORE_ONLY
                                
                                #include <nrf.h>
                                #include <MySensors.h>
                                
                                uint32_t blinkCounter=0;
                                uint32_t interruptCounter=0;
                                bool button_pressed=false;
                                
                                void setup() {
                                  Serial.begin(9600);
                                  Serial.println();
                                  Serial.println("Starting...");
                                
                                  // Enable interrupt
                                  NVIC_SetPriority(LPCOMP_IRQn, 15);
                                  NVIC_ClearPendingIRQ(LPCOMP_IRQn);
                                  NVIC_EnableIRQ(LPCOMP_IRQn);
                                
                                  hwPinMode(LED_BUILTIN,OUTPUT_H0H1);
                                  //hwPinMode(PIN_BUTTON1,INPUT);
                                  NRF_LPCOMP->PSEL=1; // monitor AIN1 (pin P0.03).
                                  while (!(NRF_LPCOMP->PSEL==1)) {} //wait until confirmed
                                  NRF_LPCOMP->REFSEL=3;  // choose 1/2 VDD as the reference voltage
                                  while (!(NRF_LPCOMP->REFSEL==3)) {} //wait until confirmed
                                  NRF_LPCOMP->INTENSET=B0100;  //Enable interrupt for UP event
                                  while (!(NRF_LPCOMP->INTENSET==B0100)) {} //wait until confirmed
                                  NRF_LPCOMP->ENABLE=1;  //Enable LPCOMP
                                  while (!(NRF_LPCOMP->ENABLE==1)) {} //wait until confirmed
                                  NRF_LPCOMP->TASKS_START=1;  //start the LPCOMP
                                  while (!(NRF_LPCOMP->EVENTS_READY)) {}  //wait until ready
                                }
                                
                                
                                void loop() {
                                  Serial.print(blinkCounter++);
                                  Serial.println("HIGH");
                                  digitalWrite(LED_BUILTIN,HIGH);
                                  delay(20);
                                
                                /*
                                  if (NRF_LPCOMP->EVENTS_UP) {
                                    digitalWrite(LED_BUILTIN,HIGH);
                                    delay(2000);
                                    NRF_LPCOMP->EVENTS_UP=0;  //Clear the semaphore
                                  }
                                  */
                                
                                  if (button_pressed) {
                                    digitalWrite(LED_BUILTIN,HIGH);
                                    delay(2000);
                                    button_pressed=false;  //Clear the semaphore
                                    NRF_LPCOMP->EVENTS_UP=0;  //Clear the semaphore
                                  }
                                  
                                  digitalWrite(LED_BUILTIN,LOW);
                                  hwSleep(5000);
                                }
                                
                                
                                // * Reset events and read back on nRF52
                                //* http://infocenter.nordicsemi.com/pdf/nRF52_Series_Migration_v1.0.pdf
                                 
                                #if __CORTEX_M == 0x04
                                #define NRF5_RESET_EVENT(event)                                                 \
                                        event = 0;                                                                   \
                                        (void)event
                                #else
                                #define NRF5_RESET_EVENT(event) event = 0
                                #endif
                                
                                
                                // This must be in one line
                                //extern "C" { void GPIO_IRQHandler(void) {interruptCounter++; NRF5_RESET_EVENT(NRF_RTC0->EVENTS_OVRFLW); NRF_RTC0->EVENTS_OVRFLW=0; }}
                                extern "C" { void LPCOMP_IRQHandler(void) {button_pressed=true; interruptCounter++; NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_UP); NRF_LPCOMP->EVENTS_UP=0; }}
                                
                                NeverDieN 1 Reply Last reply
                                0
                                • NeverDieN NeverDie

                                  @d00616 said in nRF5 Bluetooth action!:

                                  @NeverDie said in nRF5 Bluetooth action!:

                                  @d00616 Is it still the case that we're limited to a single interrupt?  For instance, I'd like to put the nRF52832 to wake-up periodically as a heartbeat where it reports its battery level, and I also want it to wake-up if a particular pin goes HIGH (e.g. if a PIR sensor is triggered).  Presently I'm using the RTC to provide the one interrupt, and I use the PPI to create an RTC interrupt if it detects that the PIR sensor pin has gone HIGH.  Then the interrupt code must determine the true cause of the interrupt.  It would be cleaner if I could separate them into separate interrupts. 
                                  

                                  You can wake up the MCU via:

                                  • GPIO pin sense; used for sleep()
                                  • GPIOTE; consumes less engergy but pin must be dedected in software (0.1µA-0.5µA)
                                  • LPCOMP (0.5µA)
                                  • QDEC (5µA)

                                  The interrupts for LPCOMP and QDEC are not allocated by the arduino-port. I think the LPCOMP is a good point to start with.

                                  I have it now where LPCOMP does detect pin AIN1 (i.e. pin P0.03) going HIGH, but it still doesn't wake-up the MCU, and the interrupt code never runs. I could use the PPI to trigger an RTC interrupt when it detects the NRF_LPCOMP->EVENTS_UP event, which would wake up the MCU, but then I'm back to square one. Is that the best that can be done given the current state of the software?

                                  #define MY_CORE_ONLY
                                  
                                  #include <nrf.h>
                                  #include <MySensors.h>
                                  
                                  uint32_t blinkCounter=0;
                                  uint32_t interruptCounter=0;
                                  bool button_pressed=false;
                                  
                                  void setup() {
                                    Serial.begin(9600);
                                    Serial.println();
                                    Serial.println("Starting...");
                                  
                                    // Enable interrupt
                                    NVIC_SetPriority(LPCOMP_IRQn, 15);
                                    NVIC_ClearPendingIRQ(LPCOMP_IRQn);
                                    NVIC_EnableIRQ(LPCOMP_IRQn);
                                  
                                    hwPinMode(LED_BUILTIN,OUTPUT_H0H1);
                                    //hwPinMode(PIN_BUTTON1,INPUT);
                                    NRF_LPCOMP->PSEL=1; // monitor AIN1 (pin P0.03).
                                    while (!(NRF_LPCOMP->PSEL==1)) {} //wait until confirmed
                                    NRF_LPCOMP->REFSEL=3;  // choose 1/2 VDD as the reference voltage
                                    while (!(NRF_LPCOMP->REFSEL==3)) {} //wait until confirmed
                                    NRF_LPCOMP->INTENSET=B0100;  //Enable interrupt for UP event
                                    while (!(NRF_LPCOMP->INTENSET==B0100)) {} //wait until confirmed
                                    NRF_LPCOMP->ENABLE=1;  //Enable LPCOMP
                                    while (!(NRF_LPCOMP->ENABLE==1)) {} //wait until confirmed
                                    NRF_LPCOMP->TASKS_START=1;  //start the LPCOMP
                                    while (!(NRF_LPCOMP->EVENTS_READY)) {}  //wait until ready
                                  }
                                  
                                  
                                  void loop() {
                                    Serial.print(blinkCounter++);
                                    Serial.println("HIGH");
                                    digitalWrite(LED_BUILTIN,HIGH);
                                    delay(20);
                                  
                                  /*
                                    if (NRF_LPCOMP->EVENTS_UP) {
                                      digitalWrite(LED_BUILTIN,HIGH);
                                      delay(2000);
                                      NRF_LPCOMP->EVENTS_UP=0;  //Clear the semaphore
                                    }
                                    */
                                  
                                    if (button_pressed) {
                                      digitalWrite(LED_BUILTIN,HIGH);
                                      delay(2000);
                                      button_pressed=false;  //Clear the semaphore
                                      NRF_LPCOMP->EVENTS_UP=0;  //Clear the semaphore
                                    }
                                    
                                    digitalWrite(LED_BUILTIN,LOW);
                                    hwSleep(5000);
                                  }
                                  
                                  
                                  // * Reset events and read back on nRF52
                                  //* http://infocenter.nordicsemi.com/pdf/nRF52_Series_Migration_v1.0.pdf
                                   
                                  #if __CORTEX_M == 0x04
                                  #define NRF5_RESET_EVENT(event)                                                 \
                                          event = 0;                                                                   \
                                          (void)event
                                  #else
                                  #define NRF5_RESET_EVENT(event) event = 0
                                  #endif
                                  
                                  
                                  // This must be in one line
                                  //extern "C" { void GPIO_IRQHandler(void) {interruptCounter++; NRF5_RESET_EVENT(NRF_RTC0->EVENTS_OVRFLW); NRF_RTC0->EVENTS_OVRFLW=0; }}
                                  extern "C" { void LPCOMP_IRQHandler(void) {button_pressed=true; interruptCounter++; NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_UP); NRF_LPCOMP->EVENTS_UP=0; }}
                                  
                                  NeverDieN Offline
                                  NeverDieN Offline
                                  NeverDie
                                  Hero Member
                                  wrote on last edited by
                                  #1212

                                  Getting closer... The LPCOMP interrupt code does run, but the main loop doesn't resume until the RTC timer makes it resume because the programmed time interval has expired.

                                  I know this is true because if, during sleep, I make AIN1 go HIGH, and then LOW, then when the MCU later wakes up because of the RTC, it so indicates by making the LED go HIGH for 2 seconds. However, even though there's now solid proof that the LPCOMP interrupt hardware does execute, the main loop doesn't immediately resume, as it does when the RTC times out.

                                  So.... How to make the main loop immediately resume whenever LPCOMP goes UP?

                                  NeverDieN 1 Reply Last reply
                                  0
                                  • NeverDieN NeverDie

                                    Getting closer... The LPCOMP interrupt code does run, but the main loop doesn't resume until the RTC timer makes it resume because the programmed time interval has expired.

                                    I know this is true because if, during sleep, I make AIN1 go HIGH, and then LOW, then when the MCU later wakes up because of the RTC, it so indicates by making the LED go HIGH for 2 seconds. However, even though there's now solid proof that the LPCOMP interrupt hardware does execute, the main loop doesn't immediately resume, as it does when the RTC times out.

                                    So.... How to make the main loop immediately resume whenever LPCOMP goes UP?

                                    NeverDieN Offline
                                    NeverDieN Offline
                                    NeverDie
                                    Hero Member
                                    wrote on last edited by NeverDie
                                    #1213

                                    Well, I have to re-build the timer part of this, and clean up the code, but at least now a PIR sensor trigger will immediately wake-up the MCU. That's progress! Unfortunately, current drawn during sleep is now 456ua, which is much higher than it should be.

                                    #define MY_CORE_ONLY
                                    
                                    #include <nrf.h>
                                    #include <MySensors.h>
                                    
                                    uint32_t rtcInterruptCounter=0;
                                    uint32_t buttonPressInterruptCounter=0;
                                    bool button_pressed=false;
                                    
                                    
                                    void myHwSleepPrepare(unsigned long ms)
                                    {
                                      // Idle serial device
                                      NRF_UART0->TASKS_STOPRX = 1;
                                      NRF_UART0->TASKS_STOPTX = 1;
                                      NRF_UART0->TASKS_SUSPEND = 1;
                                      //NRF_UART0->ENABLE=0;  //disable UART0
                                    
                                      //NRF_CLOCK->TASKS_HFCLKSTOP = 1;
                                      
                                      // Enable low power sleep mode
                                      NRF_POWER->TASKS_LOWPWR = 1;
                                    
                                    }
                                    
                                    // Sleep in System ON mode
                                    inline void doTheSleep()
                                    {
                                      __WFE();
                                      __SEV();
                                      __WFE();
                                    }
                                    
                                    void myHwSleepEnd(unsigned long ms)
                                    {
                                      // Start HFCLK
                                      //if (nrf5_pwr_hfclk) {
                                      if (false) {
                                        NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
                                        NRF_CLOCK->TASKS_HFCLKSTART = 1;
                                        while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0)
                                          ;
                                        // Enable low latency sleep mode
                                        //NRF_POWER->TASKS_CONSTLAT = 1;
                                      }
                                    }
                                     
                                    void myHwSleep(unsigned long ms)
                                    {
                                      myHwSleepPrepare(ms);
                                      doTheSleep();
                                      //now sleeping
                                      myHwSleepEnd(ms);
                                    
                                    }
                                    
                                    
                                    void setup() {
                                      //Serial.begin(9600);
                                      //Serial.println();
                                      //Serial.println("Starting...");
                                    
                                      
                                        // Enable interrupt
                                      NVIC_SetPriority(LPCOMP_IRQn, 15);
                                      NVIC_ClearPendingIRQ(LPCOMP_IRQn);
                                      NVIC_EnableIRQ(LPCOMP_IRQn);
                                      
                                      hwPinMode(LED_BUILTIN,OUTPUT_H0H1);
                                      //hwPinMode(PIN_BUTTON1,INPUT);
                                      NRF_LPCOMP->PSEL=1; // monitor AIN1 (pin P0.03).
                                      while (!(NRF_LPCOMP->PSEL==1)) {} //wait until confirmed
                                      NRF_LPCOMP->REFSEL=3;  // choose 1/2 VDD as the reference voltage
                                      while (!(NRF_LPCOMP->REFSEL==3)) {} //wait until confirmed
                                      NRF_LPCOMP->INTENSET=B0100;  //Enable interrupt for UP event
                                      while (!(NRF_LPCOMP->INTENSET==B0100)) {} //wait until confirmed
                                      NRF_LPCOMP->ENABLE=1;  //Enable LPCOMP
                                      while (!(NRF_LPCOMP->ENABLE==1)) {} //wait until confirmed
                                      NRF_LPCOMP->TASKS_START=1;  //start the LPCOMP
                                      while (!(NRF_LPCOMP->EVENTS_READY)) {}  //wait until ready
                                    
                                      //NRF_PPI->CH[0].EEP = (uint32_t)&NRF_LPCOMP->EVENTS_UP;  //If PIR sensor is triggered
                                      //NRF_PPI->CH[0].TEP = (uint32_t)&NRF_RTC0->TASKS_TRIGOVRFLW;  //make the RTC wake-up the MCU
                                    
                                      //NRF_PPI->CHENSET=B00000001; //enable Channel 0.
                                      
                                      NRF_RTC0->INTENSET = B10;  //interrupt MCU if an OVRFLW is detected.
                                      while (NRF_RTC0->INTENSET != B10) {}  //wait until confirmed
                                    
                                    }
                                    
                                    
                                    void loop() {
                                      //Serial.print(blinkCounter++);
                                      //Serial.println("HIGH");
                                      digitalWrite(LED_BUILTIN,HIGH);
                                      delay(20);
                                    
                                    /*
                                      if (NRF_LPCOMP->EVENTS_UP) {
                                        digitalWrite(LED_BUILTIN,HIGH);
                                        delay(2000);
                                        NRF_LPCOMP->EVENTS_UP=0;  //Clear the semaphore
                                      }
                                      */
                                    
                                      if (button_pressed) {
                                        digitalWrite(LED_BUILTIN,HIGH);
                                        delay(2000);
                                        button_pressed=false;  //Clear the semaphore
                                        NRF_LPCOMP->EVENTS_UP=0;  //Clear the semaphore
                                      }
                                      
                                      digitalWrite(LED_BUILTIN,LOW);
                                      myHwSleep(5000);
                                    }
                                    
                                    
                                    // * Reset events and read back on nRF52
                                    //* http://infocenter.nordicsemi.com/pdf/nRF52_Series_Migration_v1.0.pdf
                                     
                                    #if __CORTEX_M == 0x04
                                    #define NRF5_RESET_EVENT(event)                                                 \
                                            event = 0;                                                                   \
                                            (void)event
                                    #else
                                    #define NRF5_RESET_EVENT(event) event = 0
                                    #endif
                                    
                                    
                                    // This must be in one line
                                    extern "C" { void RTC0_IRQHandler(void) {rtcInterruptCounter++; NRF5_RESET_EVENT(NRF_RTC0->EVENTS_OVRFLW); NRF_RTC0->EVENTS_OVRFLW=0; }}
                                    extern "C" { void LPCOMP_IRQHandler(void) {button_pressed=true; buttonPressInterruptCounter++; NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_UP); NRF_LPCOMP->EVENTS_UP=0; }}
                                    
                                    NeverDieN 1 Reply Last reply
                                    0
                                    • NeverDieN NeverDie

                                      Well, I have to re-build the timer part of this, and clean up the code, but at least now a PIR sensor trigger will immediately wake-up the MCU. That's progress! Unfortunately, current drawn during sleep is now 456ua, which is much higher than it should be.

                                      #define MY_CORE_ONLY
                                      
                                      #include <nrf.h>
                                      #include <MySensors.h>
                                      
                                      uint32_t rtcInterruptCounter=0;
                                      uint32_t buttonPressInterruptCounter=0;
                                      bool button_pressed=false;
                                      
                                      
                                      void myHwSleepPrepare(unsigned long ms)
                                      {
                                        // Idle serial device
                                        NRF_UART0->TASKS_STOPRX = 1;
                                        NRF_UART0->TASKS_STOPTX = 1;
                                        NRF_UART0->TASKS_SUSPEND = 1;
                                        //NRF_UART0->ENABLE=0;  //disable UART0
                                      
                                        //NRF_CLOCK->TASKS_HFCLKSTOP = 1;
                                        
                                        // Enable low power sleep mode
                                        NRF_POWER->TASKS_LOWPWR = 1;
                                      
                                      }
                                      
                                      // Sleep in System ON mode
                                      inline void doTheSleep()
                                      {
                                        __WFE();
                                        __SEV();
                                        __WFE();
                                      }
                                      
                                      void myHwSleepEnd(unsigned long ms)
                                      {
                                        // Start HFCLK
                                        //if (nrf5_pwr_hfclk) {
                                        if (false) {
                                          NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
                                          NRF_CLOCK->TASKS_HFCLKSTART = 1;
                                          while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0)
                                            ;
                                          // Enable low latency sleep mode
                                          //NRF_POWER->TASKS_CONSTLAT = 1;
                                        }
                                      }
                                       
                                      void myHwSleep(unsigned long ms)
                                      {
                                        myHwSleepPrepare(ms);
                                        doTheSleep();
                                        //now sleeping
                                        myHwSleepEnd(ms);
                                      
                                      }
                                      
                                      
                                      void setup() {
                                        //Serial.begin(9600);
                                        //Serial.println();
                                        //Serial.println("Starting...");
                                      
                                        
                                          // Enable interrupt
                                        NVIC_SetPriority(LPCOMP_IRQn, 15);
                                        NVIC_ClearPendingIRQ(LPCOMP_IRQn);
                                        NVIC_EnableIRQ(LPCOMP_IRQn);
                                        
                                        hwPinMode(LED_BUILTIN,OUTPUT_H0H1);
                                        //hwPinMode(PIN_BUTTON1,INPUT);
                                        NRF_LPCOMP->PSEL=1; // monitor AIN1 (pin P0.03).
                                        while (!(NRF_LPCOMP->PSEL==1)) {} //wait until confirmed
                                        NRF_LPCOMP->REFSEL=3;  // choose 1/2 VDD as the reference voltage
                                        while (!(NRF_LPCOMP->REFSEL==3)) {} //wait until confirmed
                                        NRF_LPCOMP->INTENSET=B0100;  //Enable interrupt for UP event
                                        while (!(NRF_LPCOMP->INTENSET==B0100)) {} //wait until confirmed
                                        NRF_LPCOMP->ENABLE=1;  //Enable LPCOMP
                                        while (!(NRF_LPCOMP->ENABLE==1)) {} //wait until confirmed
                                        NRF_LPCOMP->TASKS_START=1;  //start the LPCOMP
                                        while (!(NRF_LPCOMP->EVENTS_READY)) {}  //wait until ready
                                      
                                        //NRF_PPI->CH[0].EEP = (uint32_t)&NRF_LPCOMP->EVENTS_UP;  //If PIR sensor is triggered
                                        //NRF_PPI->CH[0].TEP = (uint32_t)&NRF_RTC0->TASKS_TRIGOVRFLW;  //make the RTC wake-up the MCU
                                      
                                        //NRF_PPI->CHENSET=B00000001; //enable Channel 0.
                                        
                                        NRF_RTC0->INTENSET = B10;  //interrupt MCU if an OVRFLW is detected.
                                        while (NRF_RTC0->INTENSET != B10) {}  //wait until confirmed
                                      
                                      }
                                      
                                      
                                      void loop() {
                                        //Serial.print(blinkCounter++);
                                        //Serial.println("HIGH");
                                        digitalWrite(LED_BUILTIN,HIGH);
                                        delay(20);
                                      
                                      /*
                                        if (NRF_LPCOMP->EVENTS_UP) {
                                          digitalWrite(LED_BUILTIN,HIGH);
                                          delay(2000);
                                          NRF_LPCOMP->EVENTS_UP=0;  //Clear the semaphore
                                        }
                                        */
                                      
                                        if (button_pressed) {
                                          digitalWrite(LED_BUILTIN,HIGH);
                                          delay(2000);
                                          button_pressed=false;  //Clear the semaphore
                                          NRF_LPCOMP->EVENTS_UP=0;  //Clear the semaphore
                                        }
                                        
                                        digitalWrite(LED_BUILTIN,LOW);
                                        myHwSleep(5000);
                                      }
                                      
                                      
                                      // * Reset events and read back on nRF52
                                      //* http://infocenter.nordicsemi.com/pdf/nRF52_Series_Migration_v1.0.pdf
                                       
                                      #if __CORTEX_M == 0x04
                                      #define NRF5_RESET_EVENT(event)                                                 \
                                              event = 0;                                                                   \
                                              (void)event
                                      #else
                                      #define NRF5_RESET_EVENT(event) event = 0
                                      #endif
                                      
                                      
                                      // This must be in one line
                                      extern "C" { void RTC0_IRQHandler(void) {rtcInterruptCounter++; NRF5_RESET_EVENT(NRF_RTC0->EVENTS_OVRFLW); NRF_RTC0->EVENTS_OVRFLW=0; }}
                                      extern "C" { void LPCOMP_IRQHandler(void) {button_pressed=true; buttonPressInterruptCounter++; NRF5_RESET_EVENT(NRF_LPCOMP->EVENTS_UP); NRF_LPCOMP->EVENTS_UP=0; }}
                                      
                                      NeverDieN Offline
                                      NeverDieN Offline
                                      NeverDie
                                      Hero Member
                                      wrote on last edited by
                                      #1214

                                      Aha! Most likely the high current draw is from the high frequency clock, which I need to turn off prior to sleep but haven't done yet.

                                      NeverDieN 1 Reply Last reply
                                      0
                                      • NeverDieN NeverDie

                                        Aha! Most likely the high current draw is from the high frequency clock, which I need to turn off prior to sleep but haven't done yet.

                                        NeverDieN Offline
                                        NeverDieN Offline
                                        NeverDie
                                        Hero Member
                                        wrote on last edited by
                                        #1215

                                        Anyhow, the basic question remains and boils down to this: Can I have both

                                            // Enable interrupt
                                          NVIC_SetPriority(LPCOMP_IRQn, 15);
                                          NVIC_ClearPendingIRQ(LPCOMP_IRQn);
                                          NVIC_EnableIRQ(LPCOMP_IRQn);
                                        

                                        AND an equivalent incantation for the RTC both active at the same time? Or am I forced into having it be just one or the other?

                                        NeverDieN 1 Reply Last reply
                                        0
                                        • NeverDieN NeverDie

                                          @Terrence

                                          Around 30 feet, through some walls, but at 2mbps. I realize that's not very far, but even so the measured packet loss (informal testing) is pretty high at that speed. I can see why most people default to 250kbps instead.

                                          I don't have the 840 dev kit yet, mostly because I don't see anyother 840 modules on the market right now.

                                          ahmedadelhosniA Offline
                                          ahmedadelhosniA Offline
                                          ahmedadelhosni
                                          wrote on last edited by
                                          #1216

                                          @NeverDie Did you manage to get more than 10m ? maybe by another modules.

                                          I thought the nrf52 will have better range !

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          11

                                          Online

                                          11.7k

                                          Users

                                          11.2k

                                          Topics

                                          113.0k

                                          Posts


                                          Copyright 2019 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • MySensors
                                          • OpenHardware.io
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular