Go Down

Topic: DS1307 adrress register help ! (Read 5436 times) previous topic - next topic

CrossRoads

Please do a CTRL-T when you make the changes, will help check that the { and } are all paired up.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

halejandro

#46
Aug 17, 2011, 06:07 am Last Edit: Aug 17, 2011, 06:10 am by halejandro Reason: 1
Ok, I made the changes, but I have a problem I can´t access to any function, I tested several ways but they didn´t work! the code is to big where can I send it to you?
I am Learning, please be Patient !

CrossRoads

Post it here - just take out
case 1:
:
:
case 7:

for the 'E' and 'F' commands to shorten it up, paste them back in after getting just case '0' working.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

halejandro

Code: [Select]
/*
Test of RTC DS1307 via I2C.
Counts
Seconds,
Minutes,
Hours,
Date of the Month,
Month,
Day of the week, and
Year with Leap-Year

56 bytes battery backed RAM
Square Wave Output, can connect to INT2/D6 or PD7
*/

/*
Modified to Run thru IDE Serial port
*/
#include <Wire.h>

//variables
byte seconds_address = 0x00;
byte seconds; // bit 7 = Clock Halt, Enabled = 0, Halt = 1
// bits 6-5-3 = tens of seconds 0-6,  bits 3-2-1-0 = units of seconds, 0-9

byte minutes_address = 0x01;
byte minutes;  // bits 6-5-4 = tens of minutes, bits 3-2-1-0 = units of minutes

byte hours_address = 0x02;
byte hours;  // 7=0. 6 = 1 for 12 hr, 0 for 24 hr.
// bit 5: 12 hr mode = AM(0)/PM(1). 24 hr mode = upper tens of hrs
// bit 4 =  lower tens of hrs, bits 3-2-1-0 = units of hours (0-9)

byte day_week_address = 0x03;
byte day_week = 0; // range 01-07

byte date_month_address = 0x04;
byte date_month = 0; // range 01-31

byte month_address = 0x05;
byte month = 0; // range 01-12

byte year_address = 0x06;
int year = 0; // upper byte 0-9, lower byte 0-9

byte square_address = 0x07;
byte sqwe = 0;  // square wave enable
// Out-0-0-Sqwe-0-0-RS1-RS0
// Out, Sqwe = 0/0 - Square wave output = 0
// Out, Sqwe = 1/0 - Square wave output = 1
// Out, Sqwe = 0/1 or 1/1 - Square wave output per RS1/RS0
// RS1/RS0 = 00 = 1 Hz
// RS1/RSo = 01 = 4 KHz
// RS1/RS0 = 10 = 8 KHz
// RS1/RS0 = 11 = 32 KHz

byte RTC_ram_address = 0x08; //range = 08-63, 0x08-0x3F

int RTC_address = 0x68; // 1101 000

byte incomingCommand = 0;
byte RTC_write_command = 0;
byte RTC_read_command = 0;
byte RTC_ram_command = 0;

// use F0xx, F1xx,F2xx, F3xx, F4xx, F5xx, F6xx, F7xx
// to send one register write commands
// use E0xx to read registers back - not coded yet
// use C0xx to read RAM back - not coded yet

byte incomingRegister = 0;
byte RTC_register = 0;
byte incomingData1 = 0;
byte incomingData2 = 0;
byte new_data = 0;
byte outgoingData = 0;
int delay_time = 100;

unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
unsigned long duration = 5000;

void setup() {
  Wire.begin(); // no address, we are master
  Serial.begin (57600); 
  Serial.flush();
  currentMillis = millis(); 
}

void loop() {

  if (Serial.available() >3){
    incomingCommand = Serial.read();
    incomingRegister = Serial.read();
    incomingData1 = Serial.read();
    incomingData1 = incomingData1 - 0x30; // convert ASCII to HEX
    incomingData2 = Serial.read();
    incomingData2 = incomingData2 - 0x30;  // convert ASCII to HEX
    new_data = (incomingData1 << 4) + incomingData2;  // put the Upper/Lower nibbles together
    Serial.print ("command ");
    Serial.println (incomingCommand);
    Serial.print ("register ");
    Serial.println(incomingRegister);
    Serial.print ("data1 ");
    Serial.println (incomingData1, HEX);
    Serial.print ("data2 ");
    Serial.println (incomingData2, HEX);
    Serial.print ("combined data ");   
    Serial.println (new_data, HEX);

  }
  // *******************************************
  if ((incomingCommand == 'F') | (incomingCommand == 'f')){
    incomingCommand = 'F';
    if ((incomingCommand == 'E') | (incomingCommand == 'e')){
      incomingCommand = 'E';  // or whatever you decide to go with

      switch (incomingCommand) {       
      case 'F':
        Serial.println (" Sending a command ");
        switch (incomingRegister){
        case '0': // write seconds
          Serial.println ("Seconds ");
          Wire.beginTransmission(RTC_address); // select device
          Wire.send(seconds_address);          // queue the register
          Wire.send(new_data);                  // queue data
          Wire.endTransmission();            // send it
          delay (delay_time);
          break;
        case '8': // write RAM
          Serial.print ("RAM ");
          Serial.println (RTC_register, HEX);
          Wire.beginTransmission(RTC_address); // select device
          Wire.send(RTC_ram_address);          // queue the register
          Wire.send(new_data);                  // queue data
          Wire.endTransmission();            // send it
          delay (delay_time);
          break;
          incomingCommand = 0;  // reset for next pass
        }  // end switch:case RTC_register for command 'F
        break;  // end command 'F'
      case 'E':
        switch (incomingRegister){
          Serial.println (" Sending Command "); 
        case '0': // read seconds
          Serial.println ("Seconds: ");
          Wire.beginTransmission(RTC_address); // select device
          Wire.send(seconds_address);          // queue the register
          Wire.endTransmission();            // send it
          Wire.requestFrom(RTC_address,1);   // (device address, R/W) R=1, W=0
          seconds = Wire.receive();          // read the data here
          Serial.println(seconds, HEX);     
          delay (delay_time);
          break;
        case '8': // read RAM
          Serial.print ("RAM ");
          Serial.println (RTC_register, HEX);
          Wire.beginTransmission(RTC_address); // select device
          Wire.send(RTC_ram_address);          // queue the register
          Wire.endTransmission();            // send it
          Wire.requestFrom(RTC_address,1);   // (device address, R/W) R=1, W=0
          delay (delay_time);
          break;
          incomingCommand = 0;  // reset for next pass
        }  // end switch:case RTC_register for command 'E'
        break;  // end command 'E' 
      }
    }
  }     


  // ************************************

  currentMillis = millis();
  if ( (currentMillis - previousMillis) >= duration){
    previousMillis = currentMillis; 
    // Reset the register pointer 
    Wire.beginTransmission(RTC_address); 
    Wire.send(0x00); 
    Wire.endTransmission();   

    Wire.requestFrom(RTC_address,8 ); 
    seconds = Wire.receive(); 
    minutes = Wire.receive(); 
    hours = Wire.receive(); 
    day_week = Wire.receive(); 
    date_month = Wire.receive(); 
    month = Wire.receive(); 
    year = Wire.receive(); 
    sqwe = Wire.receive();

    // Seconds
    // bit 7 = Clock Halt, Enabled = 0, Halt = 1
    // bits 6-5-3 = tens of seconds 0-6,  bits 3-2-1-0 = units of seconds, 0-9

    // Hours
    // 7=0. 6 = 1 for 12 hr, 0 for 24 hr.
    // bit 5: 12 hr mode = AM(0)/PM(1). 24 hr mode = upper tens of hrs
    // bit 4 =  lower tens of hrs, bits 3-2-1-0 = units of hours (0-9)

    Serial.print ("Hrs " );
    Serial.print (hours, HEX);
    Serial.print (" Mins ");
    Serial.print (minutes, HEX);
    Serial.print (" Secs ");
    Serial.print (seconds, HEX);
    Serial.print (" Day ");
    Serial.print (day_week, HEX);
    Serial.print (" Date ");
    Serial.print (date_month, HEX);
    Serial.print (" Month ");
    Serial.print (month, HEX);
    Serial.print (" Year 20");
    Serial.print (year, HEX);
    Serial.print (" Square Wave ");
    Serial.println (sqwe, HEX);
  }
}
I am Learning, please be Patient !

CrossRoads

Try this. I think the problem was not quite correct usage of { & }.
Code: [Select]

/*
Test of RTC DS1307 via I2C.
Counts
Seconds,
Minutes,
Hours,
Date of the Month,
Month,
Day of the week, and
Year with Leap-Year

56 bytes battery backed RAM
Square Wave Output, can connect to INT2/D6 or PD7
*/

/*
Modified to Run thru IDE Serial port
*/
#include <Wire.h>

//variables
byte seconds_address = 0x00;
byte seconds; // bit 7 = Clock Halt, Enabled = 0, Halt = 1
// bits 6-5-3 = tens of seconds 0-6,  bits 3-2-1-0 = units of seconds, 0-9

byte minutes_address = 0x01;
byte minutes;  // bits 6-5-4 = tens of minutes, bits 3-2-1-0 = units of minutes

byte hours_address = 0x02;
byte hours;  // 7=0. 6 = 1 for 12 hr, 0 for 24 hr.
// bit 5: 12 hr mode = AM(0)/PM(1). 24 hr mode = upper tens of hrs
// bit 4 =  lower tens of hrs, bits 3-2-1-0 = units of hours (0-9)

byte day_week_address = 0x03;
byte day_week = 0; // range 01-07

byte date_month_address = 0x04;
byte date_month = 0; // range 01-31

byte month_address = 0x05;
byte month = 0; // range 01-12

byte year_address = 0x06;
int year = 0; // upper byte 0-9, lower byte 0-9

byte square_address = 0x07;
byte sqwe = 0;  // square wave enable
// Out-0-0-Sqwe-0-0-RS1-RS0
// Out, Sqwe = 0/0 - Square wave output = 0
// Out, Sqwe = 1/0 - Square wave output = 1
// Out, Sqwe = 0/1 or 1/1 - Square wave output per RS1/RS0
// RS1/RS0 = 00 = 1 Hz
// RS1/RSo = 01 = 4 KHz
// RS1/RS0 = 10 = 8 KHz
// RS1/RS0 = 11 = 32 KHz

byte RTC_ram_address = 0x08; //range = 08-63, 0x08-0x3F

int RTC_address = 0x68; // 1101 000

byte incomingCommand = 0;
byte RTC_write_command = 0;
byte RTC_read_command = 0;
byte RTC_ram_command = 0;

// use F0xx, F1xx,F2xx, F3xx, F4xx, F5xx, F6xx, F7xx
// to send one register write commands
// use E0xx to read registers back - not coded yet
// use C0xx to read RAM back - not coded yet

byte incomingRegister = 0;
byte RTC_register = 0;
byte incomingData1 = 0;
byte incomingData2 = 0;
byte new_data = 0;
byte outgoingData = 0;
int delay_time = 100;

unsigned long currentMillis = 0;
unsigned long previousMillis = 0;
unsigned long duration = 5000;

void setup() {
  Wire.begin(); // no address, we are master
  Serial.begin (57600); 
  Serial.flush();
  currentMillis = millis(); 
}

void loop() {

  if (Serial.available() >3){
    incomingCommand = Serial.read();
    incomingRegister = Serial.read();
    incomingData1 = Serial.read();
    incomingData1 = incomingData1 - 0x30; // convert ASCII to HEX
    incomingData2 = Serial.read();
    incomingData2 = incomingData2 - 0x30;  // convert ASCII to HEX
    new_data = (incomingData1 << 4) + incomingData2;  // put the Upper/Lower nibbles together
    Serial.print ("command ");
    Serial.println (incomingCommand);
    Serial.print ("register ");
    Serial.println(incomingRegister);
    Serial.print ("data1 ");
    Serial.println (incomingData1, HEX);
    Serial.print ("data2 ");
    Serial.println (incomingData2, HEX);
    Serial.print ("combined data ");   
    Serial.println (new_data, HEX);

  }
  // *******************************************
  if ((incomingCommand == 'F') | (incomingCommand == 'f')){
    incomingCommand = 'F';
  }
  if ((incomingCommand == 'E') | (incomingCommand == 'e')){
    incomingCommand = 'E';  // or whatever you decide to go with
  }

  switch (incomingCommand) {       
  case 'F':
    Serial.println (" Sending a command ");
    switch (incomingRegister){
    case '0': // write seconds
      Serial.println ("Seconds ");
      Wire.beginTransmission(RTC_address); // select device
      Wire.send(seconds_address);          // queue the register
      Wire.send(new_data);                  // queue data
      Wire.endTransmission();            // send it
      delay (delay_time);
      break;
    case '8': // write RAM
      Serial.print ("RAM ");
      Serial.println (RTC_register, HEX);
      Wire.beginTransmission(RTC_address); // select device
      Wire.send(RTC_ram_address);          // queue the register
      Wire.send(new_data);                  // queue data
      Wire.endTransmission();            // send it
      delay (delay_time);
      break;
      incomingCommand = 0;  // reset for next pass
    }  // end switch:case RTC_register for command 'F
    break;  // end command 'F'
  case 'E':
    switch (incomingRegister){
      Serial.println (" Sending Command "); 
    case '0': // read seconds
      Serial.println ("Seconds: ");
      Wire.beginTransmission(RTC_address); // select device
      Wire.send(seconds_address);          // queue the register
      Wire.endTransmission();            // send it
      Wire.requestFrom(RTC_address,1);   // (device address, R/W) R=1, W=0
      seconds = Wire.receive();          // read the data here
      Serial.println(seconds, HEX);     
      delay (delay_time);
      break;
    case '8': // read RAM
      Serial.print ("RAM ");
      Serial.println (RTC_register, HEX);
      Wire.beginTransmission(RTC_address); // select device
      Wire.send(RTC_ram_address);          // queue the register
      Wire.endTransmission();            // send it
      Wire.requestFrom(RTC_address,1);   // (device address, R/W) R=1, W=0
      delay (delay_time);
      break;
      incomingCommand = 0;  // reset for next pass
    }  // end switch:case RTC_register for command 'E'
    break;  // end command 'E' 
  }




  // ************************************

  currentMillis = millis();
  if ( (currentMillis - previousMillis) >= duration){
    previousMillis = currentMillis; 
    // Reset the register pointer 
    Wire.beginTransmission(RTC_address); 
    Wire.send(0x00); 
    Wire.endTransmission();   

    Wire.requestFrom(RTC_address,8 ); 
    seconds = Wire.receive(); 
    minutes = Wire.receive(); 
    hours = Wire.receive(); 
    day_week = Wire.receive(); 
    date_month = Wire.receive(); 
    month = Wire.receive(); 
    year = Wire.receive(); 
    sqwe = Wire.receive();

    // Seconds
    // bit 7 = Clock Halt, Enabled = 0, Halt = 1
    // bits 6-5-3 = tens of seconds 0-6,  bits 3-2-1-0 = units of seconds, 0-9

    // Hours
    // 7=0. 6 = 1 for 12 hr, 0 for 24 hr.
    // bit 5: 12 hr mode = AM(0)/PM(1). 24 hr mode = upper tens of hrs
    // bit 4 =  lower tens of hrs, bits 3-2-1-0 = units of hours (0-9)

    Serial.print ("Hrs " );
    Serial.print (hours, HEX);
    Serial.print (" Mins ");
    Serial.print (minutes, HEX);
    Serial.print (" Secs ");
    Serial.print (seconds, HEX);
    Serial.print (" Day ");
    Serial.print (day_week, HEX);
    Serial.print (" Date ");
    Serial.print (date_month, HEX);
    Serial.print (" Month ");
    Serial.print (month, HEX);
    Serial.print (" Year 20");
    Serial.print (year, HEX);
    Serial.print (" Square Wave ");
    Serial.println (sqwe, HEX);
  }
}
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

halejandro

What are the conditions to read and write in RAM?
I am Learning, please be Patient !

CrossRoads

Read & write to 0x08 up to 0x3F.
Or decimal 08 to 63.
Follow the same steps as the others to access 1 byte, 8 bytes, etc. up to 56 bytes.
Designing & building electrical circuits for over 25 years.  Screw Shield for Mega/Due/Uno,  Bobuino with ATMega1284P, & other '328P & '1284P creations & offerings at  my website.

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