Problem: Aufhängen des Arduinos...evtl. ein Problem mit dem EEPROM

Hallo Leute,

erst mal.. Ich bin neu hier, wenn es den Thread schon gibt oder ich ihn in der falschen Rubrik gepostet habe, dann tut es mir Leid :sweat_smile:

So, dann kommen wir zu meinem Problem:

Grob umschrieben, ich habe einen Arduino Uno, welcher über ein 433MHz Funknetz mit einem anderen verbunden ist. Die gesendeten Daten werden über RxTx übertragen. Während des Prozesses greift der Uno auf den EEPROM-Speicher (5 Zellen). Soweit so gut... Habe das Ganze ausgetestet und hat auch funktioniert... nach mehrfachem erhalten von Daten hängt der Uno sich einfach auf... nach dem Neustart werden 5 char Elemente über RxTx gesendet(Normal sollte "Aktuelles Paket" gesendet werden, stattdessen kommt "Aktue"), danach hängt er sich wieder auf. Wenn ich nun die Speicherzellen vom EEPROM wechsel, funktioniert es meist wieder :|

Ich hoffe mir kann jemand helfen.

Gruß

Hi,

bitte den Code posten, dann können wir besser helfen.

Erdmann: Grob umschrieben, ich habe einen Arduino Uno, welcher über ein 433MHz Funknetz mit einem anderen verbunden ist. Die gesendeten Daten werden über RxTx übertragen. Während des Prozesses greift der Uno auf den EEPROM-Speicher (5 Zellen). Soweit so gut... Habe das Ganze ausgetestet und hat auch funktioniert... nach mehrfachem erhalten von Daten hängt der Uno sich einfach auf...

Grob umschrieben könnte es sein: - RAM-Speichermangel (zuviel RAM beim Programmieren verschwendet) - Fehler in der Programmlogik (z.B. Endlosschleifen, falscher Gebrauch von Interrupts, falsche Endbedingungen)

jurs:
Grob umschrieben könnte es sein:

  • RAM-Speichermangel (zuviel RAM beim Programmieren verschwendet)
  • Fehler in der Programmlogik (z.B. Endlosschleifen, falscher Gebrauch von Interrupts, falsche Endbedingungen)

Das es am RAM-Speichermangel liegt, denke ich weniger, ist ja nicht all zu viel verschwendet und Endlosschleifen oder ähnliches habe ich auch keine

Code:

#include <VirtualWire.h>             //zur Funkübertragung(433MHz)
#include <EEPROM.h>                  //zum Ansprechen des EEPROM's

#undef int
#undef abs
#undef double
#undef float
#undef round

const byte led[3]={8,9,10};            //LED Pins
const byte Taster=7;                   //Adressen-Setup-Pin

const byte b[5]={0,1,2,3,4};  //intAddr im EEPROM zur Zustandsetzung

const byte set_adresse=250;
const byte adresse_alle=255;           //Master-Gruppen Adresse


int adresse=0;                        //
int akt_byte[4]={0,0,0,0};            //Enthält die save_byte Daten von {1 2 3 4}
byte anzahl_prog=0;                    //ACHTUNG: Anzahl der Programme muss angegeben sein!

//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------Setup-------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------

void setup()
{
    Serial.begin(9600);    
 
// Initialise the IO and ISR
    
    vw_set_ptt_inverted(true);    // Required for RX Link Module
    vw_setup(2000);               // Bits per sec
    vw_set_rx_pin(5);            // We will be receiving on pin 5 i.e the RX pin from the module connects to this pin.
    vw_rx_start();                // Start the receiver
    
    pinMode(Taster,INPUT);        //Adresse_Setup_Pin als Input
    
     for(int i=1;i<5;i++){
       akt_byte[i-1]=EEPROM.read(b[i]);
     }
     adresse=EEPROM.read(b[0]);
     
    if(EEPROM.read(b[1])<11){                            //EEPROM Abfrage nach einem verwendeten Programm
  
      analogWrite(led[0],0);                                        //LED Reset damit keine Zustände verbleiben
      analogWrite(led[1],0);
      analogWrite(led[2],0);
    }
    else
    {
      analogWrite(led[0],akt_byte[1]);               //Falls nicht wird der letzte LED Zustand verwendet
      analogWrite(led[1],akt_byte[2]);
      analogWrite(led[2],akt_byte[3]);   
    }
    
    
    Serial.print("Aktuelles Paket: ");                              //Aktuelles Paket wird ausgeben
    for(int i=0;i<5;i++){  
      Serial.print(EEPROM.read(b[i]));
      if(i<4){Serial.print(".");}
      }
    Serial.println("");
    Serial.print(micros());                                         //Setupzeit wird ausgegeben
    Serial.println(" micro Sekunden fuer das Setup");
}

//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------Unterprogramme----------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------

//--------------------------------------------neue Nachicht-----------------------------------------------------------------

void newmail()
{
   uint8_t buf[VW_MAX_MESSAGE_LEN];
   uint8_t buflen = VW_MAX_MESSAGE_LEN; 
   
   
    
   if (vw_get_message(buf, &buflen)){                        //Paket angekommen?
      Serial.println("\ninc bytes");
      if(buf[0]==adresse||buf[0]==adresse_alle){      //Einzelbefehl oder Masterbefehl
        Serial.print("Paket erhalten: ");
        for (int i = 1; i < 5; i++){
          akt_byte[i-1]=buf[i];
          EEPROM.write(b[i],buf[i]);                      //speichert den RGB-Wert in den EEPROM
          Serial.print(akt_byte[i-1]);
          if(i<4){Serial.print(".");}
          }
          
          
        if(akt_byte[0]<11){                              //Programmbefehl
        Serial.print("\nProgramm ");
        Serial.println(akt_byte[0]);
        fader=0;                                             //Fader Reset
        fader_rev=0;
        fader_z=0;
        Provar=0;
        analogWrite(led[0],0);             
        analogWrite(led[1],0);
        analogWrite(led[2],0);
        }
        else
        {
        analogWrite(led[0], akt_byte[1]);
        analogWrite(led[1], akt_byte[2]);
        analogWrite(led[2], akt_byte[3]);
        }
        }
        



      }
}
//--------------------------------------------------------------------------------------------------------------------------
//--------------------------------------------Hauptprogramm-----------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------------------

void loop()
{  
      uint8_t buf[VW_MAX_MESSAGE_LEN];
      uint8_t buflen = VW_MAX_MESSAGE_LEN; 
  
  
  newmail();
  
   //programm001();                                            //Programm aktiv?
   //programm002();
   //programm003();
   //programm004();
   //programm005();
   //programm006();
   //programm007();
   //programm008();
   //programm009();
   //programm010();
   

 //--------------------------------------------Setup_Adresse-----------------------------------------------------------------
      
     if (digitalRead(Taster)==HIGH){          //Adressen-Setup-Taste betätigt?
       Serial.println("AdressenSetup");
       analogWrite(led[0],100);               //Optisches Signal: alle LEDs an
       analogWrite(led[1],100);
       analogWrite(led[2],100);       
       wait:
       
       if (vw_get_message(buf, &buflen)){     //Letztes Byte des Pakets auslesen
           if(buf[0]==set_adresse){
             adresse=buf[4];                    //und als neue Adresse speichern
             EEPROM.write(b[0],adresse);
             Serial.print("neue Adresse: ");
             Serial.println(adresse);
          
             for(int i=0;i<5;i++){              //Optisches Signal: blinkende LEDs
       
               analogWrite(led[0],0);
               analogWrite(led[1],0);
               analogWrite(led[2],0);
               delay(30);
               analogWrite(led[0],255);
               analogWrite(led[1],255);
               analogWrite(led[2],255);
               delay(80);
             }
           goto ende;
           }  
       }
     goto wait;
     ende:
     analogWrite(led[0],0);                  //Abschluss: alle LEDs aus
     analogWrite(led[1],0);
     analogWrite(led[2],0);
     
    }

}

Erdmann: EEPROM.write(b,buf); //speichert den RGB-Wert in den EEPROM

Wenigstens diese Zeile im Code dürfte nicht das machen, was sie machen soll. Denn der Kommentar passt irgendwie so gar nicht zum Code.

Das war noch von einer vorherigen Version, also die meisten Kommentare stimmen noch, aber nicht mehr alle.