DEVICE NAME := "DS1305-RTC"
PINS
SCLK := 14;
SDIN := 15;
SDOUT := 16;
CE := 12;
nINT0 := 7;
nINT1 := 9;
OSC := 5, 3;
END;
DISABLE DEVICE
CE := 0;
nINT0 := Z;
nINT1 := Z;
END;
TEST COVERAGE
SCLK := OPEN HI LO;
SDIN := OPEN HI LO;
SDOUT := OPEN HI LO;
CE := OPEN HI LO;
nINT0 := OPEN HI LO;
OSC := FUNCTIONAL;
END;
END;
CONST INT SECONDS := 0x0;
CONST INT MINUTES := 0x1;
CONST INT ALARM0_SEC := 0x07;
CONST INT CONTROL_REGISTER := 0x0F;
CONST INT DEBUG := FALSE;
Test()(INT result)
INT read, i, timeout;
INT minutes, seconds, currentSec;
result := 1;
PRINT("Testing Real-Time Clock ", DEVICE_REF, "\n");
WriteCycle(CONTROL_REGISTER, 0x80);
ReadCycle(CONTROL_REGISTER)(read);
IF read != 0x80 THEN
PRINT("Failed to access RTC chip.\n");
RETURN;
END;
WriteSerial(CONTROL_REGISTER)();
ReadSerial()(read);
IF read = 0x80 THEN
PRINT("Failed NOT to access RTC chip: CE shorted high.\n");
RETURN;
END;
SET read := nINT0;
IF read = 0 THEN
PRINT("RTC interrupt request line 0 failed to go high.\n");
RETURN;
END;
FOR i := ALARM0_SEC FOR 4
WriteCycle(i, 0x80);
END;
WriteCycle(CONTROL_REGISTER, 0x1);
ReadCycle(SECONDS)(currentSec);
timeout := NOW() + 2000;
IF DEBUG THEN
ReadCycle(SECONDS)(seconds);
ReadCycle(MINUTES)(minutes);
PRINT("Time is ", HEX(minutes), "m ", HEX(seconds), "s\n");
END;
IF DEBUG THEN
PRINT("currentSec = ", HEX(currentSec), "\n");
END;
DO
ReadCycle(SECONDS)(seconds);
WHILE seconds = currentSec && NOW() < timeout
END;
IF DEBUG THEN
PRINT("After check time = ", HEX(seconds), "\n");
END;
IF seconds = currentSec THEN
PRINT("RTC oscillator did not start.\n");
RETURN;
END;
SET read := nINT0;
IF read = 1 THEN
PRINT("RTC Interupt request line 0 failed to go low.");
RETURN;
END;
WriteCycle(CONTROL_REGISTER, 0x0);
FOR i := 0x20 TO 0x7F
WriteCycle(i, 0);
FLUSH;
END;
result := 0;
END;
WriteCycle(INT address, INT data)()
address[7] := 1;
SET SCLK :=1;
SET CE := 1;
WriteSerial(address)();
WriteSerial(data)();
SET CE := 0;
END;
ReadCycle(INT address)(INT data)
address[7] := 0;
SET SCLK :=1;
SET CE := 1;
WriteSerial(address)();
ReadSerial()(data);
SET CE := 0;
END;
WriteSerial(INT value)()
INT i;
FOR i := 0 FOR 8
SET SCLK := 0, SDIN := value [7 - i];
SET SCLK := 1;
END;
END;
ReadSerial()(INT value)
INT i;
value := 0;
FOR i := 0 FOR 8
value := value << 1;
SET SCLK := 0;
SET SCLK := 1, value[0] := SDOUT;
END;
END;