SM errors

Good day, i’m new here and have a question:)

I recently pulled the IR codes from a remote control using a IR reciever hooked up to arduino.
The codes are stored in a .h file, the arduino retrieves them via a if that compares them to the button pressed. The problem is that the number of if’s is >8 the Serial Monitor stops displaying. If I delete the 8th if the serial monitor displays what it should, but normally this limits me to only 8 buttons on a 21 button remote. Some help?

/* Raw IR commander
 
 This sketch/program uses the Arduno and a PNA4602 to 
 decode IR received.  It then attempts to match it to a previously
 recorded IR signal
 
 Code is public domain, check out www.ladyada.net and adafruit.com
 for more tutorials! 
 */

// We need to use the 'raw' pin reading methods
// because timing is very important here and the digitalRead()
// procedure is slower!
//uint8_t IRpin = 2;
// Digital pin #2 is the same as Pin D2 see
// http://arduino.cc/en/Hacking/PinMapping168 for the 'raw' pin mapping
#define IRpin_PIN      PIND
#define IRpin          2

// the maximum pulse we'll listen for - 65 milliseconds is a long time
#define MAXPULSE 65000

// what our timing resolution should be, larger is better
// as its more 'precise' - but too large and you wont get
// accurate timing
#define RESOLUTION 20 

// What percent we will allow in variation to match the same code
#define FUZZINESS 20

// we will store up to 100 pulse pairs (this is -a lot-)
uint16_t pulses[100][2];  // pair is high and low pulse 
uint8_t currentpulse = 0; // index for pulses we're storing

#include "ircodes.h"

void setup(void) {
  Serial.begin(9600);
  Serial.println("Ready to decode IR!");
}

void lows()
{
  digitalWrite(9,LOW);
  digitalWrite(8,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);
}

void loop(void) {
  int numberpulses;
  
  numberpulses = listenForIR();
  
  Serial.print("Heard ");
  Serial.print(numberpulses);
  Serial.println("-pulse long IR signal");
  if (IRcompare(numberpulses, but0))
    {Serial.println("0");lows();digitalWrite(8,HIGH);}
    if (IRcompare(numberpulses, but1)) 
    {Serial.println("1");lows();digitalWrite(9,HIGH);}
     if (IRcompare(numberpulses, but2)) 
    {Serial.println("2");lows();digitalWrite(10,HIGH);}
     if (IRcompare(numberpulses, but3)) 
    {Serial.println("3");lows();digitalWrite(10,HIGH);}
     if (IRcompare(numberpulses, but4)) 
    {Serial.println("4");lows();digitalWrite(10,HIGH);}
    if (IRcompare(numberpulses, but5)) 
    {Serial.println("5");lows();digitalWrite(10,HIGH);}
     if (IRcompare(numberpulses, but6)) 
    {Serial.println("6");lows();digitalWrite(10,HIGH);}
    if (IRcompare(numberpulses, but7)) 
    {Serial.println("7");lows();digitalWrite(10,HIGH);}
      if (IRcompare(numberpulses, but8)) 
    {Serial.println("8");lows();digitalWrite(10,HIGH);}
    if (IRcompare(numberpulses, but9)) 
    {Serial.println("9");lows();digitalWrite(10,HIGH);}
 
}
boolean IRcompare(int numpulses, int Signal[]) {
  
  for (int i=0; i< numpulses-1; i++) {
    int oncode = pulses[i][1] * RESOLUTION / 10;
    int offcode = pulses[i+1][0] * RESOLUTION / 10;
    
    /*
    Serial.print(oncode); // the ON signal we heard
    Serial.print(" - ");
    Serial.print(Signal[i*2 + 0]); // the ON signal we want 
    */
    
    // check to make sure the error is less than FUZZINESS percent
    if ( abs(oncode - Signal[i*2 + 0]) <= (Signal[i*2 + 0] * FUZZINESS / 100)) {
      //Serial.print(" (ok)");
    } else {
      //Serial.print(" (x)");
      // we didn't match perfectly, return a false match
      return false;
    }
    
    /*
    Serial.print("  \t"); // tab
    Serial.print(offcode); // the OFF signal we heard
    Serial.print(" - ");
    Serial.print(Signal[i*2 + 1]); // the OFF signal we want 
    */
    
    if ( abs(offcode - Signal[i*2 + 1]) <= (Signal[i*2 + 1] * FUZZINESS / 100)) {
      //Serial.print(" (ok)");
    } else {
      //Serial.print(" (x)");
      // we didn't match perfectly, return a false match
      return false;
    }
    
    //Serial.println();
  }
  // Everything matched!
  return true;
}

int listenForIR(void) {
  currentpulse = 0;
  
  while (1) {
    uint16_t highpulse, lowpulse;  // temporary storage timing
    highpulse = lowpulse = 0; // start out with no pulse length
  
//  while (digitalRead(IRpin)) { // this is too slow!
    while (IRpin_PIN & (1 << IRpin)) {
       // pin is still HIGH

       // count off another few microseconds
       highpulse++;
       delayMicroseconds(RESOLUTION);

       // If the pulse is too long, we 'timed out' - either nothing
       // was received or the code is finished, so print what
       // we've grabbed so far, and then reset
       if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
         return currentpulse;
       }
    }
    // we didn't time out so lets stash the reading
    pulses[currentpulse][0] = highpulse;
  
    // same as above
    while (! (IRpin_PIN & _BV(IRpin))) {
       // pin is still LOW
       lowpulse++;
       delayMicroseconds(RESOLUTION);
       if ((lowpulse >= MAXPULSE)  && (currentpulse != 0)) {
         return currentpulse;
       }
    }
    pulses[currentpulse][1] = lowpulse;

    // we read one high-low pulse successfully, continue!
    currentpulse++;
  }
}

void printpulses(void) {
  Serial.println("\n\r\n\rReceived: \n\rOFF \tON");
  for (uint8_t i = 0; i < currentpulse; i++) {
    Serial.print(pulses[i][0] * RESOLUTION, DEC);
    Serial.print(" usec, ");
    Serial.print(pulses[i][1] * RESOLUTION, DEC);
    Serial.println(" usec");
  }
  
  // print it in a 'array' format
  Serial.println("int IRsignal[] = {");
  Serial.println("// ON, OFF (in 10's of microseconds)");
  for (uint8_t i = 0; i < currentpulse-1; i++) {
    Serial.print("\t"); // tab
    Serial.print(pulses[i][1] * RESOLUTION / 10, DEC);
    Serial.print(", ");
    Serial.print(pulses[i+1][0] * RESOLUTION / 10, DEC);
    Serial.println(",");
  }
  Serial.print("\t"); // tab
  Serial.print(pulses[currentpulse-1][1] * RESOLUTION / 10, DEC);
  Serial.print(", 0};");
}

The thing I’m talking about is at the start of the loop. With all ifs it dosen’t display anything, with only 8 it displays the Ready Message.
Any Help? (Ignore the digital writes 10…don’t think that’s the problem…)

The thing I'm talking about is at the start of the loop. With all ifs it dosen't display anything, with only 8 it displays the Ready Message.

I don't see a lot of if's in loop(). All I see are:

     if ((highpulse >= MAXPULSE) && (currentpulse != 0)) {
     if ((lowpulse >= MAXPULSE)  && (currentpulse != 0)) {

That's only 2. So what 8 are you referring to?

sorry I posted the wrong code..sorry ...I edited and put the corect one:)

Each new if test you perform adds more code and more strings to SRAM. It appears as though you are running out of SRAM.

is there any way I can optimize the code to solve this problem?

is there any way I can optimize the code to solve this problem?

First, you need to see if it IS the problem. Search the forum for a function called FreeMemory.

If it really is your problem, you could most likely reduce the size of pulses. That array is the biggest consumer of memory that I see.

Which Arduino are you using?

DFRduino Duemilanove 328.
You say the array eats memory..if I tidy the .h file holding the arrays it may resolve the problem?
I will look in what you said when I have time for it:)