Pages: [1]   Go Down
Author Topic: Uno hanging  (Read 857 times)
0 Members and 1 Guest are viewing this topic.
Bute, Scotland
Offline Offline
Jr. Member
**
Karma: 0
Posts: 86
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

When I uploaded this code it locked up the arduino in that the TX light stays on.  
The sketch does continue to output to the serial monitor but
the output is not correct as it does not set the time correctly on the RTC
Also when I attempt to upload a different sketch the LED marked as L on the board flashes for
a few seconds just before the upload fails with the message:
Quote
processing.app.SerialNotFoundException: Serial port '/dev/ttyACM0' not
found.  Did you select the right one from the Tools > Serial Port
menu?
        at processing.app.Serial.<init>(Serial.java:153)
        at processing.app.Serial.<init>(Serial.java:76)
        at processing.app.debug.Uploader.flushSerialBuffer(Uploader.java:75)
        at processing.app.debug.AvrdudeUploader.uploadViaBootloader(AvrdudeUploader.java:93)
        at processing.app.debug.AvrdudeUploader.uploadUsingPreferences(AvrdudeUploader.java:56)
        at processing.app.Sketch.upload(Sketch.java:1603)
        at processing.app.Sketch.exportApplet(Sketch.java:1568)
        at processing.app.Sketch.exportApplet(Sketch.java:1524)
        at processing.app.Editor$DefaultExportHandler.run(Editor.java:2293)
        at java.lang.Thread.run(Thread.java:636)

It is ok if I comment out the part in the loop so date/time setup part
seems to work.
I also uncommented the part which reads date/time from the DS1307 and
just prints the hour and minutes  and these are correct!
Can anyone spot what is wrong?

Here is the code:
Code:
/*
 Example 7.3
 reading and writing to the Maxim DS1307 real time clock IC
 tronixstuff.com/tutorials
 based on code by Maurice Ribble
 17-4-2008 - http://www.glacialwanderer.com/hobbyrobotics

 */

#include "Wire.h"
#define DS1307_I2C_ADDRESS 0x68

// Convert normal decimal numbers to binary coded decimal
byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );

}

// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );

}

// 1) Sets the date and time on the ds1307
// 2) Starts the clock
// 3) Sets hour mode to 24 hour clock

// Assumes you're passing in valid numbers

void setDateDs1307(byte second,        // 0-59
byte minute,        // 0-59
byte hour,          // 1-23
byte dayOfWeek,     // 1-7
byte dayOfMonth,    // 1-28/29/30/31
byte month,         // 1-12
byte year)          // 0-99
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.send(0);
  Wire.send(decToBcd(second));    // 0 to bit 7 starts the clock
  Wire.send(decToBcd(minute));
  Wire.send(decToBcd(hour));
  Wire.send(decToBcd(dayOfWeek));
  Wire.send(decToBcd(dayOfMonth));
  Wire.send(decToBcd(month));
  Wire.send(decToBcd(year));
  Wire.send(00010000); // sends 0x10 (hex) 00010000 (binary) to
control register - turns on square wave
  Wire.endTransmission();

}

// Gets the date and time from the ds1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  // Reset the register pointer
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.send(0);
  Wire.endTransmission();

  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);

  // A few of these need masks because certain bits are control bits
  *second     = bcdToDec(Wire.receive() & 0x7f);
  *minute     = bcdToDec(Wire.receive());
  *hour       = bcdToDec(Wire.receive() & 0x3f);  // Need to change
this if 12 hour am/pm
  *dayOfWeek  = bcdToDec(Wire.receive());
  *dayOfMonth = bcdToDec(Wire.receive());
  *month      = bcdToDec(Wire.receive());
  *year       = bcdToDec(Wire.receive());

}

void setup()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  Wire.begin();
  Serial.begin(9600);

  // Change these values to what you want to set your clock to.
  // You probably only want to set your clock once and then remove
  // the setDateDs1307 call.

  second = 0;
  minute = 40;
  hour = 22;
  dayOfWeek = 5;
  dayOfMonth = 14;
  month = 5;
  year = 11;
setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month,
year);

}

void loop()
{
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth,
&month, &year);
  Serial.print(hour, DEC);// convert the byte variable to a decimal
number when being displayed
  Serial.print(":");
  if (minute<10)
  {
      Serial.print("0");
  }
  Serial.print(minute, DEC);
  Serial.print(":");
  if (second<10)
  {
      Serial.print("0");
  }
  Serial.print(second, DEC);
  Serial.print("  ");
  Serial.print(dayOfMonth, DEC);
  Serial.print("/");
  Serial.print(month, DEC);
  Serial.print("/");
  Serial.print(year, DEC);
  Serial.print("  Day of week:");
  switch(dayOfWeek){
  case 1:
    Serial.println("Sunday");
    break;
  case 2:
    Serial.println("Monday");
    break;
  case 3:
    Serial.println("Tuesday");
    break;
  case 4:
    Serial.println("Wednesday");
    break;
  case 5:
    Serial.println("Thursday");
    break;
  case 6:
    Serial.println("Friday");
    break;
  case 7:
    Serial.println("Saturday");
    break;
  }
  //  Serial.println(dayOfWeek, DEC);
  delay(1000);

}
If anyone tries this code and doesn't know what to do to reset the arduino then look here:
http://arduino.cc/forum/index.php/topic,53995.0.html
I had to get the timing of the upload just right. and it took about a dozen tries before I succeeded.

I am running Ubuntu 10.10
tia
Norman
« Last Edit: April 17, 2011, 09:29:18 am by buteman » Logged

Pages: [1]   Go Up
Jump to: