Hallo,
ich Programmier gerade eine Binär Uhr, das wichtigste funktioniert auch. Das heißt der DS1307 wird ausgelesen und die LEDs zeigen alles richtig an.
Leider ist mir auf gefallen das der RTC nicht weiter Arbeiten wenn die Pufferbatterie aktiv ist, aber die Uhrzeit bleibt gespeichert.
Da mir keine Lib für den RTC gefallen hat, hab ich es ohne Lib gemacht. http://combustory.com/wiki/index.php/RTC1307_-_Real_Time_Clock
Könnte es daran liegen oder ist der RTC defekt?
/*********************************************************
* Binäre Uhr mit RTC DS1307 mit Shiftregister
*
* Beschreibung
*
*
*
*
*Hardware: Arduino
* RTC DS1703
* Shiftregister 74HC595N 3x
*/
/************************Library*************************/
#include "Wire.h"
/*************************I/O****************************/
const int dataPin= 2;
const int latchPin = 3;
const int clockPin = 4;
const int buttonAdd = 12;
const int buttonDiv = 13;
const int batPin = A1;
/*********************I2C Adressen***********************/
#define RTC_I2C_ADDRESS 0x68
/***********************Variablen************************/
char buffer[20] = ""; //Speicherbereich für Datenkonvertierung
int date[10];
/***********************DEC to BCD***********************/
byte decToBcd(byte val)
{
return ( (val/10*16) + (val%10) );
}
/***********************BCD to DEC***********************/
byte bcdToDec(byte val)
{
return ( (val/16*10) + (val%16) );
}
/******************Zeit Umformatierung*******************/
int calc(int time)
{
int pin1;
int pin2;
int pin4;
int pin8;
int pin16;
int pin32;
int pin64;
int t_unit;
int result;
t_unit = time%10;
if(t_unit == 1 || t_unit == 3 || t_unit == 5 || t_unit == 7 || t_unit == 9) { pin1 = 1;} else { pin1 = 0;}
if(t_unit == 2 || t_unit == 3 || t_unit == 6 || t_unit == 7) { pin2 = 2;} else { pin2 = 0;}
if(t_unit == 4 || t_unit == 5 || t_unit == 6 || t_unit == 7) { pin4 = 4;} else { pin4 = 0;}
if(t_unit == 8 || t_unit == 9) { pin8 = 8;} else { pin8 = 0;}
if((time >= 10 && time < 20) || (time >= 30 && time < 40) || (time >= 50 && time < 60)) { pin16 = 16;} else {pin16 = 0;}
if(time >= 20 && time < 40) { pin32 = 32;} else {pin32 = 0;}
if(time >= 40 && time < 60) { pin64 = 64;} else {pin64 = 0;}
result = pin1 + pin2;
result = result + pin4;
result = result + pin8;
result = result + pin16;
result = result + pin32;
result = result + pin64;
return result;
}
/***********************Last Timer***********************/
//int lastTimer (boolean x, int count,
/************RTC auslesen und konvertieren***************/
void getDateRTC()
{
Wire.beginTransmission(RTC_I2C_ADDRESS); //Öffnet Verbindung zu RTC
Wire.write(0x00); //Setzt Pointer auf Byte0
Wire.endTransmission(); //Schließt Verbindung zur RTC
Wire.requestFrom(RTC_I2C_ADDRESS, 7); //Forder 7 Bytes an
date[ 0 ] = bcdToDec(Wire.read() & 0x7f); //Sekunde
date[ 1 ] = bcdToDec(Wire.read() ); //Minute
date[ 2 ] = bcdToDec(Wire.read() & 0x3f); //Stunde
date[ 3 ] = bcdToDec(Wire.read() ); //Wochentag
date[ 4 ] = bcdToDec(Wire.read() ); //Tag
date[ 5 ] = bcdToDec(Wire.read() ); //Monat
date[ 6 ] = bcdToDec(Wire.read() ); //Jahr
}
/********************RTC Datum setzen********************/
void setDateRTC(int pointer, int date)
{
Wire.beginTransmission(RTC_I2C_ADDRESS);
Wire.write(pointer); //Setzt Pointer
Wire.write(decToBcd(date) ); //Schreibt Konvertierter Wert
Wire.endTransmission();
}
/*************************Setup**************************/
void setup()
{
pinMode(dataPin, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(buttonAdd, INPUT);
pinMode(buttonDiv, INPUT);
Wire.begin();
Serial.begin(9600);
}
/*************************Loop***************************/
void loop()
{
getDateRTC();
int dataH = calc(date[2]); //Stunde Formatieren für Ausgabe
int dataM = calc(date[1]); //Minute
int dataS = calc(date[0]); //Sekunde
digitalWrite(latchPin, LOW); //Daten Ausgabe Aktivieren
shiftOut(dataPin, clockPin, MSBFIRST, dataS); //Ausgabe
shiftOut(dataPin, clockPin, MSBFIRST, dataM); //
shiftOut(dataPin, clockPin, MSBFIRST, dataH); //
digitalWrite(latchPin, HIGH); //Daten Ausgabe Schließen
printDate();
delay(500);
}
void printDate()
{
Serial.print(date[2]); Serial.print(":");
Serial.print(date[1]); Serial.print(":");
Serial.println(date[0]);
}
Gruß Hirschi