TWI, Möglichkeit zur Erkennung, ob Gerät angeschlossen

Gast #283453
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
}
Gast #283455
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).
Gast #283456
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
Gast #283457
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

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.