RTC DS1307 antwortet nicht trotz richtiger Adresse
Hallo liebes Forum,
ich versuche schon länger eine RTC (ein fertiges Modul -> I2C DS1307 wirklich Zeit Uhr Modul für Arduino Tiny RTC) mit einem Atmega1284p-pu über I2C auszulesen bzw erstmal zu stellen.
Da es nicht auf Anhieb mit der TWI_Master lib funktioniert hat, habe ich mit einem Oszi mal die SDA und SCL Leitungen gemessen und deren Daten ausgelesen. Ich konnte feststellen das er die Start condition und die richtige Adresse ( 0x68 ) anspricht und anschließend das Write-Bit sendet. Danach soll ein Acknolage von der RTC kommen doch ich bekomme immer ein Not-Acknolage. Woran könnte es liegen das die Uhr nicht antwortet?
Hier mein Code:
Code:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>
#include "lcd-routines.h"
#include "General.h"
#include "TWI_Master.h"
#include <stdio.h>
#include <util/twi.h>
#include "ADC.h"
#include "BinToDez.h"
int main(void)
{
uint8_t SlaveAddress = 0x68;
int8_t seconds, minutes, hours, day, date, month, year, control;
int8_t sekunden, minuten, stunden, tag, monat, jahr;
uint8_t i=0;
char sekunden_string[2], minuten_string[2], stunden_string[2];
char tag_string[2], monat_string[2], jahr_string[2];
TWIM_Init (100000); // Initiate TWI Master with bitrate of 100000 Hz
lcd_init(); //LCD initialisieren
if (PINB & 0x01)
{
cli(); //Interrupts global ausschalten
lcd_clear(); //Display löschen
lcd_home(); //Coursor an den Anfang setzen
//RTC Einstellen (einmalig)
if (!TWIM_Start (SlaveAddress, TWIM_WRITE))
{
TWIM_Stop ();
}
else
{
TWIM_Write (0b00000000); //Register-Pointer
TWIM_Write (0b00000000); //sec
TWIM_Write (0b01001000); //min
TWIM_Write (0b00011001); //stunde
TWIM_Write (0b00000011); //wochentag
TWIM_Write (0b00000101); //tag
TWIM_Write (0b00010110); //Monat
TWIM_Write (0b00011001); //jahr
TWIM_Write (0b00000000); //control
TWIM_Stop ();
_delay_ms(1000);
}
for (i = 0; i <=12; i++)
{
if (!TWIM_Start (SlaveAddress, TWIM_READ))
{
TWIM_Stop ();
}
else
{
seconds = TWIM_ReadAck ();
minutes = TWIM_ReadAck ();
hours = TWIM_ReadAck ();
day = TWIM_ReadAck ();
date = TWIM_ReadAck ();
month = TWIM_ReadAck ();
year = TWIM_ReadAck ();
control = TWIM_ReadNack ();
TWIM_Stop ();
_delay_ms(1000);
}
sekunden = BinToDez(seconds); //kann eventuell weg durch sprintf!!!
sprintf(sekunden_string,"%d",sekunden);
minuten = BinToDez(minutes);
sprintf(minuten_string,"%d",minuten);
stunden = BinToDez(hours);
sprintf(stunden_string,"%d",stunden);
tag = BinToDez(date);
sprintf(tag_string,"%d",tag);
monat = BinToDez(month);
sprintf(monat_string,"%d",monat);
jahr = BinToDez(year);
sprintf(jahr_string,"%d",jahr);
//Uhrzeit ausgeben
lcd_string("Uhr: ");
lcd_string(stunden_string);
lcd_string(":");
lcd_string(minuten_string);
lcd_string(":");
lcd_string(sekunden_string);
//Nächste Zeile im LCD
lcd_setcursor( 0, 2 );
//Datum ausgeben
lcd_string("Datum:");
lcd_string(tag_string);
lcd_string(".");
lcd_string(monat_string);
lcd_string(".20");
lcd_string(jahr_string);
_delay_ms(250); //500ms warten
lcd_home(); //LCD-coursor and Starposition setzen
//Interrupts global an
}
}
}
Bitte um Hilfe.
Gruß
Technik_Amateur