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:
Bitte um Hilfe.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 } } }
Gruß
Technik_Amateur







Zitieren


Lesezeichen