mikrocontroller.net

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


Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?
bool prog_cf_rtc()
{
...
  i2c_start_wait(CF_RTC+I2C_WRITE);    
  i2c_write(WRITE_TIME);  
  i2c_write(act_time.sekunde);    
  i2c_write(act_time.minute);
  i2c_write(act_time.stunde);
  i2c_write(act_time.tag);
  i2c_write(act_time.monat);
  i2c_write(act_time.jahr);
  i2c_write(act_time.wochentag);
  i2c_write(0);            
  i2c_stop();              
  // Uhrzeit wieder auslesen und kontrollieren
  i2c_start_wait(CF_RTC+I2C_WRITE);  
  i2c_write(READ_TIME);
  i2c_write(0);            
  i2c_rep_start(CF_RTC+I2C_READ);    
->  read.sekunde   = i2c_readAck();  
  read.minute   = i2c_readAck();
  read.stunde   = i2c_readAck();
  read.tag     = i2c_readAck();
  read.monat     = i2c_readAck();
  read.jahr     = i2c_readAck();
  read.wochentag   = i2c_readAck();
  
  i2c_readNak();            // 
  
  i2c_stop();  // I2C-Bus wieder freigeben

...      
  return ret;
}

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anstelle von
  i2c_start_wait(CF_RTC+I2C_WRITE);


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

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Slowflyer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.