Hallo,
DS1307 ist nur bedingt lauffähig, keine 3,3 Volt
DS1338 3.3 ist super!!
aber mal weiter...
twi_master_driver.c und
twi_master_driver.h einbinden
#define CPU_SPEED 16000000 // TWI // Achtung CPU Takt !!
#define BAUDRATE 100000 // TWI Übertragungsgeschwindigkeit
#define TWI_BAUDSETTING TWI_BAUD(CPU_SPEED, BAUDRATE)
typedef struct { // -------- Struktur ----------- für globale Daten
uint8_t s_buffer[0x09]; // Schreibbuffer für RTC DS1338/DS1307
uint8_t sekunde; //sek
uint8_t minute; //minute
uint8_t stunde; //stunde
uint8_t monat; //monat
uint8_t tag; //tag
uint8_t w_tag; //wochentag
uint8_t jahr; //jahr
} MY_BUFFER; static MY_BUFFER rtc_buf;
TWI_Master_t twiMaster; /*!< ATMELXMEGA TWI master module. */
int main(void)
{
// Takt einbinden !! siehe TWI Geschwindigkeit
PMIC.CTRL |= PMIC_HILVLEN_bm;
PMIC.CTRL |= PMIC_MEDLVLEN_bm;
PMIC.CTRL |= PMIC_LOLVLEN_bm;
sei();
TWI_MasterInit(&twiMaster,&TWIE,TWI_MASTER_INTLVL_HI_gc,TWI_BAUDSETTING)
;
PORTE.DIRSET = PIN0_bm; // Als Ausgang TWI SDA
PORTE.DIRSET = PIN1_bm; // Als Ausgang TWI SCL
//wichtig SDA/SCL 2 mal 4,7k nach Vdd (3,3VolT)!!!
void rtc_auslesen(TWI_Master_t *twi) // DS1338/DS1307 auslesen
{
uint8_t start_adresse[1];
start_adresse[0]=0;
// Leseadresse nach RTC schreiben
TWI_MasterWrite(&twiMaster,SLAVE_ADDRESS,start_adresse,1);
while (twiMaster.status != TWIM_STATUS_READY) {
/* Wait until transaction is complete. */
}
// Datum,Uhrzeiz aus RTC
TWI_MasterWriteRead(&twiMaster,SLAVE_ADDRESS,0,0,7);
while (twiMaster.status != TWIM_STATUS_READY) {
/* Wait until transaction is complete. */
}
// RTC DS1338 -> TWI-Daten nach struct rtc_buf
rtc_buf.sekunde = rtc_bcd_to_hex(twi->readData[0x00]); //sek
rtc_buf.minute = rtc_bcd_to_hex(twi->readData[0x01]); //minute
rtc_buf.stunde = rtc_bcd_to_hex(twi->readData[0x02]); //stunde
rtc_buf.w_tag = rtc_bcd_to_hex(twi->readData[0x03]); //tag in der
Woche
rtc_buf.tag = rtc_bcd_to_hex(twi->readData[0x04]); //tag
rtc_buf.monat = rtc_bcd_to_hex(twi->readData[0x05]); //monat
rtc_buf.jahr = rtc_bcd_to_hex(twi->readData[0x06]); //jahr
}
ISR(TWIE_TWIM_vect) // TWI RTC DS1307
{
TWI_MasterInterruptHandler(&twiMaster);
}
char rtc_bcd_to_hex(char v)// rtc_bcd_to_hex: wandelt BCD zu HEX Zahl um
{
char n;
n=v;
n=n & 0xF0;
n=n/16;
v =v & 0x0F;
n=n*10+v;
return(n);
}
char rtc_hex_to_bcd(char v)// rtc_hex_to_bcd: wandelt HEX zu BCD Zahl um
{
char n;
n=v;
n=n/10;
n=n*16;
v =v % 10;
n=n+v;
return(n);
}
Gruß G.G.