RTC(DS1307) Problem mit Addresse

Gast #3393243
Lesenswert?

Moin moin,

ich muss mit einem RTC (DS1307) über TWI kommunizieren.

Habe erst mal ein paar Grundfunktionen programmiert.

Wenn ich aber die Funktion twi_addr(0xd0) aufrufe bekomme ich immer 
einen Fehler mit der Addresse.
Bzw mein Dislay zeigt mit den txt: "Error:TWIaddr"

Was mache ich falsch?

Habe den Atmega16 mit 8MHz.
Angehängte Dateien:
#3393376
Lesenswert?

Ich würde mal damit anfangen, hier
1
void twi_start(void)
2
{
3
  TWCR =  (1<<TWINT)|(1<<TWSTA) | (1<<TWEN);
4
  
5
  
6
  while((TWCR & (1<<TWINT)))
7
  {  
8
    Write_String("Error: TWIstart");
9
    CurserHome();
10
    _delay_ms(1000);
11
  }
12
  
13
}
dann auch darauf zu warten, bis TWINT von der TWI-Hardware gesetzt wird 
und nicht so wie du die Funktion schon zu verlassen, während die 
Hardware noch am Start-Zustand arbeitet.

Das könnte sich auf das nachfolgende Versenden der Adresse günstig 
auswirken, wenn sichergestellt ist, dass die TWI Hardware auch 
aufnahmebereit ist.


Im Datenblatt ab Seite 183 ist das alles doch ausführlichst beschrieben. 
Inklusive der "Tabelle" auf Seite 185, in der der ganze Vorgang auch in 
C haarklein ausprogrammiert ist.
#3393392
Lesenswert?

PS: Du scheinst nicht wirklich begriffen zu haben, wie das funktioniert.
Mittels
1
  TWCR = .... ( 1 << TWINT ) ....
wird das TWINT Flag GELÖSCHT!
Darauf hin fängt die Hardware zu buddeln an, und wenn sie damit fertig 
ist, dann setzt sie TWINT. Ob da jetzt ein Fehler aufgetreten ist oder 
nicht, das verrät dir das TWINT Flag überhaupt nicht. TWINT erlaubt dir 
nur die Aussage "Ich buddle noch" oder "Ich bin fertig".

D.h. du wirst IMMER darauf warten, dass die TWI fertig wird. Es heißt 
immer
1
  // warte bis die TWI fertig ist
2
  while( !( TWCR & ( 1 << TWINT ) ) )
3
    ;

ob die Operation gut gegangen ist oder nicht, das erzählt dir der INhalt 
des TWSR Registers. TWINT hat damit nichts zu tun. TWINT erzählt dir 
nur, ob du schon in TWSR nachsehen kannst, oder ob die TWI noch am 
buddeln ist.
Gast #3393414
Lesenswert?

Erstmal danke , ok das stimmt  dort muss ein ! hin.
Nur jetzt hab ich immer den Fehler:"Error: TWIstart".

Wenn ich mein RTC aufstecke, leuchten PC3 und PC4 (SCL und SDA)
Guck ich mir den Zustand mit nem Oszi an ,bleiben die beiden PIN's auf 
High.
Ich müsste doch die Start Übertragung sehen!?
#3393437
Lesenswert?

Ralf S. schrieb:
> Erstmal danke , ok das stimmt  dort muss ein ! hin.
> Nur jetzt hab ich immer den Fehler:"Error: TWIstart".

Ja, das glaub ich sofort, dass du hier
1
void twi_start(void)
2
{
3
  TWCR =  (1<<TWINT)|(1<<TWSTA) | (1<<TWEN);
4
  
5
  
6
  while(!(TWCR & (1<<TWINT)))
7
  {  
8
    Write_String("Error: TWIstart");
9
    CurserHome();
10
    _delay_ms(1000);
11
  }
12
  
13
}

eine Fehlermeldung kriegst.
So ein µC ist doch kein Wunderwuzzi!

Nach dem
1
  TWCR =  (1<<TWINT)|(1<<TWSTA) | (1<<TWEN);
dauert das seine Zeit, bis der Startmode durch ist! Wenn du danach 
sofort
1
  while(!(TWCR & (1<<TWINT)))
2
  {  
3
    Write_String("Error: TWIstart");
die Übertragung als gescheitert erklärst, nur weil der TWI noch am 
werken ist, dann kriegst du eine Fehlermeldung.

Aber: die ganze Auswertung ist falsch
1
void twi_start(void)
2
{
3
  TWCR =  (1<<TWINT)|(1<<TWSTA) | (1<<TWEN);
4
  
5
  while(!(TWCR & (1<<TWINT)))
6
    ;
7

8
  if( (TWSR & 0xF8) != START) {  
9
    Write_String("Error: TWIstart");
10
    CurserHome();
11
  }
12
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren