Forum: Compiler & IDEs TWI, Möglichkeit zur Erkennung, ob Gerät angeschlossen


von Slowflyer (Gast)


Lesenswert?

Hallo,

ich habe zwei ATmega µC per TWI verbunden. Die Kommunikation zwischen
den beiden funktioniert einwandfrei. Wenn ich nun KEINEN Slave an den
TWI des Masters anschliesse, bleibt meine Software hängen (siehe
markierte Stelle ->), indem sie auf das Interruptflag des TWI wartet.
(Ich verwende die twimaster.c und i2cmaster.h von Peter Fleury). Hat
jemand eine Idee, wie man einen solchen Fehlerfall (kein Slave
angeschlossen) erkennen kann und dann die Routine abbrechen?
1
bool prog_cf_rtc()
2
{
3
...
4
  i2c_start_wait(CF_RTC+I2C_WRITE);    
5
  i2c_write(WRITE_TIME);  
6
  i2c_write(act_time.sekunde);    
7
  i2c_write(act_time.minute);
8
  i2c_write(act_time.stunde);
9
  i2c_write(act_time.tag);
10
  i2c_write(act_time.monat);
11
  i2c_write(act_time.jahr);
12
  i2c_write(act_time.wochentag);
13
  i2c_write(0);            
14
  i2c_stop();              
15
  // Uhrzeit wieder auslesen und kontrollieren
16
  i2c_start_wait(CF_RTC+I2C_WRITE);  
17
  i2c_write(READ_TIME);
18
  i2c_write(0);            
19
  i2c_rep_start(CF_RTC+I2C_READ);    
20
->  read.sekunde   = i2c_readAck();  
21
  read.minute   = i2c_readAck();
22
  read.stunde   = i2c_readAck();
23
  read.tag     = i2c_readAck();
24
  read.monat     = i2c_readAck();
25
  read.jahr     = i2c_readAck();
26
  read.wochentag   = i2c_readAck();
27
  
28
  i2c_readNak();            // 
29
  
30
  i2c_stop();  // I2C-Bus wieder freigeben
31
32
...      
33
  return ret;
34
}

von Peter Fleury (Gast)


Lesenswert?

Anstelle von
  i2c_start_wait(CF_RTC+I2C_WRITE);


if (!i2c_start(CF_RTC+I2C_WRITE) )
  {
      /* I2C device accessible */
      i2c_write(READ_TIME);
      ...
    }

von Slowflyer (Gast)


Lesenswert?

Das ist ja nicht das Problem. Das Problem ist, dass die Verbindung
aufgebaut wird, obwohl KEIN Slave am Bus angeschlossen ist. Die Pins
des I2C sind mit zwei Pull-Ups gegen Vcc gezogen. Der µC bleibt erst
bei dem Versuch zu lesen, hängen (siehe "->" im Listing). Bis dahin
tut er so, als würde die Verbindung klappen. ICh vermute, dass er beim
readAck() auf das Acknowledge wartet, das nicht kommen kann, da beide
Leitungen auf high gezogen sind, deshlab wird auch das TWINT-Flag nicht
gesetzt. Ich könnte ja mit dem Watchdog den Vorgang unterbrechen, ist
jedoch keine geschickte Lösung. Oder mit einem Timer das TWINT-Flag
manuell setzen, damit er weiterläuft. Eine Fehlermeldung gibt es zum
Schluss ja sowieso, weil die Zeiten, nochmal verglichen werden und
nicht zutreffen (Dadurch, dass die SDL immer High ist liest er lauter 1
ein).

von Peter Dannegger (Gast)


Lesenswert?

Ich bin mir sicher, daß Peter Fleury zu seinen Funktionen auch ne Doku
geschrieben hat.

Immer, wenn man Fremdfunktionen einsetzt, ist es unbedingt notwendig
die dazu gehörende Dokumentation zu studieren.

Trotzdem ist es nicht schlecht, sich mit der allgemeinen Funktionsweise
des I2C zu beschäftigen.


Was mir z.B. sofort aufstößt ist, daß Du nirgends das ACK-Bit testest.
Du hast somit niemals eine Ahnung, ob da überhaupt Daten übertragen
werden.


Peter

von Slowflyer (Gast)


Lesenswert?

Ach du grüne Neune!

Da muss ich Peter Dannegger leider Recht geben: wer lesen kann, ist
klar im Vorteil. Ich habe eine Zeile im Datenblatt vom Mega88 falsch
interpretiert und bin deshlab gar nicht auf den Trichter gekommen
nachzusehen, ob das Schreiben erfolgreich war.

Problem erledigt, Danke.

gesenkten Hauptes schleicht er davon

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.