Ich habe eine DS1307 am TWIE. Mit dem LA kann ich am I2C-Bus die Sekunden-Daten schön beobachten, wie sie hinaufzählen. Verwende die Atmel 1308 Lib. Masterinterrupt wird schön ausgeführt. Mein Problem: Keine Daten (die eben sauber von der DS1397 gesendet werden) kommen irgendwo an (ZB twi->readData[0x01]). 2. Frage: Laut Atmel example machen die nichts an den Portpins. Müssen die konfiguriert werden und falls ja wie? Ich hab sie momentan als Inputs konfiguriert. (PORT_OPC_WIREDAND_gc | PORT_ISC_BOTHEDGES_gc) Danke und Schöne Grüße
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.
Supi Vielen Dank. Egentlich habe ich es bis auf ein paar Kleinigkeiten so gemacht. Meine DS1307 läuft mit 5 V. Pullups gegen 3,3V (4K7). Signale sind sauber. Uhr meldet sich brav. Am Bus sind die aufzählenden Sekunden ersichtlich. Aber keine Daten in rtc_buf.sekunde trotz read interrupt. (rtc_buf.sekunde = rtc_bcd_to_hex(twi->readData[0x00]); //sek) Melde mich, wenn ich neue Erkenntnisse habe. Schöne Grüße Chose
Abend, für die Kommunikation per I2C, bzw. TWI mit einem XMEGA kann ich die folgendes Beispiel empfehlen http://www.jtronics.de/avr-projekte/xmega-tutorial/xmega-tutorial-srf02.html Dort wird beschrieben, wie man einen Ultraschallsensor SRF02 per I2C abfragt. Den Quellcode findest findest als Beispiel im Anhang des Artikels unter Downloads. Das habe ich vor kurzem als Einstieg benutzt und hat auch sofort funktioniert. Viel Erfolg
Jetzt gehts. Schwitz. http://www.jtronics.de/avr-projekte/xmega-tutorial... hat sehr geholfen. Das Problem war scheinbar die fehlerhafte Übergabe eines Structurpointers zum RTC lesen. Obwohl richtig übergeben doch falsche Ergebnisse.... Da muß ich nochmals C Grundlagen büffeln. Danke nochmals! Schöne Grüße Josef
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.