I am learning (and trying to teach) electronics/programming with some friends. We have decided to build a LED cube using a launchpad for our task.
Here's the issue we run into:
For our animations, we store them in a two dimensional array. We get error if we define array as constant
I don't want this array to be in RAM, because we don't have very much available.
EDIT: See below for code
I hope this is posted in the correct place.
At not time (I think?) am I changing any array, they are all set one time by hand and just looped over. I'm unsure of what is trying to be (implicitly?) converted
Info if needed:
MSP430G2553 16kB Flash 0.5kB RAM
Thanks for your help
UPDATE: Well HansPassant told me why that error was showing up. But I still get a RAM overflow (Apparently it isn't being stored in flash?)
Another thing I tried is instead of #define RON (Row ON) I declared it as const too. (so when an animation array was created, it was created explicitly with only constants) I had hoped that would store it in flash.
Here's the entirety of code if needed:
#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);
// }
}
And the error that exists:
c:/users/dan/appdata/local/energi~1/hardware/tools/msp430/bin/../lib/gcc/msp430/4.6.3/../../../../msp430/bin/ld.exe:
region `ram' overflowed by 142 bytes collect2: ld returned 1 exit status
not sure this will help, but to ld you can specifiy the memory area to use, see the docs.
That apart, you're wasting much space for a bit, using an integer. The easier way to reduce memory: change const int frontFrame[3][9]
to const BYTE frontFrame[3][9]
, after declaration of typedef unsigned char BYTE
.
You can spare more if you use bits to represent bits:
#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)}
};
and you will test a bit (in displayFrame) using
for (int r = 0; r < ROWS_NUM; ++r)
for (int c = 0; c < COLS_NUM; ++c)
if (frame[r] & ON(c)) { ... }
I would also try to add static
in front of data declaration, but most probably this would have no effect on memory placement.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With