Hallo Leute
Die Library funktioniert leider nicht mit unserem compiler (Ride
Version 6.10.15) bringt meldung das das nur mit einem ATM GCC compiler
funzt
Mit diesen Funktionen arbeiten wir bis jetzt RTC.h
************************************************************************
***********/
/*
*/
/* Funktionen zur Ansteuerung des DS1307 RealTimeClocks
*/
/* ----------------------------------------------------
*/
/*
*/
*/
/* Version 1.0
*/
/*
*/
/***********************************************************************
************/
//********************** Definitionen ***************
//#define adr_lies 0xD1 // Adresse ueber die auf
den DS1307 geschr. wird
//#define adr_schreib 0xD0 // Adresse ueber die auf
den DS1307 geschr. wird
char system_time_ss;
char system_time_mm;
char system_time_hh;
char system_time_dayofweek;
char system_time_day;
char system_time_month;
char system_time_year;
//****************************** Funktionen
****************************************
/***********************************************************************
************/
/* Fkt. rtc_bcd_to_hex: wandelt BCE zu HEX Zahl um
*/
/*
*/
/***********************************************************************
************/
char rtc_bcd_to_hex(char v)
{
char n;
n=v;
n=n & 0xF0;
n=n/16;
v =v & 0x0F;
n=n*10+v;
return(n);
}
/***********************************************************************
************/
/* Fkt. rtc_hex_to_bcd: wandelt HEX zu BCD Zahl um
*/
/*
*/
/***********************************************************************
************/
char rtc_hex_to_bcd(char v)
{
char n;
n=v;
n=n/10;
n=n*16;
v =v % 10;
n=n+v;
return(n);
}
/***********************************************************************
************/
/* Fkt. write_rtc_ram: Schreibt ein Byte ueber I2C auf den DS1307
*/
/*
*/
/***********************************************************************
************/
char write_rtc_ram(char ad,char d)
{
d=rtc_hex_to_bcd(d);
starti2c();
ausgabei2c(adr_schreib);
ausgabei2c(ad);
ausgabei2c(d);
stoppi2c();
//delay_ms(11);
_nop_();
}
/***********************************************************************
************/
/* Fkt. read_rtc_ram: Liest ein Byte ueber I2C aus dem DS1307
*/
/*
*/
/***********************************************************************
************/
char read_rtc_ram(char ad)
{
char d;
starti2c();
ausgabei2c(adr_schreib);
ausgabei2c(ad);
starti2c();
ausgabei2c(adr_lies);
d= einleseni2c(1);
stoppi2c();
d=rtc_bcd_to_hex(d);
return(d);
}
/***********************************************************************
************/
/* Fkt. gettime: Liest Sekunden, Minuten und Stunden ein
*/
/*
*/
/***********************************************************************
************/
void gettime()
{
system_time_ss = read_rtc_ram(0);
_nop_();//5
system_time_mm = read_rtc_ram(1);
_nop_();//5
system_time_hh = read_rtc_ram(2);
_nop_();//5
system_time_dayofweek = read_rtc_ram(3);
_nop_();//5
system_time_day = read_rtc_ram(4);
_nop_();//5
system_time_month = read_rtc_ram(5);
_nop_();//5
system_time_year = read_rtc_ram(6);
}
/***********************************************************************
************/
/* Fkt. init_uhr: Initialisiert den DS1307
*/
/* Achtung nach einem Stromausfall wird init_uhr() aufgerufen,
da der DS1307*/
/* Batterie gepuffer ist darf nicht alles geresettet werden!!
*/
/***********************************************************************
************/
void init_uhr()
{
system_time_mm = read_rtc_ram(0); // alten Minutenwert
vor dem ueberschreiben Lesen
write_rtc_ram(0x00,00); // CH=0
write_rtc_ram(0,system_time_mm); // alten Minutenwert
wieder speichern
system_time_hh = read_rtc_ram(2); // alten Stundenwert
vor dem ueberschreiben Lesen
write_rtc_ram(0x02,00); // auf 24h Mode
stellen
write_rtc_ram(2,system_time_hh); // alten Stundenwert
wieder speichern
write_rtc_ram(0x07,00); //OSC ON
}
/***********************************************************************
************/
/* Fkt. set-Funktionen: um alle Parameter zu schreiben.
*/
/*
*/
/***********************************************************************
************/
void setsecond(char d) {write_rtc_ram(0,d);}
void setminute(char d) {write_rtc_ram(1,d);}
void sethour(char d) {write_rtc_ram(2,d);}
void setdayofweek(char d){write_rtc_ram(3,d);}
void setday(char d) {write_rtc_ram(4,d);}
void setmonth(char d) {write_rtc_ram(5,d);}
void setyear(char d) {write_rtc_ram(6,d);}
void sqw(char d) {write_rtc_ram(7,d);}
und mit der header Datei I2C.h
#include <c51rd2.h> /* Registerdefinitionen */
#include <intrins.h> /* für Rotationsfunktion */
#include <stdio.h> /*Standart Ein/Ausgabe Funktionen*/
/****** verwendete Adressen und Kontrollbyte für den AD- und
DA-Umsetzter ******************/
unsigned char adr_lies = 0xD1; /* 10010001 -> 11010001 */
unsigned char adr_schreib = 0xD0; /* 10010000 -> 11010000 */
/****** verwendete I2C-Leitungen
**********************************************************/
sbit daten = P3^5; /* 0xB5 P3.5 = SDA, i2c-Datenleitung */
sbit clock = P3^4; /* 0xB4 P3.4 = SCL, i2c-Taktleitung */
/***********************************************************************
*******************/
sbit acc7 = ACC^7; /* für Aus- und Eingabe eines Bits des Akkus */
/***********************************************************************
*******************
* I2C-Bus-Funktionen initi2c, starti2c, stoppi2c, ausgabei2c,
einleseni2c auch für andere
* I2C-Bus-ICs verwendbar
************************************************************************
******************
/****** Startbedingung I2C-Bus
************************************************************/
void starti2c (void)
{
daten = 1;
clock = 1;
daten = 0;
clock = 0;
}
/****** Stoppbedingung I2C-Bus
************************************************************/
void stoppi2c (void)
{
clock = 1;
daten = 1;
}
/***********************************************************************
*******************
* Byte ausgeben an I2C-Bus , Rückgabewert = Acknoledgebit = 1 wenn
erfolgreich
************************************************************************
******************/
bit ausgabei2c (unsigned char byte)
{
unsigned char z; /* Zähler */
bit ack; /* Acknoledge-Bit */
ACC = byte; /* Rotationsregister Akku */
for (z = 8; z != 0; z --) /* Zähler: serielle Ausgabe von 8 Bit */
{
daten = acc7; /* Bit7 des Akku ausgeben */
nop ();
clock = 1; /* Daten sind gültig */
ACC = crol (ACC,1); /* links rotieren, Funktion von intrins.h */
clock = 0; /* Datenausabe beendet */
}
daten = 1; /* Leitung freigeben für Acknoledge-Bit */
nop ();
clock = 1; /* Slave kann bestätigen */
nop (); /* warten */
ack = daten; /* Acknoledge-Bit lesen */
clock = 0; /* Slave soll Ackn-Ausgabe beenden */
return (ack); /* Acknoledge-Bit ist Rückgabewert der Funktion
*/
}
/***********************************************************************
*******************
* Byte einlesen vom I2C-Bus. Bei Ack=1 wird Acknoledgebit gesendet,
sonst nicht
************************************************************************
******************/
unsigned char einleseni2c (bit ack)
{
unsigned char z,byte;
daten = 1; /* Leitung freigeben (high) für Daten */
for (z = 8; z != 0; z --) /* Zähler: serielles Einlesen von 8
Bit
*/
{
clock = 1; /* Daten sind gültig */
nop ();
acc7 = daten; /* Datenbit in den Akku */
ACC = crol (ACC,1); /* links rotieren, Funktion von intrins.h
*/
clock = 0; /* Daten lesen beendet */
}
byte = ACC; /* Eingelesenes Byte */
if (ack == 1) {daten = 0;} /* Acknowledge-Bit senden */
else {daten = 1;} /* kein Acknowledge-Bit */
nop ();
clock = 1; /* Ackn. gültig */
clock = 0; /* Ackn. beendet */
nop ();
daten = 0; /* Leitung nicht mehr frei für Daten */
return (byte); /* eingelesenes Byte = Rückgabewert */
}
/***********************************************************************
*******************
/* _nop_()
/***********************************************************************
*******************/
void nop (void)
{
int i;
for(i=1;i=30000;i++)
{
}
}
Wenn Ihr es in den compiler kopiert müsste es lesbar sein