10

私は何人かの友達とエレクトロニクス/プログラミングを学んでいます (そして教えようとしています)。タスクのために、ランチパッドを使用して LED キューブを作成することにしました。

私たちが遭遇する問題は次のとおりです。

アニメーションの場合、それらを 2 次元配列に格納します。配列を定数として定義するとエラーが発生します

この配列を RAM に配置したくありません。利用できる領域があまりないからです。

編集:コードについては以下を参照してください

これが正しい場所に投稿されることを願っています。
いつでも(私は思う?)配列を変更していません。それらはすべて手動で一度設定され、ループされます。何が (暗黙的に?) 変換されようとしているのかわからない

必要に応じて情報:

MSP430G2553 16kB フラッシュ 0.5kB RAM

ご協力いただきありがとうございます

更新: HansPassant が、エラーが表示される理由を教えてくれました。しかし、まだ RAM オーバーフローが発生します (明らかに、フラッシュに保存されていませんか?)

私が試したもう 1 つのことは、#define RON (Row ON) の代わりに、const としても宣言しました。(そのため、アニメーション配列が作成されたときに、定数のみで明示的に作成されました)フラッシュに保存することを望んでいました。

必要に応じて、コード全体を次に示します。

#define povDelay delayMicroseconds(200) // POV Delay

const int CON = LOW;
const int COFF = HIGH;
const int RON = HIGH;
const int ROFF = LOW;

const int col[9] = {P1_0, P1_1, P1_2, P1_3, P1_4, P1_5, P2_0, P2_1, P2_2};
const int row[3] = {P1_6, P1_7, P2_3};

void setup()
{
 // Serial.begin(9600);
  for (int i = 0; i < 9; i++)
  {
    pinMode(col[i], OUTPUT);
    digitalWrite(col[i], COFF);
  }
  for (int i = 0; i < 3; i++)
  {
    pinMode(row[i], OUTPUT);
    digitalWrite(row[i], ROFF);
  }
}

void sideToSide(int delayTime)
{
  int sideDelay = 1000;
  // Left Frame
  const int leftFrame[3][9] = {
     {CON, COFF, COFF, CON, COFF, COFF, CON, COFF, COFF},
     {CON, COFF, COFF, CON, COFF, COFF, CON, COFF, COFF},
     {CON, COFF, COFF, CON, COFF, COFF, CON, COFF, COFF}
   };
  // Middle Frame
  const int middleFrame[3][9] = {
     {COFF, CON, COFF, COFF, CON, COFF, COFF, CON, COFF},
     {COFF, CON, COFF, COFF, CON, COFF, COFF, CON, COFF},
     {COFF, CON, COFF, COFF, CON, COFF, COFF, CON, COFF}
    };
  // Right Frame
  const int rightFrame[3][9] = {
     {COFF, COFF, CON, COFF, COFF, CON, COFF, COFF, CON},
     {COFF, COFF, CON, COFF, COFF, CON, COFF, COFF, CON},
     {COFF, COFF, CON, COFF, COFF, CON, COFF, COFF, CON}
   };




  // Display this animation 3 times (Frame 1, Frame 2, Frame 3, Frame 2)
  for (int i = 0; i < 4; i++)
  {
    displayFrame(leftFrame, delayTime);
    displayFrame(middleFrame, delayTime);
    displayFrame(rightFrame, delayTime);
    displayFrame(middleFrame, delayTime);
  }
  // Last animation
  displayFrame(leftFrame, delayTime);



} // ############ END SIDE TO SIDE

void frontToBack(int delayTime)
{
    // Left Frame
  const int frontFrame[3][9] = {
     {CON, CON, CON, COFF, COFF, COFF, COFF, COFF, COFF},
     {CON, CON, CON, COFF, COFF, COFF, COFF, COFF, COFF},
     {CON, CON, CON, COFF, COFF, COFF, COFF, COFF, COFF}
   };
  // Middle Frame
  const int middleFrame[3][9] = {
     {COFF, COFF, COFF, CON, CON, CON, COFF, COFF, COFF},
     {COFF, COFF, COFF, CON, CON, CON, COFF, COFF, COFF},
     {COFF, COFF, COFF, CON, CON, CON, COFF, COFF, COFF}
    };
  // Right Frame
  const int backFrame[3][9] = {
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, CON, CON},
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, CON, CON},
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, CON, CON}
   };




  // Display this animation 3 times (Frame 1, Frame 2, Frame 3, Frame 2)
  for (int i = 0; i < 4; i++)
  {
    displayFrame(frontFrame, delayTime);
    displayFrame(middleFrame, delayTime);
    displayFrame(backFrame, delayTime);
    displayFrame(middleFrame, delayTime);
  }
  // Last animation
  displayFrame(frontFrame, delayTime);


}  // ############# END FRONT TO BACK


void diagFunctionOne(int delayTime)
{
  const int firstFrame[3][9] = {
     {CON, COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF},
     {CON, COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF},
     {CON, COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF}
  };
  const int secondFrame[3][9] = {
     {COFF, CON, COFF, CON, COFF, COFF, COFF, COFF, COFF},
     {COFF, CON, COFF, CON, COFF, COFF, COFF, COFF, COFF},
     {COFF, CON, COFF, CON, COFF, COFF, COFF, COFF, COFF}
  };
  const int thirdFrame[3][9] = {
     {COFF, COFF, CON, COFF, CON, COFF, CON, COFF, COFF},
     {COFF, COFF, CON, COFF, CON, COFF, CON, COFF, COFF},
     {COFF, COFF, CON, COFF, CON, COFF, CON, COFF, COFF}
  };
  const int forthFrame[3][9] = {
     {COFF, COFF, COFF, COFF, COFF, CON, COFF, CON, COFF},
     {COFF, COFF, COFF, COFF, COFF, CON, COFF, CON, COFF},
     {COFF, COFF, COFF, COFF, COFF, CON, COFF, CON, COFF}
  };
  const int fifthFrame[3][9] = {
     {COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF, CON},
     {COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF, CON},
     {COFF, COFF, COFF, COFF, COFF, COFF, COFF, COFF, CON}
  };
  // Start from 7
  const int sixthFrame[3][9] = {
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, COFF, COFF},
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, COFF, COFF},
     {COFF, COFF, COFF, COFF, COFF, COFF, CON, COFF, COFF}
  };
  const int seventhFrame[3][9] = {
     {COFF, COFF, COFF, CON, COFF, COFF, COFF, CON, COFF},
     {COFF, COFF, COFF, CON, COFF, COFF, COFF, CON, COFF},
     {COFF, COFF, COFF, CON, COFF, COFF, COFF, CON, COFF}
  };
  const int eighthFrame[3][9] = {
     {CON, COFF, COFF, COFF, CON, COFF, COFF, COFF, CON},
     {CON, COFF, COFF, COFF, CON, COFF, COFF, COFF, CON},
     {CON, COFF, COFF, COFF, CON, COFF, COFF, COFF, CON}
  };
  const int ninthFrame[3][9] = {
     {COFF, CON, COFF, COFF, COFF, CON, COFF, COFF, COFF},
     {COFF, CON, COFF, COFF, COFF, CON, COFF, COFF, COFF},
     {COFF, CON, COFF, COFF, COFF, CON, COFF, COFF, COFF}
  };
  const int tenthFrame[3][9] = {
     {COFF, COFF, CON, COFF, COFF, COFF, COFF, COFF, COFF},
     {COFF, COFF, CON, COFF, COFF, COFF, COFF, COFF, COFF},
     {COFF, COFF, CON, COFF, COFF, COFF, COFF, COFF, COFF}
  };

    for (int i = 0; i < 4; i++)
  {
    displayFrame(firstFrame, delayTime);
    displayFrame(secondFrame, delayTime);
    displayFrame(thirdFrame, delayTime);
    displayFrame(forthFrame, delayTime);
    displayFrame(fifthFrame, delayTime);
    displayFrame(sixthFrame, delayTime);
    displayFrame(seventhFrame, delayTime);
    displayFrame(eighthFrame, delayTime);
    displayFrame(ninthFrame, delayTime);
    displayFrame(tenthFrame, delayTime);
  }
}



/*

#####################################################
#####################################################
#####################################################
######################################################
#######################################################


*/






// Takes a frame and displays it for the length of animation delay (in ms)
void displayFrame(const int frame[3][9], int animationDelay)
{
 // Serial.println("displayFrame called");
 unsigned long currentTime = millis();

 while (1) // Do this continually until animationDelay is met
 {
 int i, j;
 // Rows
 for (i = 0; i < 3; i++)
 {
   // Turn correct ROW on
   digitalWrite(row[i], RON);

   // Columns
   for (j = 0; j < 9; j++)
   {
     // Turn correct COLUMNS on
     digitalWrite(col[j], frame[i][j]);

   } // End J loop

   povDelay;
   digitalWrite(row[i], ROFF);

 } // End I Loop

 if ((millis() - currentTime) >= animationDelay)
 {
   delay(10);
   // Cleanup, Turn all OFF
  for (int i = 0; i < 9; i++)
    {
      digitalWrite(col[i], COFF);
    }
    for (int i = 0; i < 3; i++)
    {
      digitalWrite(row[i], ROFF);
    }

   delay(10); // timefix?

   return;

 } // End time test if statement

 }


}


void loop()
{
  diag(350);
  sideToSide(350);
  frontToBack(350);


//  for (int i = 0; i < 9; i++)
//  {
//    digitalWrite(col[i], CON);
//  }
//  for (int i = 0; i < 3; i++)
//  {
//    digitalWrite(row[i], RON);
//    delay(250);
//    digitalWrite(row[i], ROFF);
//  }

}

そして存在するエラー:

c:/users/dan/appdata/local/energi~1/hardware/tools/msp430/bin/../lib/gcc/msp430/4.6.3/../../../../msp430/bin/ld.exe:

領域「ram」が 142 バイトでオーバーフローしました collect2: ld は 1 終了ステータスを返しました

4

1 に答える 1

3

これが役立つかどうかはわかりませんが、使用するメモリ領域を指定できます。ドキュメントを参照してください。

それとは別に、整数を使用すると、少しの間多くのスペースを無駄にしています。メモリを減らす簡単な方法:の宣言の後に、 に変更const int frontFrame[3][9]します。const BYTE frontFrame[3][9]typedef unsigned char BYTE

ビットを使用してビットを表すと、さらに節約できます。

#define ON(b) (1 << b)

const int frontFrame[3] = {
     {ON(8) | ON(7) | ON(6)},
     {ON(8) | ON(7) | ON(6)},
     {ON(8) | ON(7) | ON(6)}
};

そして、少し (displayFrame で) テストします。

for (int r = 0; r < ROWS_NUM; ++r)
  for (int c = 0; c < COLS_NUM; ++c)
    if (frame[r] & ON(c)) { ... }

また、データ宣言の前に追加しようとしstaticますが、おそらくこれはメモリ配置には影響しません。

于 2013-03-23T07:06:16.420 に答える