TO ALL THOSE BARE BONED AND LAND LEVEL FELLOWS like me who need to know how interface works with RTC DS1302. It's a special and unique form of transmission, not an I²C, SPI, UART but more an ONE-WIRE-like interface, not equal, indeed it's bi-directional on one wire also using two wires for clock and acknowledge signals. I've realized a simple sketch without using library. Everyone who would need to study this chip, very simple and cheap, can start from here (work in progress).
A mention to: ZBASICANDY
LAVERNE ERVIN
PETER H. ANDERSON
MARK KOH
LUIGI CHIAVERINA (my professor at High school, who did the final but extremely helpful comment).
scrive_orario by LYON
/* WRITE AND READ TIME TO AND FROM DS1302
ACTUAL TIME IN THE DEFINE SECTION
MODIFY CONSTANT VALUES
*/
#define RSTPort 2 //defining arduino ports
#define CLKPort 3
#define I_OPort 4
#define DelayTest 1
#define sec 0
#define minu 0
#define hou 0
#define date 0
#define day 0
#define mon 6
#define year 0
#define wp 0
void setup ()
{
Serial.begin(112500);
pinMode(RSTPort, OUTPUT);
pinMode(CLKPort, OUTPUT);
pinMode(I_OPort, OUTPUT);
digitalWrite(RSTPort, LOW);
digitalWrite(CLKPort, LOW);
digitalWrite(I_OPort, LOW);
}
void loop() //clear Write Protect (WP) bit and unhalt Control Halt (CH)
{
/* send 0 1 2 3 4 5 6 7 7 6 5 4 3 2 1 0
0 1 1 1 0 0 0 1 1 0 0 0 1 1 1 0
^ ^ ^ ok for write operation
| | | command register address is 10001110
write | | definition register address is 00000000
clock | flag 7 to 0
|
fixed
*/
digitalWrite(RSTPort, HIGH); //RESET 1
delay(DelayTest);
digitalWrite(I_OPort, LOW); //start sending address register BIT 0 to 0
delay(DelayTest);
digitalWrite(CLKPort, LOW); //low yet
delay(DelayTest);
digitalWrite(CLKPort, HIGH); //first clock
delay(DelayTest);
digitalWrite(CLKPort, LOW); //in write mode the bit is transferred when CLK is high
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //BIT 1 to 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH); //2nd clock
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //BIT 2 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //BIT 3 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, LOW); //BIT 4 0
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
delay(DelayTest);
digitalWrite(I_OPort, LOW); //BIT 5 0
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, LOW); //BIT 6 0
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //BIT 7 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW); //end command address register
//start definition register address, all bit to 0
for (int i = 0;i<=7;i++){
delay(DelayTest);
digitalWrite(I_OPort, LOW);
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
}
delay(DelayTest);
digitalWrite(RSTPort, LOW); //end transmission
Serial.println("step 1 - wp cleared");
delay(500);
/*unhalting clock, clearing CH flag
*/
digitalWrite(RSTPort, HIGH); //RESET 1
delay(DelayTest); //sending command register address
for (int i = 0;i<=6;i++){ //bit 0 to 6 0
delay(DelayTest);
digitalWrite(I_OPort, LOW);
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
}
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //BIT 7 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW); //end command register address
delay(DelayTest);
//start definition register all bit to 0
for (int i = 0;i<=7;i++){
delay(DelayTest);
digitalWrite(I_OPort, LOW);
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
}
digitalWrite(RSTPort, LOW); //end transmission
Serial.println("step 2 - ch unhalted");
delay(500); //a while of pause
/*BURST MODE WRITE
23.59.00 31ST DECEMBER 1999 FRIDAY - A TRY FOR NOW
7 6 5 4 3 2 1 0 0 1 2 3 4 5 6 7
ADR CMD 1 0 1 1 1 1 1 0 0 1 1 1 1 1 0 1
DEF 0 0 0 0 0 0 0 0 SEC 0 0 0 0 0 0 0 0 FROM DATA SHEET:
55D 0 1 0 1 0 1 0 1 MIN 1 0 1 0 1 0 1 0 0 + 101B(=5D) + 0101B(=5D)
23D 0 0 1 0 0 0 1 1 HRS 1 1 0 0 0 1 0 0 0 + 0 (24 HR MODE) + 1 (STAND ALONE FOR TWO)
+ 011B(3D)
31D 0 0 1 1 0 0 0 1 DAT 1 0 0 0 1 1 0 0 0 + 011B(=3D) + 0001B
12D 0 0 0 1 0 0 1 0 MON 0 1 0 0 1 0 0 0 0 + 001B + 0010B
06D 0 0 0 0 0 1 1 0 FRI 0 1 1 0 0 0 0 0 110B(=6D)
99S 1 0 0 1 1 0 0 1 YEA 1 0 0 1 1 0 0 1 ALSO STAND FOR 2099 BECAUSE WE HAVE 9D + 9D
WP 0 0 0 0 0 0 0 0 WP 0 0 0 0 0 0 0 0 CLEAR WP
*/
digitalWrite(RSTPort, HIGH); //RESET 1
delay(DelayTest);
digitalWrite(I_OPort, LOW); //start sending COMMAND address register BURST
delay(DelayTest);
digitalWrite(CLKPort, HIGH); // CLOCK WRITE MODE BIT 0 0
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //sending address register BIT 1 to 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //sending address register BIT 2 to 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //sending address register BIT 3 to 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //sending address register BIT 4 to 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //sending address register BIT 5 to 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, LOW); //sending address register BIT 6 to 0
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //sending address register BIT 7 to 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
//starting whith time values - DEFINITION ADDRESS REGISTERS
//seconds 0d
for (int i = 0;i<=7;i++){
delay(DelayTest);
digitalWrite(I_OPort, LOW);
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
}
//minutes 55d
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //sending address register BIT 0 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, LOW); //sending address register BIT 1 to 0
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //sending address register BIT 2 to 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, LOW); //sending address register BIT 3 to 0
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //sending address register BIT 4 to 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, LOW); //sending address register BIT 5 to 0
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, HIGH); //sending address register BIT 6 to 1
delay(DelayTest);
digitalWrite(CLKPort, HIGH);
delay(DelayTest);
digitalWrite(CLKPort, LOW);
delay(DelayTest);
digitalWrite(I_OPort, LOW); //sending address register BIT 7 to 0