Forum: Mikrocontroller und Digitale Elektronik XMEga128A3 TWI Problem


von Chose (Gast)


Lesenswert?

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

von Gerhard G. (g_g)


Lesenswert?

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.

von Chose (Gast)


Lesenswert?

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

von tobi (Gast)


Lesenswert?

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

von Chose (Gast)


Lesenswert?

Danke inzwischen!


Schöne Grüße Chose

von Chose (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.