Si riempie la SRAM sul ATMEGA328P resettandosi Ebyte e32

Home Forum Le librerie ospitate nel sito EBYTE E32 dispositivi LoRa UART sx1278/sx1276. Si riempie la SRAM sul ATMEGA328P resettandosi Ebyte e32

Taggato: 

Visualizzazione 7 filoni di risposte
  • Autore
    Post
    • #5403
      AB-informatica-service

        In pratica ogni volta che mando un messaggio visualizzo lo stato di memoria (in byte) prima e dopo aver richiamato la funzione sendFixedMessage().

        E’ un grosso problema per noi perché dopo una 15ina di messaggi va in autoreset per saturazione di SRAM.

         

        Ciao

      • #5406
        Renzo Mischianti
        Amministratore del forum

          Fixato, c’era un commento di troppo sulla sendFixedMessage, ora non brucia più memoria.

          Inoltre approfitto per segnalare che se si usa la receiveMessage per i formati stringa senza size, c’è il rischio che se ti arrivano più messaggi allo stesso tempo quando leggi il buffer ne potresti trovare e leggere più di uno contemporaneamente

          Per ovviare a questo problema ora c’è la

          receiveMessageUntil 

          che legge sempre un messaggio alla volta, in alternativa alla lettura del buffer dovete occuparvi voi di splittare i vari messaggi in coda.

          Ciao Renzo

        • #17189
          Fabio

            Ciao Renzo, ho ancora lo stesso problema.

            Sto utilizzando Atmega 2560 questa volta e ho lo stesso problema di riempimento ram.Utilizzo Platformio su VSCode.

            Cosa potrebbe essere questa volta?

            Grazie

          • #17190
            Renzo Mischianti
            Amministratore del forum

              Ciao Fabio,
              non riesco a replicare il problema, puoi mandarmi un esempio di codice dove si verifica il consumo di memoria?
              Grazie Renzo

              • #17191
                Fabio

                  Ciao, si.

                  Allora il loop per quanto riguarda il codice LoRa è:

                  void loop(){

                    String message = communicationAbiot.receiveMessage();

                      if (message != "")
                      {
                      ecc..
                    }
                  }

                  Mentre tutte le funzioni le ho racchiuse in un file e te lo copio tutto:


                  #include "CommunicationAbiot.h"
                  #include
                  #include
                  ResponseStatus rs;
                  ResponseContainer rc;
                  #define attivaMosfet 12
                  SoftwareSerial *serial;
                  LoRa_E32 *e32ttl; //AUX, M0 and M1
                  String CommunicationAbiot::receiveMessage()
                  {
                      String input = "";
                      if (e32ttl->available() > 1)
                      {
                          Serial.println("receiceMessage: Ho ricevuto un messaggio");
                          rc = e32ttl->receiveMessage();
                          input = rc.data;
                          Serial.print("Il messaggio ricevuto è: ");
                          Serial.println(input);
                          return input;
                      }
                      return input;
                  }
                  void CommunicationAbiot::sendMessage(const String &message)
                  {
                      Serial.print("sendMessage: Invio il messaggio: ");
                      Serial.println(message);
                      setSendingMode();
                      digitalWrite(attivaMosfet, HIGH);
                      delay(500);
                      rs = e32ttl->sendFixedMessage(0, GATEWAY_ADDRESS, 1, message);
                      Serial.println("sendMessage: " + message + " status: " + rs.getResponseDescription());
                      delay(500);
                      digitalWrite(attivaMosfet, LOW);
                      setReceivingMode();
                  }
                  // -------------------------------------
                  void CommunicationAbiot::initModem()
                  {
                      pinMode(attivaMosfet, OUTPUT);
                      digitalWrite(attivaMosfet, LOW);
                      serial = new SoftwareSerial(20, 18);       //(RX,TX) <= TX, RX MODEM     e32ttl = new LoRa_E32(serial, 21, 38, 41); //AUX, M0 and M1     while (!e32ttl->begin())
                      {
                          Serial.println("Attendo init modem TX...");
                          delay(1000);
                      }
                      delay(100);
                      configureModem();
                      Serial.println("Init modem OK");
                      setReceivingMode();
                  }
                  void CommunicationAbiot::destroyModem()
                  {
                      serial->stopListening();
                      serial->end();
                      if (e32ttl->available())
                          serial->read();
                      delete serial;
                      delete e32ttl;
                  }
                  void CommunicationAbiot::printModemConfiguration()
                  {
                      ResponseStructContainer c = e32ttl->getConfiguration();
                      Configuration configuration = *(Configuration *)c.data;
                      Serial.print(F("HEAD BIN: "));
                      Serial.print(configuration.HEAD, BIN);
                      Serial.print(configuration.HEAD, DEC);
                      Serial.print(" ");
                      Serial.println(configuration.HEAD, HEX);
                      Serial.println(F(" "));
                      Serial.print(F("AddH DEC: "));
                      Serial.println(configuration.ADDH, DEC);
                      Serial.print(F("AddL DEC: "));
                      Serial.println(configuration.ADDL, DEC);
                      Serial.print(F("Chan DEC: "));
                      Serial.print(configuration.CHAN, DEC);
                      Serial.print(" -> ");
                      Serial.println(configuration.getChannelDescription());
                      Serial.println(F(" "));
                      Serial.print(F("SpeedParityBit BIN    : "));
                      Serial.print(configuration.SPED.uartParity, BIN);
                      Serial.print(" -> ");
                      Serial.println(configuration.SPED.getUARTParityDescription());
                      Serial.print(F("SpeedUARTDataRate BIN : "));
                      Serial.print(configuration.SPED.uartBaudRate, BIN);
                      Serial.print(" -> ");
                      Serial.println(configuration.SPED.getUARTBaudRate());
                      Serial.print(F("SpeedAirDataRate BIN  : "));
                      Serial.print(configuration.SPED.airDataRate, BIN);
                      Serial.print(" -> ");
                      Serial.println(configuration.SPED.getAirDataRate());
                      Serial.print(F("OptionTrans BIN       : "));
                      Serial.print(configuration.OPTION.fixedTransmission, BIN);
                      Serial.print(" -> ");
                      Serial.println(configuration.OPTION.getFixedTransmissionDescription());
                      Serial.print(F("OptionPullup BIN      : "));
                      Serial.print(configuration.OPTION.ioDriveMode, BIN);
                      Serial.print(" -> ");
                      Serial.println(configuration.OPTION.getIODroveModeDescription());
                      Serial.print(F("OptionWakeup BIN      : "));
                      Serial.print(configuration.OPTION.wirelessWakeupTime, BIN);
                      Serial.print(" -> ");
                      Serial.println(configuration.OPTION.getWirelessWakeUPTimeDescription());
                      Serial.print(F("OptionFEC BIN         : "));
                      Serial.print(configuration.OPTION.fec, BIN);
                      Serial.print(" -> ");
                      Serial.println(configuration.OPTION.getFECDescription());
                      Serial.print(F("OptionPower BIN       : "));
                      Serial.print(configuration.OPTION.transmissionPower, BIN);
                      Serial.print(" -> ");
                      Serial.println(configuration.OPTION.getTransmissionPowerDescription());
                      Serial.println("----------------------------------------");
                  }
                  void CommunicationAbiot::configureModem()
                  {
                      e32ttl->setMode(MODE_3_SLEEP); //per progranmare il modem
                      delay(100);
                      ResponseStructContainer c = e32ttl->getConfiguration();
                      Configuration configuration = *(Configuration *)c.data;
                      configuration.ADDL = ID_NODE;
                      configuration.ADDH = 0; //MAX 0xFF=255
                      configuration.CHAN = 1; //0x19;
                      configuration.OPTION.fec = FEC_1_ON;
                      configuration.OPTION.fixedTransmission = FT_FIXED_TRANSMISSION;
                      configuration.OPTION.ioDriveMode = IO_D_MODE_PUSH_PULLS_PULL_UPS;
                      configuration.OPTION.transmissionPower = POWER_20;
                      configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
                      configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
                      configuration.SPED.uartBaudRate = UART_BPS_9600;
                      configuration.SPED.uartParity = MODE_00_8N1;
                      ResponseStatus rs = e32ttl->setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
                      delay(200);
                  }
                  void CommunicationAbiot::setReceivingMode()
                  {
                      e32ttl->setMode(MODE_3_SLEEP); //per progranmare il modem
                      delay(100);
                      ResponseStructContainer c = e32ttl->getConfiguration();
                      Configuration configuration = *(Configuration *)c.data;
                      configuration.SPED.airDataRate = AIR_DATA_RATE_001_12;
                      configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
                      ResponseStatus rs = e32ttl->setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
                      delay(200);
                      e32ttl->setMode(MODE_2_POWER_SAVING);
                      delay(100);
                  }
                  void CommunicationAbiot::setSendingMode()
                  {
                      Serial.println("setSendingMode: ");
                      e32ttl->setMode(MODE_3_SLEEP); //per progranmare il modem
                      delay(100);
                      ResponseStructContainer c = e32ttl->getConfiguration();
                      Configuration configuration = *(Configuration *)c.data;
                      configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
                      configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
                      ResponseStatus rs = e32ttl->setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
                      delay(200);
                      e32ttl->setMode(MODE_0_NORMAL);
                      delay(100);
                  }
                  void CommunicationAbiot::setSleepMode()
                  {
                      e32ttl->setMode(MODE_3_SLEEP);
                      delay(100);
                  }

                • #17197
                  Fabio

                    Ah ti metto qui anche il log cosi vedi che la SRAM diminuisce man mano:

                    Sono in enterSleep() da dove riprende il programma
                    Sono nel loop
                    receiceMessage: Ho ricevuto un messaggio
                    Il messaggio ricevuto è: D:1:2:3:4:5:6:7:8:9:10
                    Free Ram Size: 2314
                    Verifico se è per me
                    Questo messaggio e’ diretto a me: D:1:2:3:4:5:6:7:8:9:10
                    sendMessagiewithDelay:
                    Aspetto prima di rispondere : 3000
                    sendMessage: Invio il messaggio: 1:D:93:100:100:100:14:15:50

                    setSendingMode:
                    sendMessage: 1:D:93:100:100:100:14:15:50
                    status: Success
                    Sono nella funzione di SLEEP

                    …Qua ci sono circa 100 messaggi di mezzo…

                    Sono in enterSleep() da dove riprende il programma
                    Sono nel loop
                    receiceMessage: Ho ricevuto un messaggio
                    Il messaggio ricevuto è: D:6:8
                    Free Ram Size: 1878
                    Verifico se è per me
                    Non è per me, ritorno in ascolto
                    Sono nella funzione di SLEEP

                • #17195
                  Renzo Mischianti
                  Amministratore del forum

                    Ciao Fabio,
                    così al primo colpo d’occhio manca il close della ResponseStructContainer.
                    Prova a fixare e poi dammi un feedback.
                    Ciao Renzo

                    • #17198
                      Fabio

                        Ho rivisto il tuo articolo dove spieghi la libreria.

                        Ora ho aggiunto c.close();

                        void CommunicationAbiot::setReceivingMode()
                        {
                            e32ttl->setMode(MODE_3_SLEEP); //per progranmare il modem
                            delay(100);
                            ResponseStructContainer c = e32ttl->getConfiguration();
                            Configuration configuration = *(Configuration *)c.data;
                            configuration.SPED.airDataRate = AIR_DATA_RATE_001_12;
                            configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
                            ResponseStatus rs = e32ttl->setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
                            c.close();
                            delay(200);
                            e32ttl->setMode(MODE_2_POWER_SAVING);
                            delay(100);
                        }
                        void CommunicationAbiot::setSendingMode()
                        {
                            Serial.println("setSendingMode: ");
                            e32ttl->setMode(MODE_3_SLEEP); //per progranmare il modem
                            delay(100);
                            ResponseStructContainer c = e32ttl->getConfiguration();
                            Configuration configuration = *(Configuration *)c.data;
                            configuration.SPED.airDataRate = AIR_DATA_RATE_010_24;
                            configuration.OPTION.wirelessWakeupTime = WAKE_UP_2000;
                            ResponseStatus rs = e32ttl->setConfiguration(configuration, WRITE_CFG_PWR_DWN_SAVE);
                            c.close();
                            delay(200);
                            e32ttl->setMode(MODE_0_NORMAL);
                            delay(100);
                        }

                        Ti tengo aggiornato.

                    • #17202
                      Renzo Mischianti
                      Amministratore del forum

                        Si fammi sapere, magari c’è anche qualche altra cosa.
                        Ciao Renzo

                      • #17204
                        Fabio

                          Ciao Renzo, confermo che aggiungendo il close() la SRAM non si riempie piu!

                          Grazie

                        • #17206
                          Renzo Mischianti
                          Amministratore del forum

                            Ciao Fabio,
                            perfetto!! 🙂
                            Ciao Renzo

                        Visualizzazione 7 filoni di risposte
                        • Devi essere connesso per rispondere a questo topic.
                        Exit mobile version