Go Down

Topic: (Major headache...!) - 1 line code crashes arduino (Read 810 times) previous topic - next topic

phil755

im making a drawing arduino, the code is messy (amature programmer) but faily simple...

only problem is when i uncomment either a call to;
drawLine(x,y);
random(x,y);
in the drawBoxP(int x, int y, int size, int count) function and upload the sketch the aruino doesnt hold LED high for 5 seconds but crashes Serial (even tho its not used) and forces TX high instead.....????????;

im sure im missing something simples and messy cooding to blame...

any help would be much apreaciated.....

phil






int data[50][50] = { ########### DATA ARRAY (0-255 int) ###############}


int StepUnit = 30;  

int w= 38*StepUnit;
int h= 28*StepUnit;

int x1= w/2;
int y1= h;

int a1= sqrt(pow(x1,2)+pow(y1,2));
int b1= sqrt(pow((w-x1),2)+pow(y1,2));

// Stepper motor objects: A is left, B is right
Stepper StepperA(motorStepsA, motorPinA1,motorPinA2, motorPinA3,motorPinA4);                                    
Stepper StepperB(motorStepsB, motorPinB1,motorPinB2, motorPinB3,motorPinB4);


void moveTo(int x2, int y2) {

 // Turn the stepper motors to move the marker from the current point (x1, y1) to (x2, y2)
 // Note: This only moves in a perfectly straight line if
 // the distance is the same in both dimensions; this should be fixed, but it works well

 // a2 and b2 are the final lengths of the left and right strings
 int a2 = sqrt(pow(x2,2)+pow(y2,2));
 int b2 = sqrt(pow((w-x2),2)+pow(y2,2));
 int stepA;
 int stepB;
 if (a2>a1) {
   stepA=1;
 }
 if (a1>a2) {
   stepA=-1;
 }
 if (a2==a1) {
   stepA=0;
 }
 if (b2>b1) {
   stepB=1;
 }
 if (b1>b2) {
   stepB=-1;
 }
 if (b2==b1) {
   stepB=0;
 }

 // Change the length of a1 and b1 until they are equal to the desired length
 while ((a1!=a2) || (b1!=b2)) {
   if (a1!=a2) {
     a1 += stepA;
     StepperA.step(stepA);
   }
   if (b1!=b2) {
     b1 += stepB;
     StepperB.step(-stepB);
   }
 }
 x1 = x2;
 y1=y2;
}

void drawLine(int x2, int y2)
{
 /*Serial.print("DL:");
  Serial.print(x1);
  Serial.print(":");
  Serial.print(y1);
  Serial.print("/");
  Serial.print(x2);
  Serial.print(":");
  Serial.println(y2);*/
 int X = x2-x1;
 int Y = y2-y1;
 int topX = x1;
 int topY = y1;
 int L = (int)sqrt(pow(X,2)+pow(Y,2));
 for (int i = 0; i <= L; i++)
 {
   int x = (int)(X * (double)((i+0.0)/L));
   int y = (int)(Y * (double)((i+0.0)/L));
   moveTo(x+topX,y+topY);
 }
}



void drawBoxP(int dbpsx, int dbpsy, int dbpsize, int dbpcount)
{

 int dbps = dbpsize/2;
 int dbpminX = dbpsx-dbps;
 int dbpminY = dbpsy-dbps;
 int dbpmaxX = dbpsx + dbps;
 int dbpmaxY = dbpsy + dbps;


//THESE ARE THE FUNCTION CALLS THAT FORCE CRASH

 // drawLine(dbpminX,dbpminY);
 //  drawLine(dbpminX,dbpmaxY);
 // drawLine(dbpmaxX,dbpmaxY);
 // drawLine(dbpmaxX,dbpminY);
 // drawLine(dbpminX,dbpminY);

 for (int dbpi = 0; dbpi<dbpcount;dbpi++)
 {

//THESE ARE THE FUNCTION CALLS THAT FORCE CRASH

   // blink(20);
   //    int dbptx = random(dbpminX,dbpmaxX);
   //int dbpty = random(dbpminY,dbpmaxY);
   //drawLine(dbptx,dbpty);

 }
}

int blink(int time)
{
 digitalWrite(13,HIGH);
 delay(time);
 digitalWrite(13,LOW);
}


void setup() {
 StepperA.setSpeed(4);                                                              
 StepperB.setSpeed(4);

 // Serial.begin(9600);
 delay(2000);  
 randomSeed(analogRead(0));
}                                                                                      




void loop()
{
 pinMode(13,OUTPUT);

 delay(500);
 digitalWrite(13,HIGH);
 delay(5000);
 digitalWrite(13,LOW);


 int rows = 50;
 int cols = 50;  

 int size = 10;
 int count=0;


 int sX = x1-((cols*size)/2);
 int sY = y1+20;

 int nX = sX;
 int nY = sY;
 int xX = sX+(cols*size);
 int xY = sY+(rows*size);

 drawLine(nX,nY);
 drawLine(nX,xY);
 drawLine(xX,xY);
 drawLine(xX,nY);
 drawLine(nX,nY);


 for (int yi = 0; yi < rows; yi++)
 {
   for (int xi = 0; xi < cols; xi++)
   {
     count++;
     int px = sX+(size*xi);
     int py = sY+(size*yi);
     int i = (data[yi][xi]/5.0);
     drawBoxP(px,py,size,i);
   }
 }  
}

Coding Badly


Please modify your post and put code tags (
  • button) around the code.

    Which board are you using?

westfw

Quote
int data[50][50]

This is 5000 bytes of data, which is more than there is space for data on the Arduino (unless you have a MEGA with 1280 or 2560 CPU.)  Neither the Arduino IDE nor the CPU itself detects this sort of error, causing all sorts of strange crash-like behavior.

PaulS

While you are fixing the oversize array, take a look at this statement:
Code: [Select]
int L = (int)sqrt(pow(X,2)+pow(Y,2));
and this page:
http://arduino.cc/en/Reference/Pow
The pow() function expects two floats, not two ints. So, a cast is performed to convert the ints to floats, so that pow can effectively do this for you: X * X.

Instead of the casts and the overhead of a relatively inefficient algorithm, just multiply the number by itself.

One last observation. Executable code must be in a function.
Code: [Select]
int w= 38*StepUnit;
int h= 28*StepUnit;

int x1= w/2;
int y1= h;

int a1= sqrt(pow(x1,2)+pow(y1,2));
int b1= sqrt(pow((w-x1),2)+pow(y1,2));

None of this code will do what you think it will.

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy