Loading...
Pages: [1]   Go Down
Author Topic: Serial Freezing  (Read 565 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have a strange issue with Serial: it will sometimes freeze mid-message (i.e. Serial.print("This is my message"); will only print "This is m" and then nothing). The TX light on the Uno is no longer lit, and as far as I can tell, the entire program locks up. Any idea what could be causing this and/or what I might try to fix it?
Logged

0
Online Online
Tesla Member
***
Karma: 50
Posts: 6547
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Any idea what could be causing this and/or what I might try to fix it?

Posting your code is the usual start.
Logged

Why I like my 2005 rio yellow Honda S2000 with the top down, and more!
GOOGLE ADVANCED FORUM SEARCH BELOW!  
Go to:  http://www.google.com/advanced_search?hl=en
put in key search words,
use site or domain:  http://arduino.cc/forum
or in a google search box put key words site:http://arduino.cc/forum

Copenhagen / Denmark
Offline Offline
Edison Member
*
Karma: 5
Posts: 2338
Do it !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Probably a memory issue, but without your code it's impossible to tell.
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 35507
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

It is also important to tell us what you are talking to.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have a 360 degree continuous motion servo attached to a rod. The interrupt is one of the channel pins on a wheel watcher watching the rotation of the rod. At the top of the rod is an infrared distancer and an ultrasonic one.

Code:
#include <Servo.h>

#define SCAN_RESOLUTION 1

#define ULTRASONIC_CONTROL_PIN 7
#define ULTRASONIC_READ_PIN A1
#define INFRARED_PIN A0

unsigned int ultraSonicDistance = 0;
double infraredValue = 0.0;
double infraredDistance = 0.0;
volatile int xAngle = 0; //Goes from 0-300 covering 1 full circle
//int yAngle = 0;
Servo xServo;
//Servo yServo;
int xServoDirection = SCAN_RESOLUTION;
int yServoDirection = SCAN_RESOLUTION;
boolean highResScan = false;

double surroundingsMap[300] = {0};

void setup()
{
  Serial.begin(9600);
 
  xServo.attach(9,492,2348); //values found experimentally to make write(90) say stop
  //yServo.attach(10);
  attachInterrupt(0,stopXServo,FALLING);
  pinMode(ULTRASONIC_CONTROL_PIN,OUTPUT);
  digitalWrite(ULTRASONIC_CONTROL_PIN,LOW);
}

void loop()
{
  xServo.write(90 + (xServoDirection*2)); //90 is "don't move"
  Serial.print(90 + (xServoDirection*2));
  Serial.print(" ");
  Serial.println(xAngle);
  if(highResScan)
    delay(100);
}

void readInfrared()
{
  infraredValue = analogRead(INFRARED_PIN);
  infraredValue *= .0049;
  infraredDistance = 3*pow((infraredValue-3),4) + 15;
}

void readUltrasonic()
{
  digitalWrite(ULTRASONIC_CONTROL_PIN,HIGH);
  delayMicroseconds(20);
  ultraSonicDistance = analogRead(ULTRASONIC_READ_PIN);
  digitalWrite(ULTRASONIC_CONTROL_PIN,LOW);
}

void stopXServo()

  xServo.write(90);
  readInfrared();
  ultraSonicDistance = infraredDistance;
  if(highResScan)
    readUltrasonic();
 
  surroundingsMap[xAngle] = (infraredDistance+ultraSonicDistance)/2;
  xAngle += xServoDirection;
  if(xAngle == 300)
  {
    xAngle = 0;
    //xServoDirection *= -1;
    /*yServo.write(yServo.read()+yServoDirection);
    if(yAngle == 90 || yAngle == 0)
      yServoDirection *= -1;*/
  }
}

The serial communication stops, as does the rotation of my servo/rod setup, around xAngle = 295 to 298.
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 35507
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
double surroundingsMap[300] = {0};
1200 bytes of memory used, right there. Is this on a 328-based Arduino, with 2048 bytes of memory?

Changing the resolution of the values stored, so that one unit is say 1/10" of an inch or 1/4 of a centimeter would cut your storage requirements in half.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Changing the resolution of the values stored, so that one unit is say 1/10" of an inch or 1/4 of a centimeter would cut your storage requirements in half.

While you're correct, and I probably should change the resolution of my scan, I'm not sure what you mean by "1/10" " since this is a rotational scale, not a linear one. The 300 is the number of ticks in a complete turn on my encoder.
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 35507
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
I'm not sure what you mean by "1/10" " since this is a rotational scale, not a linear one.
The index is a rotational value. The data stored in the array is distance data. If you used ints, and stored 10ths of inches (78, instead of 7.8, for example), you'd use only half as much memory.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Oh, I see what you're getting at now. I found my problem with Serial freezing, too. I noticed I had a print in an interrupt, which doesn't work.
Logged

Pages: [1]   Go Up
Print
 
Jump to: