SRAM problem ArduinoBT

hi all,

i am using the ArduinoBT, it has an atmega16 on it. with 1024 Bytes SRam.

i am sending datapackets from a pda to de arduino, no problem there @ all.

1 data pakket consists out of 13 int's. the data pakkets could have 2 destinations. every destination could have more control info.

so those 13 ints are build up like:

int example[ID1][ID2]

where id1 = 1 or 2 and id2 = 1 .... xxx (as much as i can get out of it)

my current max is [2][13] then the SRam is full. anny1 know a nice way how i can safe more stuff?

greetings

H2k

Could you please post your complete sketch code? Your array only has 26 elements, so there must be something else using up the 1024 bytes of RAM. Use the ‘#’ button above the reply text box to make a well-formatted code box.

I suspect you could halve your SRAM usage by changing most datatypes from ints to bytes.

int RESET = 7;
int iBTwaarde = 0;
int counter = 0;

int iAck,
    iNack, 
    iLampID, 
    iSceneID, 
    iCheck, 
    iCheckSum[11], 
    iCheckFinal[11];

unsigned long a,
              b,
              c;
            

struct TLampGegevens {
  unsigned int iKfade[11];                     // Kleuren fade ja of nee                 (2 bytes)
  unsigned long iKleurwaardes[11];              // HSV                         (4 bytes)
  unsigned int iKtijd[11];                     // tijd die 1 kleur aan blijft.           (2 bytes)
} ;

struct TMotorGegevens {
  unsigned int iMrichting[11];                 // Richting van de motor                  (2 bytes)
  unsigned int iMpostijd[11];                  // Positie motor                          (2 bytes)
  unsigned int iMsnelheid[11];                 // Snelheid motor                         (2 bytes)
} ;

TLampGegevens TLamp;
TMotorGegevens TMotor;

void setup() {
  // declare the pins as output
  pinMode(RESET,OUTPUT);    

  // connect to the serial port
  Serial.begin(115110);               

  // reseten van de bluetooth module
  digitalWrite(RESET, HIGH);
  delay(10);
  digitalWrite(RESET, LOW);
  delay(1100);
}

void loop () {

  // ontvangen van bluetooth data
  if (Serial.available() > 0) {
    counter++;
    iBTwaarde = Serial.read(); // Byte voor Byte van de stack afhalen
    if ((iBTwaarde >= 48) && (iBTwaarde <= 57)){  // ASCII tabel omzetten
        iBTwaarde = iBTwaarde - 48;
    }
  }


  if (counter == 1){                              
    iLampID = iBTwaarde;
    iCheck = iLampID;                                           
  }

  if (counter == 2){                                          // Huidig scene delen deel 1
    a = iBTwaarde;
    iCheck = iCheck +  a;                                     
  }  

  if (counter == 3){                                          // Huidig scene delen deel 2
    b = iBTwaarde;
    iCheck = iCheck + b;                                     

    if (a != 0){
      a = a*10; 
    }

    iSceneID = a + b;
   
  } 
  

  if (counter == 4){   
    a = iBTwaarde;
    iCheck = iCheck + a;                                            

    if (a == 1){
      TLamp.iKfade[iSceneID] = 0;                                    // Geen fade
      TMotor.iMrichting[iSceneID] = 0;                               // Motor links om
    } 
    if ( a == 2){
      TLamp.iKfade[iSceneID] = 0;                                    // Geen fade
      TMotor.iMrichting[iSceneID] = 1;                               // Motor rechts om
    }
    if ( a == 3){
      TLamp.iKfade[iSceneID] = 1;                                    // Wel fade
      TMotor.iMrichting[iSceneID] = 0;                               // Motor links om
    }
    if ( a == 4){
      TLamp.iKfade[iSceneID] = 1;                                    // Wel fade
      TMotor.iMrichting[iSceneID] = 1;                               // Motor rechts om
    }
  } 



  if (counter == 5){                                          // iKwaarde1 deel 1
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
  }     

  if (counter == 6){                                                // iKwaarde1 deel 2
    b = iBTwaarde;
    iCheck = iCheck + b;                                            
    
    if (a != 0) {
      a = a * 100000000; 
    }
    if (b != 0) {
      b = b * 10000000;
    }
    
    c = a + b;
  }

  if (counter == 7){                                                // iKwaarde1 deel 3
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
    
  }  
          
  if (counter == 8){                                          // iKwaarde2 deel 1
    b = iBTwaarde;
    iCheck = iCheck + b;                                            
    
    if (a != 0) {
      a = a * 1000000; 
    }
    if (b != 0) {
       b = b * 100000;
    }
  
    c = c + a + b;
    
  }     

  if (counter == 9){                                                     // iKwaarde2 deel 2
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
  }

  if (counter == 10){                                                     // iKwaarde2 deel 3
    b = iBTwaarde;
    iCheck = iCheck + b;                                            

    if (a != 0) {
      a = a * 10000; 
    }
    if (b != 0) {
      b = b * 1000;
    }
    
    c = c + a + b;
    
  }

 
 
 if (counter == 11){                                          // iKwaarde3 deel 1
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
  }     

  if (counter == 12){                                                     // iKwaarde3 deel 2
    b = iBTwaarde;
    iCheck = iCheck + b;                                            
   
    if (a != 0) {
      a = a * 100; 
    }
    if (b != 0) {
      b = b * 10;
    }
    
    c = c + a + b;
  }

  if (counter == 13){                                                     // iKwaarde3 deel 3
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
    TLamp.iKleurwaardes[iSceneID] = c + a ;
    
  }


  if (counter == 14){                                          // Motor tijd deel 1
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
  }     

  if (counter == 15){                                                     // Motor tijd deel 2
    b = iBTwaarde;
    iCheck = iCheck + b;                                            
    
    if (a != 0) {
      a = a * 1000; 
    }
    if (b != 0) {
      b = b * 100;
    }
    
    c = a + b;
  }

  if (counter == 16){                                                     // Motor tijd deel 3
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
  }

  if (counter == 17){                                                     // Motor tijd deel 4
    b = iBTwaarde;
    iCheck = iCheck + b;                                            
  
    if (a != 0) {
      a = a * 10; 
    }

    TLamp.iKtijd[iSceneID] = c + a + b;
  } 


             
  if (counter == 18){                                          // iKwaarde3 deel 1
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
  }     

  if (counter == 19){                                               // iKwaarde3 deel 2
    b = iBTwaarde;
    iCheck = iCheck + b;                                            
    if (a != 0) {
      a = a * 10000; 
    }
    if (b != 0) {
      b = b * 1000;
    }
    
    c = a + b;
  }

  if (counter == 20){                                               // iKwaarde3 deel 2
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
   
  }

   if (counter == 21){                                              
    b = iBTwaarde;
    iCheck = iCheck + b;                                            
    if (a != 0) {
      a = a * 100; 
    }
    if (b != 0) {
      b = b * 10;
    }
    
    c = c + a + b;
  }

  if (counter == 22){                                              
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
    
    TMotor.iMpostijd[iSceneID] = c + a;
  }

  if (counter == 23){                                                    
    a = iBTwaarde;
    iCheck = iCheck + a;                                            
  }

  if (counter == 24){                                                     
    b = iBTwaarde;
 
    iCheck = iCheck + b; 
    iCheckFinal[iSceneID] = iCheck;
    if (a != 0){
      a = a*10; 
    }
    TMotor.iMsnelheid[iSceneID] = a+b;
  } 


  if (counter == 25) {                                          // CheckSum deel 1
    a = iBTwaarde;
  }     

  if (counter == 26) {                                                       
    b = iBTwaarde;
  }

  if (counter == 27) {                                                     // CheckSum deel 3
    c = iBTwaarde;  
    if (a != 0) {
      a = a * 100; 
    }

    if (b != 0){
      b = b*10; 
    }
   
    iCheckSum[iSceneID] = a + b + c;
    counter = 0;
    
    if (iCheckSum[iSceneID] == iCheck) {
      iAck = 1;
      iNack = 0;  
      iCheck = 0;
    }
    else {
      iAck = 0;
      iNack = 1;
      iCheck = 0;
    }
  }
 
  
  if (Serial.available() == 0){
    if (iNack == 1){
      Serial.print("0");
      iNack = 2;
    }
    else if ((iNack == 0) && (iAck == 1)){
      Serial.print("1");
      iAck= 0;
    }
    for (int x=1; x <=2; x++){
      for (int i=0; i <= 10; i++){
        Serial.print(TLamp.iKleurwaardes[i]);           // id5 - 3
        Serial.print(" ");
        Serial.print(TLamp.iKtijd[i]);              // id8 - 4
        Serial.print(" [");
        Serial.print(TLamp.iKfade[i]);              // id9 - 1a (fade)
        Serial.print(" ");
        Serial.print(TMotor.iMrichting[i]);         // id9 - 1b (motor richting)
        Serial.print("] ");
        Serial.print(TMotor.iMpostijd[i]);          // id10 - 4                 
        Serial.print(" ");
        Serial.print(TMotor.iMsnelheid[i]);         // id11 - 2
        Serial.print(" ");
        Serial.print(iCheckSum[i]);                 // id13 - 3
        Serial.print(" ");
        Serial.print(iCheckFinal[i]); 
        Serial.print(" -- ");                      
        delay(1000);
      }
    }
  }  
}

is my code,
this works, only i need both structs in an 2 dimension array.

TLamp[2];
TMotor[2];

when i do this and look in hyper terminal @ the serial.print it prints only 0’s.

was no room to compleet the post ;) so lets continue here.

i have no clue why i think it gets out of the SRAM. in the ideal case i would like to have

structs[2] ints in the struct [25].

Atmega16 has an SRAM of 1024 Some is already in use so +-800 is free.

i got 5 unsigned ints (2 bytes each) = 10 bytes 1 unsiged long (4 bytes)

so 1 packet = 14 bytes * 25 for int array = 350 *2 for struct array = 700.

also when i make just 1 thing two dimensional it turns in to 0's

example:

iKtijd[2][11]

i have no clue what i am doing wrong, ps when you have some other tips to make the source more effective they are welkom to :)

with kind regards

h2k

@ AlphaBeta i tryed to make them chars (1 byte). for the things that wil be only 0...9 but when i print them then i get smiles etc.

i print them then i get smiles etc

You’re printing them in ASCII, not in decimal. Try:

Serial.println (ch, DEC);

@Anachrocomputer, oke i wil use it with the DEC next time.

and Serial.println is a command i can't use either, when i use that 278 or something wil come on the stack of the bluetooth module. when i use Serial.print its oke and when i use /n the 278 comes again on the module.

*the source i posted in my 1st post works fine, when i make 1 varriable an 2 dimensional array everything gets 0.

for example: 

//iLampID wil only be 1 or 2 (the 0 of that array i never use)

usigned int iKfade[11]    =     unsigned int iKfade[3][11];
TLamp.iKleurwaardes[iSceneID] = c + a ;   = TLamp.iKleurwaardes[iLampID][iSceneID] = c + a ;

for printing i used an for loop 

for (x=1; x >= 2; x++){
    TLamp.iKleurwaardes[x][iSceneID]
}

regards

h2k