Forum: Mikrocontroller und Digitale Elektronik I2C mit ATtiny 0/1-series (z. B. ATtin817)


von Dieter R. (drei)


Lesenswert?

Ich möchte zwei ATtiny (aktuell im Test: ATtiny1614 auf eigenem Board 
bzw. ATtiny817 auf ATtin817 Xplained Board) per I2C verbinden, der eine 
also als Master, der andere als Slave. Ahnungslos wie ich bin habe ich 
gedacht, ich mache das mit der Treibersoftware, die Microchip über Atmel 
Start zur Verfügung stellt.

Diese Software ist ein Graus und weitestgehend undurchschaubar, 
zumindest für meinen (beschränkten) Kenntnisstand in C-Programmierung.

Nach LANGER Suche habe ich zwei Beiträge gefunden, die sich mit dem 
Problem zumindest auf Seiten des Masters auseinandersetzen:

https://www.avrfreaks.net/forum/tiny-avr-1-series-twi-woes
https://www.avrfreaks.net/comment/2294056#comment-2294056

Der Code dort ist zumindest kurz und überschaubar. So richtig 
zufriedenstellend ist es aber nicht, wenn man liest, dass das alles 
"irgendwie" funktioniert und sich beide Verfasser nicht ganz einig sind, 
welche Statusbits jeweils für zuverlässige Funktion gesetzt werden 
müssen. Offenbar funktioniert auch nicht alles in der Atmel-Hardware so, 
wie im Datenblatt vorgesehen. Für Series 0 und Series 1 gibt es jeweils 
im Anhang der Datenblätter erschreckend klingende (und leicht 
unterschiedliche) Fehlerlisten. Das ist nicht sehr vertrauenerweckend.


Frage: kennt jemand eine bewährte Quelle für zuverlässige I2C-Routinen 
(Master und Slave) für diese Prozessoren? Gibt es jenseits der 
Microchip-Treiber so etwa wie eine Standardbibliothek dafür? Für Tips 
und Links wäre ich sehr dankbar. Ich will keine großartigen Sachen 
machen, nur kurze Messages, wenige Byte lang, zwischen beiden 
Prozessoren austauschen.

von Peer (Gast)


Lesenswert?

Es scheint in den angegebenen Orten um Code zum LM75 und USART zu 
handeln. Vielleicht auch Arduino. Einzige Stelle die ich kenne ist bei 
www.jtronic.de zu finden. Ob es auf deiner Hardware läuft kann ich nicht 
sagen. Versuche selber was zum Attiny 841 und I2C zu finden. Wenn du was 
findest oder schreibst würde mich auch interessieren.

LG Peer

von Peer (Gast)


Lesenswert?

Sorry, Buchstabe vergessen

www.jtronics.de

von Dieter R. (drei)


Lesenswert?

Peer schrieb:
>
> www.jtronics.de

Das hilft leider nicht weiter. Jtroncics schreibt, dass er die 
Bibliothek von Peter Fleury verwendet. Das ist Software-Bitbanging, 
darauf wird auch hier verwiesen:

https://www.mikrocontroller.net/articles/AVR_TWI

(ganz unten auf der Seite).

Die neueren Series 0 / Series 1 ATtinys haben dafür ein 
Hardware-Interface. Das ist bloß nicht besonders gut beschrieben und 
mein Verständnis der Dokumentation deckt sich nur bedingt mit den 
Quellen im Avrfreaks-Forum. Daher meine Frage, ob es etwas gibt, das 
verlässlicher ist.

von Peer (Gast)


Lesenswert?

Schade wenn es nicht hilft. Verwende selber die Datein von Peter für 
meine anderen Prozessor. Für USI verwende ich auch die Datein von 
jtonics.
Da hilft woll nur weiter suchen oder was eigenes schreiben.

von GermanFranz (Gast)


Lesenswert?


von Dieter R. (drei)


Lesenswert?

GermanFranz schrieb:
> Beispiel in Assembler:
> 
https://community.atmel.com/projects/avr-megatiny-series-01-twi-master-sensor-hyt271

Hallo GermanFranz.

Danke. Und schon sind wir wieder voll in der von mir angesprochenen 
Problematik: "kennt jemand eine bewährte Quelle für ZUVERLÄSSIGE 
I2C-Routinen
(Master und Slave) für diese Prozessoren?"

Der Code initialisiert lt. Kommentar den Chip im Smartmode (SET 
(SMARTMODE-) MASTER ACK). Dazu die Errata im Datenblatt:

TWI Smart mode gives extra clock pulse
TWI Master with Smart mode enabled gives an extra clock pulse on SCL 
line after sending NACK.
Fix/Workaround:
None.

Ist das nun problematisch, unsicher, oder egal?

: Bearbeitet durch User
von Dumpfbacke (Gast)


Lesenswert?

Dieter R. schrieb:
> Ist das nun problematisch, unsicher, oder egal?

Den Peter Fleury willst ja nicht nehmen gell, weil das is
ja das verpöhnte Bitbanging, was ja soooo scheisse ist.

von Dumpfbacke (Gast)


Lesenswert?

Warum in die Schwerne feifen, das Gute liegt so nah!

Beitrag "AVR: I2C Master Software Library für alle AVR"

von Dieter R. (drei)


Lesenswert?

Dumpfbacke schrieb:
> Warum in die Schwerne feifen, das Gute liegt so nah!
>
> Beitrag "AVR: I2C Master Software Library für alle AVR"

Ich will mich mal bemühen, ernsthaft auf Dumpfbacke zu antworten, obwohl 
das schwer fällt:

1. Das ist von 2015 und nur für "alle" AVR, die es da gab. Series 0/1 
und die Fragen nach der Register- und Statusbehandlung bei selbigen gab 
es noch nicht. Ein bisschen dazu steht übrigens in den eingangs von mir 
zitierten Sources bzw. Posts, samt den beim Debugging aufgetretenen 
Problemen. Das muss man aber lesen, um zu verstehen, dass es nicht ganz 
so trivial ist.

2. Warum Bitbanging nicht das Mittel der Wahl ist, wenn es im Prozessor 
eine komplette I2C-Engine gibt, nur schlecht dokumentiert, brauch wohl 
keine Erläuterung. Natürlich ist Bitbanging unter diesen Umständen 
Scheiße, wenn man das denn so ausdrücken möchte. Ich suche eine 
kompetente Lösung und kein Gefrickel.

von GermanFranz (Gast)


Lesenswert?

Dieter R. schrieb:
> Dazu die Errata im Datenblatt:
> TWI Smart mode gives extra clock pulse

Interessant.
Der Hinweis findet sich bei der 0-series Errata nicht und der Code 
funktioniert auf einem Mega4808 auch anstandslos. Soweit ich das bislang 
verglichen habe ist das TWI Modul mit dem der 1-series identisch!?

Davon abgesehen muß der Smartmode ja nicht unbedingt Verwendung finden. 
Man kann ihn vor dem Senden von NACK im Master-Read auch abschalten bzw. 
ganz außen vor lassen und sein ACK konventionell über die Command bits 
senden.

von Zweifelnder (Gast)


Lesenswert?

Dieter R. schrieb:
> ZUVERLÄSSIGE I2C-Routinen

frage: welche software kann fuer ihre fehlerfreiheit garantieren???

von Dieter R. (drei)


Lesenswert?

Zweifelnder schrieb:
> Dieter R. schrieb:
>> ZUVERLÄSSIGE I2C-Routinen
>
> frage: welche software kann fuer ihre fehlerfreiheit garantieren???

Beeil dich, du bist spät, der Kindergarten hat schon seit 8 Uhr 
geöffnet.

Ernsthaft: zuverlässig heißt z. B., dass mögliche Fehlerbedingungen 
abgefangen werden, Timeouts vorhanden sind für Abbruch nach eventuellen 
Übertragungsstörungen usw. Bewährt heißt, dass die Software nicht nur 
beim Verfasser läuft, sondern in einer möglichst großen Breite von 
verschiedenen Applikationen.

Die Series 0/1-Prozessoren von Atmel/Microchip sind ja als 
ausgesprochene Massenprodukte positioniert. Umso mehr erstaunt es mich, 
dass es anscheinend wenig brauchbare Unterstützung für die 
I2C-Schnittstelle gibt - wenn man mal von der Microchip-Originalsoftware 
absieht, die ich in der Tat für wenig brauchbar halte. Vielleicht bin 
ich auch bloß zu doof zum finden. Hier zumindest ist bisher auch nicht 
viel Ernsthaftes gekommen, abgesehen von den Ansätzen durch GermanFranz, 
wofür ich mich nochmals bedanke.

von Dieter R. (drei)


Lesenswert?

GermanFranz schrieb:
> Dieter R. schrieb:
>> Dazu die Errata im Datenblatt:
>> TWI Smart mode gives extra clock pulse
>
> Interessant.
> Der Hinweis findet sich bei der 0-series Errata nicht ...

Das hat mich auch ganz erheblich irritiert und nährt weitere Zweifel an 
der Atmel-Dokumentation.

Series 0 kam ja nach Series 1 auf den Markt. Wenn dafür neue Masken mit 
Fehlerbehebungen genommen wurden, sollte man annehmen, dass diese 
Fehlerbehebungen auch in Series 1 eingeflossen sind (bei den minimalen 
Unterschieden zwischen den ICs habe ich sowieso Schwierigkeiten, mir 
vorzustellen, dass das lauter verschiedene Maskenversionen sind). Meine 
frisch gekauften ATtiny1614 melden sich aber mit Revision A, also erste 
Maske.

Mindestens einen weiteren nicht dokumentierten Chip-Fehler habe ich 
inzwischen an ganz anderer Stelle gefunden. Will man den 
UART-Ausgangspin selbst ansteuern (weil man z. B. noch andere Peripherie 
daran angeschlossen hat, in meinem Fall eine LED), dann muss man 
manchmal (also vorsichtshalber immer) das Transmitter Empty Flag 
setzen, sonst kann man nicht auf den Ausgang zugreifen - auch, wenn nie 
ein Zeichen gesendet wurde, der Transmitter also ganz bestimmt empty 
ist.

Die Chips scheinen etwas mit der heißen Nadel bzw. Maske gestrickt zu 
sein. Genau deshalb suche ich Code, der schon einen möglichst breiten 
Realitätstest bestanden hat. Scheint aber schwierig zu sein.

von Oliver S. (oliverso)


Lesenswert?

Dieter R. schrieb:
> Offenbar funktioniert auch nicht alles in der Atmel-Hardware so,
> wie im Datenblatt vorgesehen. Für Series 0 und Series 1 gibt es jeweils
> im Anhang der Datenblätter erschreckend klingende (und leicht
> unterschiedliche) Fehlerlisten. Das ist nicht sehr vertrauenerweckend.

Der sicherste Weg ist, entweder andere Prozesoren (keine AVRs) oder was 
anderes als I2C für die Kommunikation zwischen den Prozessoren zu 
nehmen. Die I2C-Implementierung im AVR war noch nie eine 
Erfolgsgeschichte.

Oliver

von MaikS (Gast)


Lesenswert?

Oliver S. schrieb:
> Die I2C-Implementierung im AVR war noch nie eine
> Erfolgsgeschichte.

Ach woher denn. Ich kenne zwar andere Controller nicht genauer und weiß 
daher nicht, ob die I2C Maschinerie dort einfacher und sicherer zu 
bedienen ist. Beim AVR hat aber noch jedes diesbezügliche Programm 
funktioniert und warum sollte das bei den aktuellen Typen anders sein? 
Das einzige was (neuerdings) ziemlich stiefmütterlich behandelt wird 
sind die Datenblätter...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dumpfbacke schrieb:
> Den Peter Fleury willst ja nicht nehmen gell, weil das is
> ja das verpöhnte Bitbanging, was ja soooo scheisse ist.

Und stimmt ja auch gar nicht.
Wenn man sich mal mit dem Code beschäftigt, erfährt man schnell, das es 
davon abhängt, welche Datei man nun ins Projekt nimmt. Wählt man die 
'i2cmaster.s', ist es Bitbanging. Wählt man 'twimaster.c', wird das 
Hardware Interface benutzt.

von Dieter R. (drei)


Lesenswert?

Matthias S. schrieb:
> Dumpfbacke schrieb:
>> Den Peter Fleury willst ja nicht nehmen gell, weil das is
>> ja das verpöhnte Bitbanging, was ja soooo scheisse ist.
>
> Und stimmt ja auch gar nicht.

Sorry, ich habe mir zwar das ZIP-File von Peter Fleury Website 
heruntergeladen, im Beispielprogramm aber nur den Hinweis auf die 
Assembler-Source für Bitbanging gesehen. Dass twimaster.c die Hardware 
benutzt, habe ich übersehen. Irgendwie scheint er mir den Hinweis darauf 
gut versteckt zu haben.

Ich werde mir das noch mal genauer ansehen. Drei Fragen sind damit aber 
(noch) nicht gelöst:

1. Was ist bei Portierung auf Series 0/1 zu beachten?
2. Generell fehlt mir die Fehlerbehandlung. Ich sehe z. B. keine 
Timeouts, falls der Slave nicht antwortet. Vielleicht übersehe ich da 
aber auch etwas, ich habe jetzt bloß mal kurz reingeguckt (Die 
I2C-Spezifikation fordert meines Wissens keine Timeouts, aber praktisch 
muss man ja irgendwas machen, damit die Software nicht hängt).
3. Slave?

von Dieter R. (drei)


Lesenswert?

Oliver S. schrieb:
>
> Der sicherste Weg ist, entweder andere Prozesoren (keine AVRs) oder was
> anderes als I2C für die Kommunikation zwischen den Prozessoren zu
> nehmen. Die I2C-Implementierung im AVR war noch nie eine
> Erfolgsgeschichte.

Gehen wir das mal von der praktischen Seite an. Hast du einen Vorschlag, 
was man/ich statt ATtiny1614/1616/1617 nehmen soll?

Feature-Set, Mindestanforderungen:

Capacitive Touch (mit Unterstützung für Slider)
Configurable Logic mit Response Time << 1us
ADC
USART (bloß zum Debuggen, aber da ganz praktisch)
I2C

Vielleicht habe ich noch was vergessen, aber das ist aktuell in Gebrauch 
bzw. in Arbeit, neben üblichem Kleinkram wie Timer, Watchdog usw.

Ich bin nicht auf Atmel fixiert, sondern für jede Alternative offen 
(auch wenn es lästig wäre, den vorhandenen Code auf eine andere 
Plattform zu portieren).

von GermanFranz (Gast)


Lesenswert?

Dieter R. schrieb:
> Timeouts, falls der Slave nicht antwortet. Vielleicht übersehe ich da
> aber auch etwas, ich habe jetzt bloß mal kurz reingeguckt (Die
> I2C-Spezifikation fordert meines Wissens keine Timeouts, aber praktisch
> muss man ja irgendwas machen, damit die Software nicht hängt

Nach dem Schreiben der Adresse (im UNKOWN Busstatus) wird doch WIF 
gesetzt bzw. der zugehörige Interrupt ausgelöst und Du kannst RXACK 
nachprüfen. Da hängt nichts.

von Dieter R. (drei)


Lesenswert?

Ich habe das jetzt nicht überprüft, nur als Frage: was ist mit RIF? Kann 
das nicht hängen, wenn der Slave nicht antwortet?

von GermanFranz (Gast)


Lesenswert?

Dieter R. schrieb:
> Ich habe das jetzt nicht überprüft, nur als Frage: was ist mit
> RIF? Kann das nicht hängen, wenn der Slave nicht antwortet?

Gehen wir davon aus daß die Adresse wie beschrieben vom Slave bestätigt 
wurde. RIF wird jetzt beim weiteren Lesen im Master-Read nur dann 
ausgelöst wenn das nächste Byte vom Slave ordnungsgemäß empfangen 
wurde. Die Software ist nun am Zuge und hält den Leseprozess mit dem 
Auslesen von MDATA weiter am Laufen (oder beendet ihn). Käme es beim 
Empfang zu Problemen würde statt dessen automatisch WIF gesetzt und man 
kann der Fehlerursache via MSTATUS (im Interrupt) auf den Grund gehen 
und geeignete Maßnahmen ergreifen.

von GermanFranz (Gast)


Lesenswert?

GermanFranz schrieb:
> Nach dem Schreiben der Adresse (im UNKOWN Busstatus) wird doch WIF
> gesetzt...

Kleine Korrektur: Natürlich im IDLE Status, den man im UNKNOWN Status 
nach TWI Enable herbeiführen kann!

von Dieter R. (drei)


Lesenswert?

1. Nach weiteren Tests und tieferem Einstieg in das Datenblatt: der oben 
von mir zitierte Code (von beiden Verfassern) aus dem avrfreaks-Forum 
scheint mir fraglich zu sein. Ich neige inzwischen der Meinung zu, dass 
es unverstandenes Zeug ist und der Prozessor falsch bedient wird. 
Weiteres aber später, ich bin noch am Testen.

2. Nochmal Nachfrage zum Timeout.

Wenn ich den Code von Peter Fleury richtig verstehe, dann hängt 
twimaster.c, wenn kein I2C Device angeschlossen ist und man versucht, 
Daten zu lesen.

Kann das jemand, der einen von Fleury unterstützten Prozessor hat, 
testen und bestätigen? Wäre für mich sehr hilfreich.

von Jammerlappendiagnostizierer (Gast)


Lesenswert?

Dieter R. schrieb:
> Die Chips scheinen etwas mit der heißen Nadel bzw. Maske gestrickt zu
> sein.

Was manche Leute hier immer rumjammern müssen. Die Teile funktionieren 
super und von den Erratas gibts bei anderen Marken viel längere.

>Genau deshalb suche ich Code, der schon einen möglichst breiten
> Realitätstest bestanden hat. Scheint aber schwierig...

Schwierig bei Chips die noch nicht lang am Markt sind! Meinst Du nicht 
auch?
Hoffentlich lässt Du uns an den bald zu erwartenden profunden 
Erkenntnissen teilhaben!

von Dieter R. (drei)


Lesenswert?

Nach dem voranstehenden Müll nochmals meine Bitte an ernsthafte 
Forumsmitglieder:

Nachfrage zum Timeout.

Wenn ich den Code von Peter Fleury richtig verstehe, dann hängt
twimaster.c, wenn kein I2C Device angeschlossen ist und man versucht,
Daten zu lesen.

Kann das jemand, der einen von Fleury unterstützten Prozessor hat,
testen und bestätigen? Wäre für mich sehr hilfreich. Danke.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dieter R. schrieb:
> Wenn ich den Code von Peter Fleury richtig verstehe, dann hängt
> twimaster.c, wenn kein I2C Device angeschlossen ist und man versucht,
> Daten zu lesen.

Nö, nicht, wenn man es richtig macht.
1
void send_I2C(uint8_t isCommand) 
2
{
3
uint8_t ret;
4
  ret = i2c_start(TIANMA_ADDRESS+I2C_WRITE);       // set device address and write mode
5
  if ( ret ) {
6
        /* failed to issue start condition, possibly no device found */
7
     i2c_stop();
8
     theAck = 0;
9
     }else {
10
 /* issuing start condition ok, device accessible */
11
   if (isCommand) theData = 0x00 ; else theData = 0x40;
12
     i2c_write(theData);      // 
13
     i2c_write(theData2);      // 
14
     i2c_stop();               // set stop conditon = release bus
15
       theAck = 1;
16
  }
17
}
Ist 'ret' beim START Kommando also ungleich 0, ist das Device nicht 
vorhanden und man sollte gar nicht erst probieren, Daten zu schreiben.

Gerade erst beim Ausklingeln eines unbekannten Pollin LCD erfolgreich 
ausprobiert - auf der Suche nach der I²C Adresse des lustigen Teiles. MC 
war ein Mega328.

: Bearbeitet durch User
von Dieter R. (drei)


Lesenswert?

Matthias S. schrieb:
> Dieter R. schrieb:
>> Wenn ich den Code von Peter Fleury richtig verstehe, dann hängt
>> twimaster.c, wenn kein I2C Device angeschlossen ist und man versucht,
>> Daten zu lesen.
>
> Nö, nicht, wenn man es richtig macht.
>
> Ist 'ret' beim START Kommando also ungleich 0, ist das Device nicht
> vorhanden und man sollte gar nicht erst probieren, Daten zu schreiben.
>

Da möchte ich aber vorsichtig widersprechen. Das Thema in der Praxis 
(nicht beim Quick-and-Dirty-Test, der mir ja reichen würde) ist nicht, 
dass das Device überhaupt nicht vorhanden ist, sondern dass es im 
ungünstigen Moment eine Bus-Störung gibt und das Device dann nicht 
mehr vorhanden ist (also beispielsweise zwischen Adressierung und Read). 
Auch dann sollte die Software nicht hängen, sondern einen geordneten 
Ausstieg mit Fehlermeldung produzieren.

Soweit ich das sehe (daher ja meine Frage nach praktischem Test) ist der 
Code bei der Adressierung unkritisch, das Statusbit wird in jedem Fall 
gesetzt, da die Adresse immer geschrieben wird und die Antwort nur ACK 
bzw. NACK sein kann, auch wenn gar kein Device da ist. READ hängt dann 
aber im von mir beschriebenen Szenario.

: Bearbeitet durch User
von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dieter R. schrieb:
> ist nicht,
> dass das Device überhaupt nicht vorhanden ist

So hattest du es aber geschrieben:

Dieter R. schrieb:
> wenn kein I2C Device angeschlossen ist und man versucht,
> Daten zu lesen.

Von Busstörungen war bisher nicht die Rede. Dafür gibt es von Philips 
eine Routine, die du aber mit Bitbanging implementieren solltest. Dazu 
clockt der Master SCL solange (max. 9 Bits), bis SDA wieder high wird. 
Genaueres gibts in den I²C Grundlagen von den Holländern in 
https://www.nxp.com/documents/user_manual/UM10204.pdf

Hier speziell Abschnitt 3.1.16

: Bearbeitet durch User
von Dieter R. (drei)


Lesenswert?

Matthias S. schrieb:

> Von Busstörungen war bisher nicht die Rede. Dafür gibt es von Philips
> eine Routine, die du aber mit Bitbanging implementieren solltest. Dazu
> clockt der Master SCL solange (max. 9 Bits), bis SDA wieder high wird.
> Genaueres gibts in den I²C Grundlagen von den Holländern in
> https://www.nxp.com/documents/user_manual/UM10204.pdf
>
> Hier speziell Abschnitt 3.1.16

Danke für den Hinweis. Ich hatte eingangs mal etwas von "zuverlässig" 
geschrieben. Zur Zuverlässigkeit gehört nach meinem Dafürhalten, dass 
nach Übertragungsstörungen ein definiertes Verhalten vorliegt und ein 
neues Aufsetzen der Verbindung möglich ist. Mindestens ist mein Ziel, 
dass meine bzw. die von mir verwendete Software das schlussendlich 
leistet.

Dazu jetzt noch mal meine Frage: Der Fleury-Code hängt unter der 
angegebenen Bedingung? Oder haben die "alten" Atmels da einen 
eingebauten Timeout-Mechanismus bzw. verstehe ich den Code falsch? Um 
den Bus frei zu clocken, muss man ja erst einmal aus einer hängenden 
Übertragung herauskommen.

Und dazu weitere Fragen: Ich würde ungern mit Bitbanging in die 
vorhandene I2C-Engine hineinpfuschen. Reicht es, BUSSTATE auf IDLE zu 
setzen und so lange neu zu adressieren, bis sich der Slave wieder 
meldet? Ich sehe jetzt nicht, was dabei anderes passiert als 9 x 
irgendwas zu clocken. Gibt es dazu Literatur oder Sources? In meiner 
aktuellen (unfertigen und nicht ausgetesteten) Version mache ich das so, 
aber bloß in der einfachen Annahme, dass viel Adressieren viel hilft. 
Wie kann man so etwas testen?

von Edgar S. (Firma: keine) (heinbloed1)


Lesenswert?

Ein guter Rat:

Wenn Du wirklich was zuverlässiges haben willst, lass die Finger
von dem I2C Dreck.

Lies dir mal die App von Analog Devices durch, wie groß muß da
die Verzweifelung gewesen sein wenn man seinen Kunden zu
solch einem Murks rät.

https://www.analog.com/media/en/technical-documentation/application-notes/54305147357414AN686_0.pdf

von Edgar S. (Firma: keine) (heinbloed1)


Lesenswert?

Dieter R. schrieb:
> Matthias S. schrieb:

>
> Und dazu weitere Fragen: Ich würde ungern mit Bitbanging in die
> vorhandene I2C-Engine hineinpfuschen. Reicht es, BUSSTATE auf IDLE zu
> setzen und so lange neu zu adressieren, bis sich der Slave wieder
> meldet? Ich sehe jetzt nicht, was dabei anderes passiert als 9 x
> irgendwas zu clocken. Gibt es dazu Literatur oder Sources? In meiner
> aktuellen (unfertigen und nicht ausgetesteten) Version mache ich das so,
> aber bloß in der einfachen Annahme, dass viel Adressieren viel hilft.
> Wie kann man so etwas testen?

Es gibt beim I2C "deadlocks" die sich auch mit 9 mal schieben nicht
auflösen lassen. Da hilft nur den "Stecker" zu ziehen und zu hoffen
das es beim nächsten Versuch besser geht.

von Dieter R. (drei)


Lesenswert?

@EdgarS und weitere: der Thread hat eine gewisse Tendenz, vom Thema 
abzuweichen. Ich wäre sehr dankbar, wenn sich zukünftige Antworten auf 
das eigentliche Thema beschränken könnten. Zur Erinnerung, das ist I2C 
mit ATtiny 0/1 Series. Dabei möchte ich nämlich vorankommen, und da ich 
sicher nicht der einzige bin, der mit diesem Prozessor arbeitet, hilft 
es vielleicht auch ein paar anderen. Danke.

von GermanFranz (Gast)


Lesenswert?

Dieter R. schrieb:
> ungünstigen Moment eine Bus-Störung gibt und das Device dann nicht mehr
> vorhanden ist (also beispielsweise zwischen Adressierung und Read). Auch
> dann sollte die Software nicht hängen

So schwierig es ist, diesen Fall nach erfolgreicher Adress-Bestätigung 
durch den Slave nachzustellen so selten dürfte der Fall auch in der 
Praxis auftreten. Aber nochmal: Das würde mit gesetztem WIF Bit und in 
MSTATUS angezeigt, der Bus geht auf BUSY und man kann drauf reagieren. 
Da hängt nichts in dem Sinne dass es nicht in Software zu behandeln 
wäre.

> da die Adresse immer geschrieben wird und die Antwort nur ACK
> bzw. NACK sein kann, auch wenn gar kein Device da ist.

Wenn das Device nicht da ist kann kein ACK kommen.

> Reicht es, BUSSTATE auf IDLE zu
> setzen und so lange neu zu adressieren, bis sich der Slave wieder
> meldet?

Wenn es nicht ausdrücklich auf Performance ankommt wär mein Vorschlag, 
das TWI dazu kurz außer Betrieb zu nehmen und neu zu starten. Wenn sich 
dann der Slave nicht melden würde hättest Du definitiv ein 
grundsätzliches Problem. Aber es ist mit der fehlenden ACK Bestätigung 
nach der Adressierung zumindest klar ersichtlich.

von GermanFranz (Gast)


Lesenswert?

Edgar S. schrieb:
> Es gibt beim I2C "deadlocks" die sich auch mit 9 mal schieben nicht
> auflösen lassen. Da hilft nur den "Stecker" zu ziehen und zu hoffen
> das es beim nächsten Versuch besser geht.

Extrem selten aber, ACK, selbst erlebt. Ein I2C Sensor hatte sich in 
einer Weise aufgehängt dass nichts anderes mehr half. Immerhin hat der 
TO seine Devices hier komplett selber in der Hand da er ja nur zwei 
Controller verbinden möchte.

von Peter D. (peda)


Lesenswert?

Ich hatte in einem Gerät Multimaster-I2C mit Philips P80C652 aufgebaut. 
Das lief auf Anhieb und super stabil. Timeout war nicht nötig. Dann habe 
ich es auf den Flash-MC P89C668 geändert, weiterhin alles in Butter.
Dann hat aber NXP nach der Phillips Übernahme das ganze 8051-Zeugs 
fallen gelassen, wie eine heiße Kartoffel.
Ich hab dann auf Atmel 80C51 und AVR gewechselt und es lief gar nichts 
mehr. Ich mußte dann mit Pin-Change-Interrupt und Timeout prüfen, ob 
sich der Bus aufgehängt hatte und ihn ständig resetten, typisch so alle 
10s.
Ich hab auch den Nachbau des P89C668 von TEKMOS (TK89C668) probiert, 
aber dessen I2C ist auch Schrott.
Ich hab daher den Verdacht, daß nur Phillips als I2C-Erfinder den 
I2C-Bus richtig verstanden und fehlerfrei implementiert hat.

von Dieter R. (drei)


Lesenswert?

Vorbemerkung: ich beziehe mich in meinen Äußerungen auf Fleury, da ich 
sinnvoller- und einfacherweise in einem C-Projekt nur C-Software 
einsetzen möchte.

GermanFranz schrieb:

>> da die Adresse immer geschrieben wird und die Antwort nur ACK
>> bzw. NACK sein kann, auch wenn gar kein Device da ist.
>
> Wenn das Device nicht da ist kann kein ACK kommen.

Klar doch. Mein Satz bezog sich darauf, dass die while-Schleife immer 
terminiert, egal ob ACK oder NACK kommt, also auch dann, wenn kein 
Device da ist. Beim READ ist das aber nicht so.
>
>> Reicht es, BUSSTATE auf IDLE zu
>> setzen und so lange neu zu adressieren, bis sich der Slave wieder
>> meldet?
>
> Wenn es nicht ausdrücklich auf Performance ankommt wär mein Vorschlag,
> das TWI dazu kurz außer Betrieb zu nehmen und neu zu starten. Wenn sich
> dann der Slave nicht melden würde hättest Du definitiv ein
> grundsätzliches Problem. Aber es ist mit der fehlenden ACK Bestätigung
> nach der Adressierung zumindest klar ersichtlich.

Ich habe jetzt folgende Idee, für die mir im Moment das Test-Szenario 
fehlt, die aber nach meinem Verständnis genau das tut, was Philips/NXP 
empfiehlt:

void I2C_recover(void)                        // clock out I2C bus if in 
invalid state (e.g. after incomplete transaction)
{
  TWI0.MSTATUS  |= TWI_BUSSTATE_IDLE_gc;            // force bus idle
  I2C_start(0xff);                        // send byte, all bits high
  I2C_stop();
}

Die State Machine wird auf Idle gesetzt, dann wird FF adressiert (was 
natürlich erfolglos bleibt) und die Transaktion beendet.

Kommentare dazu erbeten.

von GermanFranz (Gast)


Lesenswert?

Peter D. schrieb:
> Ich hab daher den Verdacht, daß nur Phillips als I2C-Erfinder den
> I2C-Bus richtig verstanden und fehlerfrei implementiert hat.

Wer wollte das bis ins letzte Detail nachprüfen. Fakt ist aber, daß mehr 
als genug I2C Programme auch mit AVR zuverlässig und stabil im Einsatz 
sind. Das gilt für meine aktuell seit Wochen durchlaufende Kombination 
von M4808 und einem HYT271 genauso. Dennoch: Elektronik kann sensibel 
sein und ausfallen. Warum sollte das bei I2C/TWI anders sein. Da hilft 
dann die zuverlässigste Software nicht mehr...

von GermanFranz (Gast)


Lesenswert?

Dieter R. schrieb:
>   I2C_start(0xff);                        // send byte, all bits high
>   I2C_stop();

Diese Sequenz ist illegal und führt lt. Doku zu einem Busfehler. Das 
wäre mein Kommentar.

von Dieter R. (drei)


Lesenswert?

GermanFranz schrieb:
> Dieter R. schrieb:
>>   I2C_start(0xff);                        // send byte, all bits high
>>   I2C_stop();
>
> Diese Sequenz ist illegal und führt lt. Doku zu einem Busfehler. Das
> wäre mein Kommentar.

Was an der Sequenz ist illegal? Genau das empfiehlt  (nach meinem 
Verständnis) die Application Note von AMD (siehe EdgarS):

https://www.analog.com/media/en/technical-documentation/application-notes/54305147357414AN686_0.pdf

und auch bei NXP sehe ich jetzt nicht, was dagegen spricht.

Zitat AMD:

1) Master tries to assert a Logic 1 on the SDA line
2) Master still sees a Logic 0 and then generates a clock
pulse on SCL (1-0-1 transition)
3) Master examines SDA. If SDA = 0, go to Step 2; if
SDA = 1, go to Step 4
4) Generate a STOP condition

Schritt 2/3 kann man (siehe NXP) einfach 9x durchlaufen lassen. Das 
sollte mein Code-Vorschlag tun (wenn ich mich nicht irre).

von GermanFranz (Gast)


Lesenswert?

Naja wir sind hier nicht bei NXP oder AMD. Schau mal in die Erklärung 
des BUSERR Bits im Datenblatt!

von GermanFranz (Gast)


Lesenswert?

Ach so, moment mal. Passt schon. Hatte gerade nur Start/Stop Bit Senden 
wahrgenommen. Sorry. Bin nicht so der C-Freak.

von Dieter R. (drei)


Lesenswert?

GermanFranz schrieb:
> Naja wir sind hier nicht bei NXP oder AMD. Schau mal in die Erklärung
> des BUSERR Bits im Datenblatt!

Hmm, ob BUSERR gesetzt ist, sollte egal sein, aber ich glaube, es geht 
wirklich nicht, das scheint mir das entscheidende Problem zu sein 
(falls der Slave SDA low hält):

"and the SCL line is released"

Der clockt gar nicht. Jetzt fehlt mir erst mal eine gute Idee. 9 x die 
ganze Prozedur? Einfach ein FF-Datenbyte senden? Adresse 00 senden?

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Dieter R. schrieb:
> Wenn ich den Code von Peter Fleury richtig verstehe, dann hängt
> twimaster.c, wenn kein I2C Device angeschlossen ist und man versucht,
> Daten zu lesen.
>
> Kann das jemand, der einen von Fleury unterstützten Prozessor hat,
> testen und bestätigen? Wäre für mich sehr hilfreich. Danke.

Der Fleury-Code enthält keinerlei Timeouts oder irgendwelche Recoveries 
aus Fehlerzuständen. Das ist lediglich eine 
straight-forward-Implementierung der I2C-Grundfunktionen.

Oliver

von Dieter R. (drei)


Lesenswert?

Oliver S. schrieb:
> Dieter R. schrieb:
>> Wenn ich den Code von Peter Fleury richtig verstehe, dann hängt
>> twimaster.c, wenn kein I2C Device angeschlossen ist und man versucht,
>> Daten zu lesen.
>>
>> Kann das jemand, der einen von Fleury unterstützten Prozessor hat,
>> testen und bestätigen? Wäre für mich sehr hilfreich. Danke.
>
> Der Fleury-Code enthält keinerlei Timeouts oder irgendwelche Recoveries
> aus Fehlerzuständen. Das ist lediglich eine
> straight-forward-Implementierung der I2C-Grundfunktionen.
>
> Oliver

Danke, wie vermutet. Ich bin etwas erstaunt, das ein 
(offenbar/angeblich) weit verbreiteter Code wie der von Fleury solche 
Dinge nicht berücksichtigt. Den Timeout habe ich inzwischen drin, 
vorsichtshalber in allen while-Loops. Jetzt fehlt mir eigentlich nur 
noch eine gute Idee für Recovery aus illegalem Bus-Zustand, siehe direkt 
darüber. Im Moment bin ich da etwas ratlos.

von Dieter R. (drei)


Lesenswert?

Ich habe jetzt etwas interessantes gefunden, direkt vom Erfinder bzw. 
dessen Nachfahren:

https://www.nxp.com/docs/en/application-note/AN4803.pdf

Das ist offenbar für NXP-Prozessoren mit eingebautem 
I2C-Hardware-Interface.

Auf S. 18 wird die Recovery-Routine beschrieben, 9 x clocken, alles zu 
Fuß. Wenn schon NXP das so macht, dann bleibt einem bei ATtiny wohl auch 
nichts anderes übrig.

Es sei denn, es hat jemand doch noch eine bessere Idee...

von GermanFranz (Gast)


Lesenswert?

Dieter R. schrieb:
> Ich bin etwas erstaunt, das ein
> (offenbar/angeblich) weit verbreiteter Code wie der von Fleury solche
> Dinge nicht berücksichtigt.

Vielleicht, weil sie gar nicht so praxisrelevant sind wie Du meinst?

> noch eine gute Idee für Recovery aus illegalem Bus-Zustand, siehe direkt
> darüber. Im Moment bin ich da etwas ratlos.

Was hindert Dich an einem simplen Reset beider TWI Interfaces? Geht es 
nicht nach wie vor um die Verbindung zweier Tinys?

> Auf S. 18 wird die Recovery-Routine beschrieben, 9 x clocken, alles zu
> Fuß.

Was macht Dich sicher, daß diese mit TWI samt aller daran 
angeschlossenen I2C Devices kompatibel wäre?

Es schaut so aus als suchtest Du die perfekte, alle Problemfälle 
erschlagende Lösung. Daran dürfte man sich verheben, schon gar nicht 
kann man alle denkbaren Problemfälle durchtesten. Ich denke Du solltest 
pragmatischer an die Sache herangehen und Deine Master-Slave 
Kommunikation erstmal in der Low-Speed Grundfunktionalität auf die Beine 
stellen. Möglicherweise kommst Du dann zum Schluss, dass alle Bemühungen 
um irgendwelche weitergehenden komplexen Fehlerszenarien vergebliche 
Liebesmüh war :)

von Dieter R. (drei)


Lesenswert?

GermanFranz schrieb:
> Dieter R. schrieb:
>> Ich bin etwas erstaunt, das ein
>> (offenbar/angeblich) weit verbreiteter Code wie der von Fleury solche
>> Dinge nicht berücksichtigt.
>
> Vielleicht, weil sie gar nicht so praxisrelevant sind wie Du meinst?
>

Och, ich hatte mal das Vergnügen, mit der Entwicklung von 
Bareboard-Testern befasst zu sein, wobei die Messelektronik über USB 
angebunden war und im Testsystem Impulsströme auftreten konnten. Wenn's 
geknallt hat, war gelegentlich das USB-Device weg. Wir haben das Problem 
dann letztlich gelöst, aber es hat mehrere Entwickler viele Tage und 
lange Versuche gekostet.

USB ist zweifellos etwas prekärer als I2C, wenn es um die 
Fehlerbehandlung geht. Jedenfalls weiß ich seitdem, wie wichtig 
Fehlerbehandlung ist. Man sollte jedenfalls alle Fehlerzustände 
behandeln, die bekannt und dokumentiert sind, siehe NXP. Die unbekannten 
können dann immer noch dazu kommen.

>> Auf S. 18 wird die Recovery-Routine beschrieben, 9 x clocken, alles zu
>> Fuß.
>
> Was macht Dich sicher, daß diese mit TWI samt aller daran
> angeschlossenen I2C Devices kompatibel wäre?

Die Protokolldefinition verbunden mit der Tatsache, dass es die 
offizielle Lösung von Philips/NXP ist.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Dieter R. schrieb:

> Die Protokolldefinition verbunden mit der Tatsache, dass es die
> offizielle Lösung von Philips/NXP ist.

Das Problem ist nur (Zitat von de.i2c.org):

> Clock Stretching

> Busteilnehmer können die Taktleitung während der Low-Phase gegen Masse
> halten und so ein erneutes Steigen der Flanke verhindern. Hierdurch kann
> die Übertragung aktiv verzögert werden. Dieses Verhalten wird als Clock
> Stretching bzw. Clock Synchronisation bezeichnet.

> Bemerkenswert ist, daß die I2C-Spezifikation keine Maximalzeiten für das
> Stretching vorsieht, so daß diese Verzögerung beliebig lange andauern
> darf.

Sprich: es kann KEINE endgültige Lösung für das Problem geben. Und 
auch diese sog. "offizielle" Lösung löst das Problem nicht, denn du 
kannst keine Takte ausgeben, wenn ein abgeschmierter Client (wegen 
aktiven Clock-Stretchings) dauerhaft SCL auf Low hält (übrigens auch 
keine stop condition).

Trotz dieser unbestreitbaren Tatsachen laufen aber milliardenfach 
I2C-Busse ohne das geringste Problem. Das allein sagt schon aus, wie 
gering die Signifikanz des Problems tatsächlich ist.

Wenn der Bus elektrisch korrekt ausgeführt und die Software fehlerfrei 
ist, hängt da niemals etwas. Und wenn das nicht der Fall ist, hat halt 
der Bus korrekt designed zu werden und die Bugs der Peers haben gefixed 
zu werden und nicht irgendwelche schrägen Workarounds implementiert zu 
werden, seien sie auch noch so "offiziell"...

Und wenn halt die Hardware irgendeines Device ein Erratum hat, für das 
kein  wirksamer Workaround in der Firmware des Device möglich ist, dann 
darf man diese Hardware halt nicht benutzen und muss dann halt notfalls 
auf Bitbanging ausweichen, wenn I2c und der Einsatz dieses Device 
unumgänglich sind. So einfach ist das.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

c-hater schrieb:
> hängt da niemals etwas

Full ACK. Ich habe hier einige Geräte inkl. einem Frequenzzähler von 
Philips, der ausschliesslich über I²C kommuniziert und der immer 
zuverlässig funktioniert. Man muss eben auch mal die Kirche im Dorf 
lassen. I²C bzw. TWI (so nennen das die Firmen, die sich Lizenzgebühren 
sparen wollen) ist kein universelles, weitreichendes Bussystem mit 
doppeltem Boden, sondern ein einfacher Bus zur Kommunikation auf einem 
Board zwischen ein paar ICs. Er ist nicht störungsgesichert und er 
verlässt sich auf richtiges Handling durch alle Beteiligten.

Die Implementationen unterscheiden sich und ich habe z.B. sowohl mit der 
Soft- als auch der Hardware Variante von Peter Fleury gute Erfahrungen 
und stabile Systeme gebaut - die sich auch in Konsumerhänden befinden 
und jedesmal gut laufen.

von Dieter R. (drei)


Lesenswert?

c-hater schrieb:

> Wenn der Bus elektrisch korrekt ausgeführt und die Software fehlerfrei
> ist, hängt da niemals etwas.

Falsch

Lies die AMD-Applikation, dann weißt du, wie dieser Zustand eintreten 
kann. Bei ansonsten korrekt funktionierenden Devices, die unabhängig 
voneinander arbeiten. Das weiß nicht nur AMD, das weiß auch Philips, 
deshalb haben sie ja das Recovery "erfunden" und dokumentiert.

von leo (Gast)


Lesenswert?

Dieter R. schrieb:
> Lies die AMD-Applikation, dann weißt du, wie dieser Zustand eintreten
> kann

Also, was ich jetzt gelesen hab, tritt das Problem bei fehlerhaften 
IRQ-Routinen auf, die nicht alles gesichert haben.
Ich wuerde mal sagen, Workarounds fuer solche IRQ-Routinen sind sinnlos, 
da potentiell ausufernd.

Kannst du das Problem genauer schildern?

Danke, leo

von c-hater (Gast)


Lesenswert?

Dieter R. schrieb:

> c-hater schrieb:
>
>> Wenn der Bus elektrisch korrekt ausgeführt und die Software fehlerfrei
>> ist, hängt da niemals etwas.
>
> *Falsch*
>
> Lies die AMD-Applikation, dann weißt du, wie dieser Zustand eintreten
> kann.

Zeig' mir den entsprechenden Text. Wenn es ihn tatsächlich gibt, sollte 
das kein Problem sein...

von Dieter R. (drei)


Lesenswert?

leo schrieb:
> Dieter R. schrieb:
>> Lies die AMD-Applikation, dann weißt du, wie dieser Zustand eintreten
>> kann
>
> Also, was ich jetzt gelesen hab, tritt das Problem bei *fehlerhaften*
> IRQ-Routinen auf, die nicht alles gesichert haben.
> Ich wuerde mal sagen, Workarounds fuer solche IRQ-Routinen sind sinnlos,
> da potentiell ausufernd.
>
> Kannst du das Problem genauer schildern?
>
> Danke, leo

Ja, gerne:

Frequently the master, which is usually a microcontroller or a gate 
array, will be interrupted in the middle of its communication with an 
I2C slave and, upon return, find a stuck bus. Initially this looks like 
a device problem, but it is not. The slave is still waiting to send the 
remainder of the data requested by the master. The problem is that the 
master has forgotten where it was when it was interrupted or reset. An 
extraneous reset on the processor will generally create this condition, 
especially if the processor cannot save its status. At this point, the 
slave will have put the next bit out on the SDA line (because the SCL 
line may have dropped to a low on reset) and awaits the next clock on 
SCL. Of course the processor does not send it, and as a result this 
slave just waits and waits.

Der entscheidende Satz ist:

An extraneous reset on the processor will generally create this 
condition, especially if the processor cannot save its status.

Nehmen wir an, durch einen Störimpuls (oder auch, soll ja vorkommen, ein 
selten auftretender Software-Fehler) hat der Watchdog beim Master 
zugeschlagen oder der Master wurde aus einem anderen Grund (Brownout) 
resettet, der Slave aber nicht. Dann haben wir die beschriebene 
Situation. Dann hilft nur Stecker ziehen oder eben rausclocken. 
Jedenfalls ist das mein Verständnis.

von leo (Gast)


Lesenswert?

Dieter R. schrieb:
> The problem is that the
> master has forgotten where it was when it was interrupted

Hab ich gelesen, danke. Kaputte IRQs (oder Hardware) an einer Stelle 
(I2C) fixen zu wollen ist sinnlos. Was macht derweil andere Hardware, 
die ev. auch betroffen ist und fuer die es keinen "Fix" gibt?
Die zaeumen das Pferd von hinten auf.

leo

von c-hater (Gast)


Lesenswert?

Dieter R. schrieb:

> Frequently the master, which is usually a microcontroller or a gate
> array, will be interrupted in the middle of its communication with an
> I2C slave and, upon return, find a stuck bus.

Ah, OK. Was also soll einen Master "mitten in" seiner Kommunikation 
unterbrechen?

> Initially this looks like
> a device problem, but it is not. The slave is still waiting to send the
> remainder of the data requested by the master. The problem is that the
> master has forgotten where it was when it was interrupted or reset.

Alles klar: Der Master ist beschissen programmiert oder wurde resetted. 
Gegen die beschissene Programmierung hilft eine korrekte Programmierung 
und gegen die Auswirkungen eines alleinigen Reset des Masters (auch der 
kann eigentlich nur aus inkorrekter Programmierung stammen, z.B. aus dem 
Einsatz eines Watchdog zum Vertuschen von Programmfehlern) hilft nur ein 
nachfolgender Reset aller Busteilnehmer, sprich: ein "power cycle".

So einfach ist das. Problem->Lösung. Man muss einfach nur korrekte 
Programme schreiben.

von leo (Gast)


Lesenswert?

c-hater schrieb:
> Gegen die beschissene Programmierung ...

Die wortgewaltige Ausdrucksweise des Posters unterstützt wohl meine 
Argumentation ;-)

leo

von c-hater (Gast)


Lesenswert?

c-hater schrieb:

> So einfach ist das. Problem->Lösung. Man muss einfach nur korrekte
> Programme schreiben.

(Vergessen:) wichtige Ergänzung: I2C ist so einfach gestrickt, dass es 
möglich ist, BEWEISBAR fehlerfreie Implementierungen zu schreiben...

von c-hater (Gast)


Lesenswert?

leo schrieb:

> Die wortgewaltige Ausdrucksweise des Posters unterstützt wohl meine
> Argumentation ;-)

Das sagst du, aber frag' mal IRGENDEINEN, der seit Jahrzehnten mit 
Software sein Geld verdient...

von leo (Gast)


Lesenswert?

c-hater schrieb:
> leo schrieb:
>
>> Die wortgewaltige Ausdrucksweise des Posters unterstützt wohl meine
>> Argumentation ;-)
>
> Das sagst du, aber frag' mal IRGENDEINEN, der seit Jahrzehnten mit
> Software sein Geld verdient...

Hab ich - und wenn ich mit kaputter Umgebung arbeiten musste, dann 
fixte ich zuerst die Umgebung.

leo

von Dieter R. (drei)


Lesenswert?

Leute, regt euch ab. Auch mit beweisbar (haha) fehlerfreier Software 
kann man keinen Brownout verhindern. Watchdogs wurden übrigens u. a. 
deshalb erfunden, weil das mit der Beweisbarkeit so seine Sache ist.

Deshalb muss ein zuverlässiges System so etwas eben abfangen. Ich 
bemühe mich, daran zu arbeiten. Dauert aber noch ein bisschen. Falls 
zwischenzeitlich noch jemand Ideen oder Tips zur Sache beisteuern 
möchte, gerne.

von c-hater (Gast)


Lesenswert?

Dieter R. schrieb:

> Leute, regt euch ab. Auch mit beweisbar (haha) fehlerfreier Software
> kann man keinen Brownout verhindern.

Nö, dafür gibt es brownout detectors. Und übrigens ist es absolut nicht 
lächerlich, Protokolle, die sich einfach beweisbar fehlerfrei umsetzen 
lassen auch tatsächlich so zu implementieren...

> Watchdogs wurden übrigens u. a.
> deshalb erfunden, weil das mit der Beweisbarkeit so seine Sache ist.

Ja. Es gibt viele Sachen, deren Komplexität so hoch ist, dass sich deren 
Fehlerfreiheit nicht in akzeptabler Zeit beweisen läßt. Eine 
I2C-Implementierung gehört aber zum Glück nicht zu dieser Klasse von 
Problemen.

> Deshalb muss ein zuverlässiges System so etwas eben abfangen.

Dann setze doch einfach auf einen Watchdog. In allen Devices am Bus. 
Merkst du jetzt, wie vollständig idiotisch dein Ansatz ist?

von Dieter R. (drei)


Lesenswert?

c-hater schrieb:

> Dann setze doch einfach auf einen Watchdog. In allen Devices am Bus.
> Merkst du jetzt, wie vollständig idiotisch dein Ansatz ist?

Idiotisch ist ein starkes Wort. Ich bemühe mich, solch starke Worte zu 
vermeiden. Du dagegen scheinst es nicht begreifen zu wollen. Der Ansatz 
ist nicht von mir, sondern von Philips, und AMD hat ihn zitiert. Ich 
bemühe mich nur, das, was dort steht, in einer sauberen Implementierung 
umzusetzen, weil ich nach Durchlesen zu der Überzeugung gekommen bin, 
dass es relevant ist. Man kann natürlich der Meinung sein, dass 
Applikationsschriften von NXP zur I2C-Fehlerbehandlung irrelevant sind, 
aber dann sollte man schon bessere Argumente haben als "idiotisch".

Übrigens gibt es weder (um mal wieder ein Beispiel zu nennen) 
I2C-I/O-Expander mit Watchdog noch ist das hier überhaupt das Thema, was 
dem Slave helfen würde. Das Thema ist, ach, lassen wir das ...

von c-hater (Gast)


Lesenswert?

Dieter R. schrieb:

> Man kann natürlich der Meinung sein, dass
> Applikationsschriften von NXP zur I2C-Fehlerbehandlung irrelevant sind,
> aber dann sollte man schon bessere Argumente haben als "idiotisch".

Das habe ich im Thread bereits getan. Um 17:32.

von Dieter R. (drei)


Lesenswert?

c-hater schrieb:
> Dieter R. schrieb:
>
>> Man kann natürlich der Meinung sein, dass
>> Applikationsschriften von NXP zur I2C-Fehlerbehandlung irrelevant sind,
>> aber dann sollte man schon bessere Argumente haben als "idiotisch".
>
> Das habe ich im Thread bereits getan. Um 17:32.

Tja, Matus Plachy hat halt keine Ahnung. Er hat zwar mindestens ein 
Dutzend Applikationsschriften verfasst und tritt als Redner auf 
IoT-Konferenzen auf, aber du weißt es sicher besser.

Klar, auch er kann irren. Ich halte mich aber zumindest derzeit lieber 
an seine Ratschläge. Auch wenn die Implementierung dadurch etwas 
aufwendiger wird.

von c-hater (Gast)


Lesenswert?

Dieter R. schrieb:

> Ich halte mich aber zumindest derzeit lieber
> an seine Ratschläge. Auch wenn die Implementierung dadurch etwas
> aufwendiger wird.

Denn mach. Wenn du sowieso machst, was du willst, warum fragst du dann 
hier?
Das ergibt doch keinen Sinn.

von Dieter R. (drei)


Lesenswert?

Autor: Dieter R. (drei)
Datum: 07.05.2019 19:07

Ist gut. Trink deinen Kakao, oder falls du schon älter bist, ein gutes 
Glas Rotwein.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Der Ansatz ist aber trotzdem fraglich. Ich kann jedes Protokoll zum 
Absturz bringen, wenn ich schlechte Software dafür implementiere. Und 
das ist z.B. die Fleury Lib sicher nicht.
Ich kann z.B. ISRs während der Routinen aufrufen, ohne das irgendwas 
abschmiert, wenn ich mir nur ein wenig Gedanken über den Ablauf mache 
und keine ISR einsetze, die den MC endlos blockiert.

Wenn du aber Bedenken hast, dann nimm doch was anderes. Kein Mensch 
zwingt dich zur Benutzung von I²C oder TWI.

von Rolf (Gast)


Lesenswert?

Dieter R. schrieb:
> Deshalb muss ein zuverlässiges System so etwas eben abfangen.

Zu einem solchen gehört immer Software, Protokoll und Hardware. Leider 
ist nichts davon perfekt.

Dieter R. schrieb:
> 1. Nach weiteren Tests und tieferem Einstieg in das Datenblatt:
> der oben von mir zitierte Code (von beiden Verfassern) aus dem
> avrfreaks-Forum scheint mir fraglich zu sein. Ich neige inzwischen der
> Meinung zu, dass es unverstandenes Zeug ist und der Prozessor falsch
> bedient wird. Weiteres aber später...

Ich bin gespannt welche Belege Du für diese Behauptung vorbringen wirst. 
Bis dahin würde ich es mal mit einer Grundregel aus der Medizin halten: 
Wer heilt hat recht.

von GermanFranz (Gast)


Lesenswert?

Matthias S. schrieb:
> Der Ansatz ist aber trotzdem fraglich. Ich kann jedes Protokoll
> zum Absturz bringen, wenn ich schlechte Software dafür implementiere.

Im Grunde setzt der TO hier die falschen Prioritäten. Anstatt sein 
System ingesamt sicher gegen Spannungseinbrüche oder entgleisendes 
Interrupt Design zu machen glaubt er, mit so aufwendig wie zweifelhaft 
abgesichertem I2C Treiber seine Controller-Welt ins Paradies perfekter 
Zuverlässigkeit führen zu können. Dabei wären mit einem ordentlichem 
System-Design in einem Abwasch sowohl I2C Fehler ausgeschlossen wie auch 
die sichere Funktion aller übrigen Teile in maximal möglicher Weise 
sichergestellt.

von Dieter R. (drei)


Lesenswert?

GermanFranz schrieb:
> Matthias S. schrieb:
>> Der Ansatz ist aber trotzdem fraglich. Ich kann jedes Protokoll
>> zum Absturz bringen, wenn ich schlechte Software dafür implementiere.
>
> Im Grunde setzt der TO hier die falschen Prioritäten.

Lieber GermanFranz, ich habe deine fachlichen Anregungen gerne 
aufgenommen, aber die Diskussion hier ist mittlerweile ins Absurde 
abgeglitten.

Mein Ziel ist simpel, die Vorgaben von Philips/NXP (und AMD) in deren 
Applikationsschriften in ein Softwaredesign umzusetzen, das für mich 
(und vielleicht auch andere) überschaubarer ist als der Originalcode, 
den Atmel Start generiert. Dieses Ziel ist einzig daran ausgerichtet, 
robusten Code zu generieren und völlig frei von Erwägungen, ob die 
Hardware, auf welcher der Code läuft, irgendwelche funktionalen Mängel 
hat. Bei meinem konkreten Projekt kann ich bisher solche funktionalen 
Mängel mit hoher Wahrscheinlichkeit ausschließen. Sollten sie sich doch 
zeigen, werden sie behoben. Da es sich um ein Projekt handelt, wo der 
Controller jahrelang (ggf. jahrzehntelang) unbeaufsichtigt durchlaufen 
soll, sind fehlertolerante Schnittstellentreiber eine 
Grundvoraussetzung. Ich war einige Jahre mit dem System- und 
Hardware-Design von Linux-basierten Systemen im 24/7-Einsatz befasst, 
mir sind die Anforderungen bewusst. Ich habe (weiß nicht mehr genau, 
wann, ca. Ende der 80er) I2C-Treiber in Assembler für damals brandneue 
digitale Video-Decoder von Philips geschrieben. Ich vermute stark, dass 
meine damalige Software nicht fehlertolerant war, aber die Geräte hatten 
auch einen Ausschalter. Kundenbeschwerden hat es übrigens nicht gegeben, 
unser Produkt galt als qualitative Spitze. Ist lange her, heute sind die 
Ansprüche höher.

Sobald ich ein vorzeigbares Resultat habe, werde ich mich bemühen, 
dieses vorzustellen - aber sicher nicht in diesem Forum. Die mehr (oder 
leider zunehmend weniger) fachliche Seite der Diskussion in diesem Forum 
möchte ich hiermit abschließen. Wenn jemand einen Vorschlag hat, in 
welchem Forum man sich mit Gewinn für alle Beteiligten fachlich weiter 
austauschen kann, bin ich für eine persönliche Mitteilung dankbar. Nach 
den aktuellen Erfahrungen wird es wohl kein deutschsprachiges Forum 
sein.

@Autor: Rolf (Gast): missverstandenes Handling von RIF und WIF, u. a. in 
TWI_Start. Soweit läuft es bei mir jetzt richtig. Der Slave ist noch 
unvollständig, das Recovery-Clocking noch nicht drin, und vor allem 
fehlt der Härtetest mit realen I2C-ICs.

: Bearbeitet durch User
von Karl B. (gustav)


Lesenswert?

Matthias S. schrieb:
> Wenn du aber Bedenken hast, dann nimm doch was anderes. Kein Mensch
> zwingt dich zur Benutzung von I²C oder TWI.

Genau,
schau hier:
Frage, wieviel TWI-Devices?
Bei nur einem Device geht es auch zur Not so:
Und kann in ein bereits vorhandenes Programm reingesetzt werden, das 
jede Menge Interrupts und noch Warteschleifen, dann sogar noch 8N1 9k6 
UART Ausgabe hat.
Idee war, wie man LCDs gegen LCDs einfach austauscht. Eins hat den 
üblichen
Port-Standard. Ein anderes nur die I2C-Portbelegung.

https://www.avrfreaks.net/forum/lcd-sainsmart2004-connecting-attiny2313-usi

Beitrag "Re: Anfänger Will ATtiny2313 mit Display uber I2C verbinden"

ciao
gustav

von Rolf (Gast)


Lesenswert?

@TE
Du scheinst die Tatsache, dass Millionen I2C Apps auch ohne den von Dir 
angestrebten Sicherungsaufwand problemlos laufen (können) völlig zu 
ignorieren.
Sie tun das weil Schaltungsaufbau und Software schlicht und einfach 
passen!
Das bedeutet: I2C Fehler sind nur Symptome einer tieferliegenden 
Fehlkonzeption! Was Du in symptombekämpfender Kosmetik nur erreichst ist 
ein aufgeblähter Treiber mit unnötig viel Code, der noch dazu naturgemäß 
schwerer zu durchschauen und damit fehlerträchtiger ist. Geht es nicht 
viel mehr um den psychogischen Effekt, dass Du Dich persönlich mit dem 
angenommenen "Sicherheitsgewinn" wohler fühlst?

Die 9er Clock-Routine zur "Lösung von I2C Blockaden" ist bei der 
angestrebten Verbindung zwei gleicher Controller übrigens völliger 
Nonsens.

von Peter D. (peda)


Lesenswert?

Rolf schrieb:
> Du scheinst die Tatsache, dass Millionen I2C Apps auch ohne den von Dir
> angestrebten Sicherungsaufwand problemlos laufen (können) völlig zu
> ignorieren.
> Sie tun das weil Schaltungsaufbau und Software schlicht und einfach
> passen!

Leider sind Aufbau und Software nicht die einzigen Fehlerquellen, 
sondern auch die Implementation des I2C im MC kann buggy sein und daran 
kann man aber nichts ändern.

Wie gesagt, die Multimasteranwendung mit bis zu 6 Modulen mit 
Philips-MCs (P80C652 bzw. P89C668) funktionierte ohne Timeout, d.h. der 
Bus hängte sich nicht auf.
Probleme machte nur die verbugte I2C-Hardware der AVR und 8051 von 
Atmel. Die interne Statemaschine des I2C hängt sich auf und die kann der 
MC aber nicht auslesen.
https://www.robotroom.com/Atmel-AVR-TWI-I2C-Multi-Master-Problem.html

Ich fand den Multimaster-Mode sehr elegant, weil man den Bus nicht mit 
unnötigen Polling-Zyklen belasten muß.
Nach den schlechten Erfahrungen mit dem I2C der Atmels habe ich dann auf 
den CAN-Bus gewechselt.

von GermanFranz (Gast)


Lesenswert?

Dieter R. schrieb:
> Mein Ziel ist simpel, die Vorgaben von Philips/NXP (und AMD) in deren
> Applikationsschriften in ein Softwaredesign umzusetzen, das für mich
> (und vielleicht auch andere) überschaubarer ist als der Originalcode,
> den Atmel Start generiert. Dieses Ziel ist einzig daran ausgerichtet,
> robusten Code zu generieren und völlig frei von Erwägungen, ob die
> Hardware, auf welcher der Code läuft, irgendwelche funktionalen Mängel
> hat.

Die technische Umsetzung des I2C Protokolls hat Microchip/Atmel ja schon 
für Dich vorgenommen. Du sollst/kannst/brauchst deren Hardware nur noch 
richtig ansteuern und die gebotenen Fehleranzeigen nutzen. Und mit 
"robustem" Code kannst Du doch nicht ernsthaft funktionale Mängel 
kaschieren wollen! Nein, letztere sind zu beheben. I2C Fehler können 
geradezu Sensor dafür sein- eine Funktion auf die Du offensichtlich 
gerne verzichtest. Man könnte dieses Zukleisternwollen offensichtlicher 
Mängel realistischerweise auch unsaubere Arbeit nennen!

Peter D. schrieb:
> Leider sind Aufbau und Software nicht die einzigen Fehlerquellen,
> sondern auch die Implementation des I2C im MC kann buggy sein und daran
> kann man aber nichts ändern.

Und schon gar nicht mit "robustem" Code!

Nachdem sich

> https://www.robotroom.com/Atmel-AVR-TWI-I2C-Multi-Master-Problem.html
>

auf ältere AVRs bezieht kann man sich nur wünschen, daß sich da was mit 
den neuen Serien funktionell verbessert hat. Insofern man überhaupt 
solche komplexen Busse mit mehreren Mastern betreiben will.

von Dieter R. (drei)


Lesenswert?

GermanFranz schrieb:

>
> Die technische Umsetzung des I2C Protokolls hat Microchip/Atmel ja schon
> für Dich vorgenommen.

Wenn du deren Code gelesen hättest, würdest du das vielleicht 
zurückhaltender formulieren. Beispiel:

void I2C_0_error_handler()
{
  while (1)
    ;
}

Der funktionale Ablauf ist versteckt in ca. 3-fach verschachtelten 
Callbacks. Ich bin gerade dabei, das zu entwirren. Soweit der Slave. Der 
Master ist so unübersichtlich (zumindest für meine C-Kenntnisse), dass 
ich den Atmel-Code komplett weggeschmissen und alles neu gemacht habe, 
nur ein paar Register-Initialisierungen habe ich abgeguckt. Und selbst 
da scheint mir noch einiges fraglich. Aber ich arbeite dran, wird schon 
werden, dauert aber mindestens 10x so lange, wie ich erwartet hatte.

Soweit zum Status. Ich möchte die Grundsatzdiskussion jetzt aber 
abschließen, die bringt keine neuen Erkenntnisse. Alle, die glauben, 
dass Error Recovery ein überflüssiges Thema ist, bitte ich nochmals, die 
zitierte AMD-Applikationsschrift durchzulesen, ggf. auch den ebenfalls 
zitierten Treiber von NXP und das dort geschilderte Szenario zu 
durchdenken und zu verstehen. Es hat überhaupt nichts mit unsauberem 
Systemaufbau zu tun oder mit schlecht geschriebener Software. Ihr wollt 
doch bitte nicht ernsthaft behaupten, dass da mehrere renommierte Leute 
Software-Krücken erfinden, bloß um von den Defiziten ihrer 
Schaltungsentwicklung abzulenken?!? Dass ihr das alle in der Praxis nie 
erlebt habt (ich übrigens auch nicht), hat den einfachen Grund darin, 
dass die Eintrittswahrscheinlichkeit gering ist. Sie ist aber nicht 
Null, und das muss in hochverfügbaren Systemen berücksichtigt werden.

Falls noch ernsthafte technische Erörterungen kommen, bin ich dafür 
jederzeit offen - ebenso für alle Vorschläge, die zu einer Verschlankung 
der Atmel-Treiber führen.

von Rolf (Gast)


Lesenswert?

Grundsätzlich Daumen hoch wenn sich einer hinsetzt und das 
zugegebenermaßen unschöne Atmel-Start Zeugs in eine brauchbare Form 
bringt. Es müsste nur nicht

Dieter R. schrieb:
> mindestens 10x so lange, wie ich erwartet hatte.

oder noch länger dauern wenn Du Dich auf das beschränken würdest was 
wirklich vonnöten ist!

> Es hat überhaupt nichts mit unsauberem
> Systemaufbau zu tun oder mit schlecht geschriebener Software.

Du scheinst den Hintergrund der I2C Fehler immer noch nicht zu 
begreifen. Systeme in denen es zu ungeplanten Neustarts kommt sind per 
se fehlkonstruiert!

> Dass ihr das alle in der Praxis nie
> erlebt habt (ich übrigens auch nicht), hat den einfachen Grund darin,
> dass die Eintrittswahrscheinlichkeit gering ist. Sie ist aber nicht
> Null,

Irrtum. Sie ist sauber umgesetzt Null- oder eben gerade so hoch wie 
elektronische Systeme generell und nicht auf einzelne Teile begrenzt 
ausfallgefährdet sind.

> Falls noch ernsthafte technische Erörterungen kommen, bin ich dafür
> jederzeit offen - ebenso für alle Vorschläge, die zu einer Verschlankung
> der Atmel-Treiber führen.

Die kommen unentwegt, indem sie dazu auffordern, sich nicht in unnütz 
übertriebenem, eierlegenden Fehlerbehandlungs- Wollschwein Design zu 
verlieren.
Kombiniert mit

Dieter R. schrieb:
> meinen (beschränkten) Kenntnisstand in C-Programmierung

lässt das nichts Gutes erahnen und dürfte zu keinem brauchbar schlanken, 
übersichtlichen Treiber führen.
Dein Horizont ist hier einfach zu sehr aufs I2C fachspezifische fixiert 
um zu realisieren, was ein zuverlässiges Gesamt- System wirklich 
ausmacht.
Nur ein schlanker Treiber, der fehlerfrei das tut was wirklich zu tun 
ist kann dafür ein Gewinn sein.
Viel Erfolg!

von Dieter R. (drei)


Lesenswert?

Rolf schrieb:

> Systeme in denen es zu ungeplanten Neustarts kommt sind per
> se fehlkonstruiert!

Ich wollte ja eigentlich nichts mehr dazu sagen. Es ist offenbar (oder 
doch nur anscheinend? - man soll ja nie die Hoffnung aufgeben) 
chancenlos. Wie willst du denn in einem netzversorgten, aber 
ungepufferten System Brownouts vermeiden, wie willst du ohne ein 
zentrales Reset erreichen, dass die gesamte Peripherie darauf identisch 
reagiert? Das muss aber auch gar nicht sein, wenn es dafür ein 
funktionierendes Recovery gibt. Das muss man nur richtig handhaben! 
Philips/NXP weiß das, AMD auch, bloß Rolf (Gast) hat da anhaltende 
Verständnisprobleme.

Hast du wirklich schon mal professionell mit 24/7-Systemen zu tun 
gehabt? Mit Systemen, die in störverseuchter Umgebung arbeiten (das muss 
gar nichts besonderes sein, da reicht ein PC-gesteuertes System im 
Großhotel, im Betriebsraum neben der Aufzugsmaschine)? Hast du in 
solchen Systemen schon mal (um von I2C wegzukommen und ein anderes 
Beispiel zu bringen) USB-Peripherie betrieben? Dann müsstest du dich 
eigentlich eine ganze Menge mit Error Recovery herumgeschlagen haben. 
Mit deinem Ansatz, das ist dann eben eine Fehlkonstruktion, kommst du da 
jedenfalls nicht weiter.

Die originale Atmel-Treibersoftware erweist sich übrigens als um so 
kränker, je tiefer man einsteigt. Da gibt es doppelte Funktionen und 
sogar eine Funktion, die den Bus kurzschließt. Glücklicherweise wird sie 
im Beispielprogramm nicht aufgerufen. Alles hübsch geschrieben und 
sorgfältig kommentiert, aber es sieht sehr so aus, als hätte da jemand 
die Übersicht verloren.

von c-hater (Gast)


Lesenswert?

Dieter R. schrieb:

> Wie willst du denn in einem netzversorgten, aber
> ungepufferten System Brownouts vermeiden, wie willst du ohne ein
> zentrales Reset erreichen, dass die gesamte Peripherie darauf identisch
> reagiert?

Ja, man muß nur die richtigen Fragen stellen, dann kommt man auch zu 
richtigen Lösungen.

Sprich: Es muß halt ein zentrales Reset-System realisiert werden...

Und schon löst sich das Problem, für das der AMD/NXP-Workaround die 
(notwendigerweise sowieso unvollständige) Lösung sein soll, vollkommen 
in Luft auf...

Kannst du das kapieren?

von Dieter R. (drei)


Lesenswert?

c-hater schrieb:
>
> Kannst du das kapieren?

Nein, du Wichtigtuer. Könnte es sein, dass du zwar viel schwätzt, dich 
aber mit I2C-Peripherie nicht besonders gut auskennst? So etwas gibt es 
nämlich bei vielen oder vermutlich sogar bei den meisten I2C-Devices 
nicht (nicht einmal bei welchen, die für Medical Equipment qualifiziert 
sind) noch überhaupt bei USB (das Beispiel hast du wohl auch nicht 
verstanden). Aber du kannst dich ja mal als Halbleiterhersteller 
versuchen und selbst die entsprechenden ICs anbieten - falls du gerade 
ein paar Hundert Millionen übrig hast, darunter wirst du wohl keine 
Fertigung aufbauen können. Du solltest aber vorsichtig mit deinem 
Investment sein, der Halbleitermarkt schwächelt gerade. Und bei USB wird 
das echt schwierig, der Mechanismus ist nämlich im Protokoll nicht 
vorgesehen, du musst also erst einmal einen neuen Standard etablieren. 
Bei I2C ist das einfacher, da ist es im Standard vorgesehen. Das hat 
sich nur noch nicht überall herumgesprochen, besonder nicht bei den 
Wichtigtuern in diesem Forum.

von c-hater (Gast)


Lesenswert?

Dieter R. schrieb:

> Nein, du Wichtigtuer. Könnte es sein, dass du zwar viel schwätzt, dich
> aber mit I2C-Peripherie nicht besonders gut auskennst?

> So etwas gibt es
> nämlich bei vielen oder vermutlich sogar bei den meisten I2C-Devices
> nicht

Doch, gibt es (zumindest implizit). Notfalls über eine geeignete 
Gestaltung der Versorgung. Wenn es keinen anderen Mechanismus gibt, 
mindestens PowerOn-Reset kann nämlich wirklich absolut jedes Device, 
ohne jede Ausnahme.

Wenn du nichtmal diesen simplen Sachverhalt erkennen kannst, dann bist 
du definitiv nicht ermächtigt, mich einen Wichtigtuer zu nennen.

Du kannst es aber ruhig weiter tun, wenn dir das Kraft gibt... ;o)

Besser wäre allerdings, du würdest darüber nachdenken, was dir die 
Erwachsenen empfehlen.

von Rolf (Gast)


Lesenswert?

Dieter R. schrieb:
> Wie willst du denn in einem netzversorgten, aber
> ungepufferten System Brownouts vermeiden

> Hast du wirklich schon mal professionell mit 24/7-Systemen zu tun
> gehabt?

Hier ist doch nicht etwa vom selben System die Rede?

> Hast du in
> solchen Systemen schon mal (um von I2C wegzukommen und ein anderes
> Beispiel zu bringen) USB-Peripherie betrieben?

Bleiben wir doch mal schön bei I2C, USB ist was ganz anderes.

> Die originale Atmel-Treibersoftware erweist sich übrigens als um so
> kränker, je tiefer man einsteigt

Und Du beurteilst das jetzt mit, nach eigener Aussage beschränkten 
C-Kenntnissen?

> aber es sieht sehr so aus, als hätte da jemand
> die Übersicht verloren

... denk ich mir manches Mal wenn ich Deine Kommentare so lese. Aber 
wollen wir es mal nicht zu hoch hängen. Es läuft ja doch immer auf die 
gleiche Weise:
- bestehender Code wird schlecht gemacht
- natürlich kann man alles viel besser und verspricht das Blaue vom 
Himmel
- die Umsetzung dauert plötzlich länger und länger
- naja, das Ende des Liedes wie üblich- nix ward mehr gehört vom Genius.

von Dieter R. (drei)


Lesenswert?

Lieber  Rolf (Gast), melde dich als Forumsteilnehmer an, mach mir (per 
PM) einen Vorschlag, in welchem ernsthaften Forum wir uns über den 
Fortgang der Sache austauschen können, und dann sehen wir gerne weiter.

Zur Qualität der Atmel-Treibersoftware (hier: für den Slave) hatte ich 
mich ja schon summarisch geäußert. Hier gerne die Details:

void I2C_0_close(void)

schließt den Bus kurz. Warum, könnte ich dir jetzt erklären, aber es 
wird dich vermutlich gar nicht interessieren.

void I2C_0_open(void) und void I2C_0_enable(void)

sind identisch, einer von beiden ist übeflüssig. Eigentlich sind aber 
beide überflüssig, weil der Bus schon bei der Initialisierung enabled 
wird und das Disable (close) wie erwähnt sowieso nicht funktioniert.

Die dreifache Verschachtelungstiefe bei Funktionen, die nur aus einem 
einzigen Befehl bestehen (!), innerhalb einer Interruptroutine, halte 
ich auch nicht gerade für effektive Programmierung. Insbesondere, wenn 
dieser einzige Befehl im ganzen Programm sowieso nur ein einziges Mal 
aufgerufen wird.

Resultat: 3 Druckseiten Original-Atmel-Code, zusammengestrichen auf die 
dahinter stehende Substanz, ergeben nicht mehr als eine knappe Seite. Es 
ist wirklich nicht kompliziert und kein Aufreger, nur völlig 
unübersichtlich und teilweise (siehe Fehlerbehandlung) unvollständig.

Der Master-Code sind bei mir derzeit 149 Zeilen, mit Leerzeilen und 
ausführlichen Kommentaren. Bei Atmel war es ein (jedenfalls für mich) 
undurchdringliches Dickicht, was ein Vielfaches an Programmcode wie bei 
meiner jetzigen Version produziert hat. Funktionalität ist die Gleiche, 
d. h. bei beiden fehlt noch das Recovery. Kommt noch, bei mir.

Und, ja, es ist von einem 24/7-System die Rede. Nicht mein erstes.

von Dieter R. (drei)


Lesenswert?

c-hater schrieb:

>
> Doch, gibt es (zumindest implizit). Notfalls über eine geeignete
> Gestaltung der Versorgung. Wenn es keinen anderen Mechanismus gibt,
> mindestens PowerOn-Reset kann nämlich wirklich absolut jedes Device,
> ohne jede Ausnahme.
>

Power Cycling würde theoretisch immer das Problem lösen, ist aber nicht 
in jedem System  möglich und oftmals weder erforderlich noch 
wünschenswert. Es gibt nämlich den anderen Mechanismus. Lies 
Abschnitt 3.1.16 (Bus clear) der offiziellen I2C-Spezifikation. Du wirst 
staunen. Letzte mir bekannte Ausgabe ist UM10204, I2C-bus specification 
and user manual, Rev. 6 — 4 April 2014. In der Version von 1995 (The 
I2C-bus and how to use it, including specifications, 1995 update) steht 
es interessanterweise noch nicht. Nach dieser doch sehr länglichen und 
kontrovers geführten Diskussion gewinne ich den Eindruck, dass das 
Wissen über dieses Thema in weiten Kreisen auf dem Stand von 1995 stehen 
geblieben ist.

von Rolf (Gast)


Lesenswert?

Also ich hab den Eindruck, bislang hören wir hier nur Sprüche. Gehts nur 
mir so? Bemerkenswert wieviel Zeit man doch verbringen kann um sich über 
einen solchen Firlefanz zu echauffieren der für nahezu alle praktischen 
Fälle irrelevant und von dem alles andere als sicher ist, welche der 
zahlreichen I2C Hardware auf dem Markt das überhaupt unterstützt.
Der Treiber könnte längst fertig sein, soviel Substanz ist nun wirklich 
nicht am neuen TWI Interface!

von Karl B. (gustav)


Lesenswert?

Dieter R. schrieb:
> Die dreifache Verschachtelungstiefe bei Funktionen, die nur aus einem
> einzigen Befehl bestehen (!), innerhalb einer Interruptroutine, halte
> ich auch nicht gerade für effektive Programmierung.

Hi,
kann leider nicht mitreden, da ich nur gut auskommentierten ASM-Code 
bevorzuge. Da ist man IMHO auch wesentlich näher am Target und überlässt 
nicht irgendeinem Compiler die "Drecksarbeit". Die können ja auch einmal 
"falsch" liegen.

ciao
gustav

von Dieter R. (drei)


Lesenswert?

Rolf schrieb:

> Der Treiber könnte längst fertig sein, soviel Substanz ist nun wirklich
> nicht am neuen TWI Interface!

Womit wir wieder am Anfang wären,

Frage: kennt jemand eine bewährte Quelle für zuverlässige I2C-Routinen
(Master und Slave) für diese Prozessoren? Gibt es jenseits der
Microchip-Treiber so etwa wie eine Standardbibliothek dafür? Für Tips
und Links wäre ich sehr dankbar. Ich will keine großartigen Sachen
machen, nur kurze Messages, wenige Byte lang, zwischen beiden
Prozessoren austauschen.

Hast du denn eine Antwort auf diese Frage? Dann poste doch bitte einen 
Link auf entsprechenden C-Code.

von Rolf (Gast)


Lesenswert?

Dieter R. schrieb:
> Frage: kennt jemand eine bewährte Quelle für zuverlässige I2C-Routinen
> (Master und Slave) für diese Prozessoren?

Nein die gibt es nicht.
Jedenfalls nicht für Dein Verständnis von Zuverlässigkeit. Ansonsten 
findest Du bei den AVRfreaks funktionierenden und kompakten Code. 
Vermutlich hast Du mit was Eigenem noch nicht mal angefangen.

> Gibt es jenseits der
> Microchip-Treiber so etwa wie eine Standardbibliothek dafür?

Nein. Wie oft fragst Du noch?

> Ich will keine großartigen Sachen
> machen, nur kurze Messages, wenige Byte lang, zwischen beiden
> Prozessoren austauschen.

Dafür dieses Gezeter?

von Dieter R. (drei)


Lesenswert?

Rolf schrieb:
> Dieter R. schrieb:
>> Frage: kennt jemand eine bewährte Quelle für zuverlässige I2C-Routinen
>> (Master und Slave) für diese Prozessoren?
>

> Vermutlich hast Du mit was Eigenem noch nicht mal angefangen.

Der Satz spricht jetzt nicht unbedingt für deine Lesekompetenz. Ich 
hatte ja schon einige Details berichtet. Und über die Unzulänglichkeiten 
im Atmel-Code. Deren Slave funktioniert bei mir übrigens nicht, ich 
suche noch nach dem Fehler.

> Ansonsten
> findest Du bei den AVRfreaks funktionierenden und kompakten Code.

Du weißt ja, ich bin dumm. Deshalb brauche ich etwas Hilfestellung von 
dir. Wo finde ich den Code für Series 1? Für Master und Slave?

von Rolf (Gast)


Lesenswert?

Dieter R. schrieb:
> suche noch nach dem Fehler.

Nein. Du bist die ganze Zeit nur mit diesem Forum beschäftigt.

von Joachim B. (jar)


Lesenswert?

Dieter R. schrieb:
> Zur Qualität der Atmel-Treibersoftware (hier: für den Slave) hatte ich
> mich ja schon summarisch geäußert.

es gibt mehrere Quellen im Netz das ein AVR Master kein Clockstretching 
vom Slave erkennt, sollen das alle Ahnungslose sein?

Abhilfe ist wohl für viele am Clock Port SCL einen weiteren Port 
anzuklemmen der die Zeit für Clock low stoppt und einen I2C Reset 
durchführt.
Ich bin aber nicht sicher ob jeder Slave darauf reagiert, deswegen wohl 
zusätzlich power on reset am Slave durchführen was noch eine Leitung 
bedeutet.

Wer I2C selber soft implementiert kann das natürlich eleganter machen?

jedenfalls alles ohne power on reset für den slave denn das hat mit dem 
I2C Protokoll ja nichts zu tun.

: Bearbeitet durch User
von Dieter R. (drei)


Angehängte Dateien:

Lesenswert?

Joachim B. schrieb:
> Dieter R. schrieb:
>> Zur Qualität der Atmel-Treibersoftware (hier: für den Slave) hatte ich
>> mich ja schon summarisch geäußert.
>
> es gibt mehrere Quellen im Netz das ein AVR Master kein Clockstretching
> vom Slave erkennt, sollen das alle Ahnungslose sein?
>

Nach aktuellem Status (mit meinem Master und dem originalen Slave aus 
Atmel Start) kann ich bestätigen, dass der Slave bei Master Read Clock 
Stretching generiert und der Master darauf korrekt reagiert. Ich kriege 
aber noch keine validen Daten vom Slave übertragen und das ACK vom 
Master funktioniert nicht. Ersteres erscheint mir im Moment 
unverständlich, letzteres dürfte ein Programmierfehler von mir sein.

Siehe Screenshot dazu, ich habe in den Leitungen zum Slave 
Längswiderstände eingefügt, so dass man an den Low-Pegeln sieht, was vom 
Master und was vom Slave ist. Der "Kinken" in der Clock ist das Clock 
Stretching.

Meine vage Vermutung ist, dass das Verhalten vom Timing der 
Register-Zugriffe abhängt. Das würde erstens die unterschiedlichen 
Ergebnisse verschiedener Autoren erklären, ist aber zweitens von mir 
noch nicht sehr fundiert. Kann auch ganz was anderes sein.

Außer dem Hinweis auf die AMD-Publikation hat diese elendige 
Forumsdiskussion leider keinerlei Substanz erbracht. Aber ich gebe die 
Hoffnung nicht auf, vielleicht liest irgendwann mal jemand mit, der 
tatsächlich was zum Thema beisteuern kann.

von Joachim B. (jar)


Lesenswert?

Dieter R. schrieb:
> Nach aktuellem Status (mit meinem Master und dem originalen Slave aus
> Atmel Start) kann ich bestätigen, dass der Slave bei Master Read Clock
> Stretching generiert und der Master darauf korrekt reagiert. Ich kriege
> aber noch keine validen Daten vom Slave übertragen und das ACK vom
> Master funktioniert nicht. Ersteres erscheint mir im Moment
> unverständlich

wieso das unverständlich denn?

ACK kommt doch nur wenn weitere Byte folgen, erwartet werden, es kann 
durchaus sein das du NACK setzen musst.

aber dazu verrätst du zu wenig.

von Dieter R. (drei)


Lesenswert?

Joachim B. schrieb:
> Dieter R. schrieb:
>> Nach aktuellem Status (mit meinem Master und dem originalen Slave aus
>> Atmel Start) kann ich bestätigen, dass der Slave bei Master Read Clock
>> Stretching generiert und der Master darauf korrekt reagiert. Ich kriege
>> aber noch keine validen Daten vom Slave übertragen und das ACK vom
>> Master funktioniert nicht. Ersteres erscheint mir im Moment
>> unverständlich
>
> wieso das unverständlich denn?
>
> ACK kommt doch nur wenn weitere Byte folgen, erwartet werden, es kann
> durchaus sein das du NACK setzen musst.
>
> aber dazu verrätst du zu wenig.

Ich hab aber in meinem Test-Code ACK gesetzt und will eigentlich ein 
zweites Byte lesen. Die Baustelle kommt aber später dran, erst einmal 
muss ich rauskriegen, warum der Slave immer 12 sendet, egal was er soll.

von Joachim B. (jar)


Lesenswert?

ich habe mal mit der fleury I2C Lib am m32 angefangen ohne Probleme!
http://homepage.hispeed.ch/peterfleury/avr-software.html#libs
Dort soll auch eine Soft I2C drin sein

aber mit fleury und tiny817 bist du ja nicht der einzige mit Probleme
https://www.google.com/search?client=firefox-b&q=attiny817+i2c&spell=1&sa=X&ved=0ahUKEwjHme-x5JDiAhVLbVAKHXRRDXUQBQgqKAA&biw=1720&bih=921
weiss natürlich nicht wer Schuld hat, microchip/atmel, fleury oder der 
Anwender.

von Dieter R. (drei)


Lesenswert?

Dieter R. schrieb:

> Meine vage Vermutung ist, dass das Verhalten vom Timing der
> Register-Zugriffe abhängt. Das würde erstens die unterschiedlichen
> Ergebnisse verschiedener Autoren erklären, ist aber zweitens von mir
> noch nicht sehr fundiert. Kann auch ganz was anderes sein.

Kurze Zeit später, gedämpfter Jubel: ich habe mal vor dem Schreiben in 
TWI0.SDATA ein Delay von 20 us eingefügt. Ergebnis: gewaltiges 
Clock-Stretching vor dem ersten Daten-Bit, das vom Master richtig 
erkannt wird. Und der Slave überträgt die korrekten Daten! Das erfordert 
jetzt genauere Untersuchungen, ich kann die Software schließlich nicht 
von einem zufällig gewählten Delay abhängig machen.

Das Ganze mit dem unveränderten Atmel-Slave. Nun würde ich gerne wissen, 
unter welchen Umständen der beim Atmel-Programmierer überhaupt gelaufen 
ist. Mit dem von Atmel-Start generierten Code offensichtlich nicht.

von Dieter R. (drei)


Lesenswert?

Falls noch einer mitliest:

while (!(TWI0.SSTATUS & TWI_CLKHOLD_bm))
;

Dann kann man ins Daten-Register schreiben. Für Assembler-Programmierer 
sinngemäß. Für eine robuste Version (ich weiß, einige hören hier sowas 
nicht gerne) sollte noch ein Timeout rein.

Atmel behauptet zwar, dass genau das nicht notwendig ist, sondern 
automatisch sichergestellt ist, aber dem ist wohl nicht so.

von Dieter R. (drei)


Lesenswert?

So, Master (polled) + Slave (Interrupt) läuft, in allen Varianten von 
Start/Repeated Start/Read/Write/Stop. Master ist 178 Byte Code + 75 Byte 
Data (!) kürzer als Atmels Original, Slave habe ich jetzt nicht 
nachgeguckt.

Wenn man funktionierenden Code hat, versteht man auch das Datenblatt, 
jedenfalls geht es mir so. Andersrum ist es schwierig. Es bleiben aber 
Fragen, dazu bin ich in Kontakt mit Atmel.

von Joachim B. (jar)


Lesenswert?

Dieter R. schrieb:
> So, Master (polled) + Slave (Interrupt) läuft, in allen Varianten von
> Start/Repeated Start/Read/Write/Stop.

und warum zeigst du den Code nicht?

von Dieter R. (drei)


Lesenswert?

Siehe dort:

Autor: Dieter R. (drei)
Datum: 08.05.2019 07:59

Unabhängig davon warte ich erst einmal ab, was Atmel zu den von mir 
gefundenen/vermuteten Problemen/Bugs sagt. Ich möchte keinen halbgaren 
Code in die Welt setzen, dazu gibt es schon zu vieles zu genau diesem 
Thema.

von spess53 (Gast)


Lesenswert?

Hi

>Autor: Dieter R. (drei)
>Datum: 08.05.2019 07:59
>...

Warum setzt du nicht einfach einen auf den Beitrag:

Beitrag "Re: I2C mit ATtiny 0/1-series (z. B. ATtin817)"

?

MfG Spess

von Joachim B. (jar)


Lesenswert?

Joachim B. schrieb:
> und warum zeigst du den Code nicht?

Dieter R. schrieb:
> Siehe dort:
>
> Autor: Dieter R. (drei)
> Datum: 08.05.2019 07:59

oh man, nicht mal ein Link
Beitrag "Re: I2C mit ATtiny 0/1-series (z. B. ATtin817)"

und dabei steht dort kein Code.....

ich fühle mich etwas verschaukelt!

von Rolf (Gast)


Lesenswert?

Joachim B. schrieb:
> und dabei steht dort kein Code.....

Findet Euch mit ab, es wird hier nie Code geben.

von GermanFranz (Gast)


Lesenswert?

Dieter R. schrieb:
> Master ist 178 Byte Code + 75
> Byte Data (!) kürzer als Atmels Original

Mastercode 178 klingt für C-Verhältnisse gut, aber wozu verbrätst Du 75 
Datenbyte?  Etwas Stack für den Interrupt, viel mehr brauchts da nicht.

> Wenn man funktionierenden Code hat, versteht man auch das Datenblatt,
> jedenfalls geht es mir so. Andersrum ist es schwierig.

Kann ich bestätigen. Das Datenblatt ist da nicht sehr übersichtlich, 
verständlich und vollständig in seiner Beschreibung.

von Dieter R. (drei)


Lesenswert?

Für die zwei oder drei am Thema interresierten:

https://www.avrfreaks.net/forum/i2c-masterslave-code-attiny-series-1

Bitte das AVR-Forum nicht auch noch mit Gebrüll vollspammen, sondern 
dort nur sachdienliche Fachbeiträge.

Danke

von Dieter R. (drei)


Lesenswert?

GermanFranz schrieb:
> Dieter R. schrieb:
>> Master ist 178 Byte Code + 75
>> Byte Data (!) kürzer als Atmels Original
>
> Mastercode 178 klingt für C-Verhältnisse gut, aber wozu verbrätst Du 75
> Datenbyte?  Etwas Stack für den Interrupt, viel mehr brauchts da nicht.
>
Nicht 75 Datenbyte, sondern 75 Datenbyte KÜRZER als der 
Microchip-Originalcode. Die verbraten die ungeheuren Mengen, vermutlich 
für (überflüssige) Callback-Pointer und ähnliches Zeug.

von GermanFranz (Gast)


Lesenswert?

Dieter R. schrieb:
> Nicht 75 Datenbyte, sondern 75 Datenbyte KÜRZER als der
> Microchip-Originalcode.

Ach bloss kürzer... Aufschlussreicher wär die Angabe gewesen was nun 
wirklich Sache ist!? Und wie hat denn Microchip auf welche

> gefundenen/vermuteten Problemen/Bugs

reagiert?

von Rolf (Gast)


Lesenswert?

"4. This software is strictly NOT intended for safety-critical ... 
applications"

Also irgendwie wurde das beschworene Zuverlässigkeits- Ziel hier nicht 
erreicht, oder wie siehst Du das?

von Dieter R. (drei)


Lesenswert?

Wichtigtuer. Punkt 4 ist ein juristischer Disclaimer. Findet sich z. B. 
auch bei zahlreichen IC-Herstellern, vermutlich auch bei Microchip. Das 
bedeutet mitnichten, dass die Devices oder der Code nicht funktionieren, 
sondern dass für solche Applikationen zusätzliche Zertifizierung 
erforderlich ist. Das steht da auch, du hättest den Satz mal vollständig 
zitieren sollen!

Erreicht wurde:

I have made extensive tests arbitrarily shorting the signal lines 
against ground. During these tests both master and slave recovered under 
all circumstances.

Reicht das für deine Ansprüche? Der Original-Code von Microchip 
blockiert unter diesen Bedingungen sofort. Vielleicht findet aber noch 
jemand ein Testszenario, wo es trotzdem zum Verbindungsabbruch kommt. U. 
a. solche Tests könnten helfen, eventuelle Schwachstellen im Code zu 
identifizieren und ggf. zu beheben, aber nicht dieses elende Bashing in 
diesem Forum.

Auf weitere Beiträge in diesem Forum und zu diesem Thema werde ich aus 
sicher nachvollziehbaren Gründen nicht mehr reagieren. Es gibt ja andere 
Möglichkeiten zur Diskussion, wenn denn ernsthaftes fachliches Interesse 
besteht.

: Bearbeitet durch User
von Karl B. (gustav)


Lesenswert?

Rolf schrieb:
> Findet Euch mit ab, es wird hier nie Code geben.

Hi,
bist Du sicher?
/*
 * I2C.c
 *
 * I2C Master
 *
 * Created: 10/05/2019
 * Author: D*** R***
 *
 * Tested with Alternate Pinout
 *
 * This software is covered by a modified MIT License, see paragraphs 4 
and 5
 *
 * Copyright (c) 2019 D*** R***
 *
OK.
Du hast das Copyright.

Stop listening that's my music?


ciao
gustav

von Dieter R. (drei)


Lesenswert?

Ein allerallerletztes Mal:

https://de.wikipedia.org/wiki/MIT-Lizenz

Da steht die Übersetzung. Dies ist eine permissive Lizenz (tatsächlich 
die kürzeste mir bekannte außer dem Satz "free as in speech, not as in 
beer"), die aber die Attribution zum Urheber beinhaltet, siehe hier (hab 
leider keine deutsche Quelle dafür):

https://softwareengineering.stackexchange.com/questions/218331/what-are-the-requirements-for-attribution-in-the-mit-license

: Bearbeitet durch User
von Karl B. (gustav)


Lesenswert?


von Rolf (Gast)


Lesenswert?

Dieter R. schrieb:
> I have made extensive tests arbitrarily shorting the signal lines
> against ground. During these tests both master and slave recovered under
> all circumstances.
>
> Reicht das für deine Ansprüche?

Nein.
Masse-Kurzschlüsse dürften selten die Ursache sein wenn der Bus bzw. ein 
Teilnehmer daran blockiert. Viel eher schon Störimpulse, 
Unter/Überspannungen oder Amok laufende Programme. Das ist aber alles 
unmöglich im I2C Treiber abzufangen und auch nicht auszutesten. Ein 
geordneter PowerOFF/ON Reset ist die einzig sichere Methode zur 
Wiederherstellung der Funktionsfähigkeit, wenn denn kein Bauelement im 
System defekt ist. Wenn dem aber so ist macht es wenig Sinn, den I2C 
Treiber über die Auswertung der ohnehin vorgesehenen Statusinformationen 
hinaus unnötig aufzublasen. Angesichts der absoluten Seltenheit solcher 
I2C Blockaden und dem Vorhandensein viel effektiverer Gegenmaßnahmen mit 
gutem Schaltungsdesign ist ein schlanker, schneller Treiber allemal mehr 
wert.

> Auf weitere Beiträge in diesem Forum und zu diesem Thema werde ich aus
> sicher nachvollziehbaren Gründen nicht mehr reagieren.

Das ist auch überflüssig wenn kritische Einwände und Nachfragen nur als 
Gebrüll und "elendes Bashing" abqualifiziert werden!

von Dieter R. (drei)


Lesenswert?

Mann, Junge, ich weiß nicht, warum ich mich überhaupt noch damit befasse 
und immer noch zu Stellungnahmen herausgefordert fühle - vielleicht, um 
weniger erfahrenen Entwicklern eine Hilfestellung zu geben, damit sie 
nicht auf das dumme Zeug reinfallen, was hier unablässig verbreitet 
wird??

Vom Effekt her ist das doch das Gleiche!!! Die Bus-Übertragung wird 
gestört, zu beliebigen Zeitpunkten und in unvorhersehbarer Weise. Ob 
durch Kurzschluss oder Störimpulse wissen die Teilnehmer nicht, die 
sehen bloß illegale Signale. Für den Test ist es letztlich wichtig, sich 
ein handhabbares Testszenario zu verschaffen, das Störungen aus Sicht 
der Busteilnehmer erzeugt, und nicht, die ESD-Festigkeit der Eingänge zu 
prüfen.

Da ist das Erzeugen von Kurzschlüssen nun mal der einfachste und 
ziemlich wirkungsvolle Testaufbau. Genau so haben wir es (weiter oben 
von mir geschildert) vor einiger Zeit mal mit dem Test eines 
industriellen USB-basierten Systems gemacht, dort haben wir ein Relais 
mit Zeitgeber angeschlossen und zyklisch den Bus kurzgeschlossen. Die 
realen Ausfälle hatten selbstverständliche andere Ursachen (vermutlich 
irgendwelche undefinierten Einstreuungen im Kundensystem, der Kunde war 
ein paar Tausend km weg und das konnten wir nicht prüfen), aber das 
Testszenario hat dazu geführt, dass wir die Treiber bzw. das ganze 
Linux-System ausreichend "härten" konnten. Die Treiber waren auch nicht 
von uns, aber wir hatten die Rechte an den Sources.

Im übrigen verweise ich mal auf andere Beiträge in diesem Fachforum, z. 
B. diesen hier:

Beitrag "I2C hängt sich auf"

Ist von 2015, schon "damals" war das Problem bekannt, Zitate:

Autor: Klaus (Gast)
8 mal mit SCL wackeln und dann prüfen, ob SCL und SDA high sind, ist die 
gängige Prozedur einen verklemmten I2C Bus zu reseten.

Autor: Olaf (Gast)
Da gehört immer auch ein Zaehler rein und bei
Ablauf wird der Bus mit Dummytakten resettet und die I2C-Maschine im
Controller neu initialisiert.

Dort wird auch, wie in der zitierten AD-Applikation, geschildert, wie 
und warum das Problem in der Praxis auftreten kann und warum es 
überhaupt nichts mit gutem oder schlechtem Design zu tun hat.

Wieso wird von den "Experten" in diesem Thread eigentlich unablässig 
bezweifelt, was vor 4 Jahren schon allgemeines Wissen war?

Oder hier, ist von 2012, da ist auch der Verweis auf die 
NXP-Spezifikation:

https://www.microchip.com/forums/m175368.aspx

: Bearbeitet durch User
von Rolf (Gast)


Lesenswert?

Dieter R. schrieb:
> Vom Effekt her ist das doch das Gleiche!!! Die Bus-Übertragung wird
> gestört, zu beliebigen Zeitpunkten und in unvorhersehbarer Weise.

Da unterliegst Du einem schweren Irrtum.
Die blanke Unterbrechung des Protokolls ist nur einer von vielen 
Blockier-Gründen und ausgerechnet jener, der sich mit entsprechenden 
Mitteln einer stabilen Spannungsversorgung und stabiler Software ohnehin 
vermeiden lässt. Kommt es zum ungeplanten System-Reset ist das ein 
unbedingt zu vermeidender (und vermeidbarer!) Super-Gau. Aber Du glaubst 
jetzt ausgerechnet mit Deinem fetten I2C Treiber die Lösung der Probleme 
an anderer Stelle zu sein? Lächerlich!
Das Pferd von hinten aufgezäumt! Hier ist schlicht sauberes, 
absturzfreies Systemdesign angesagt, begreif das doch endlich. Hör auf 
von der Spezifikation als dem Maßstab aller Dinge zu träumen. Die 
konkrete Hardware spielt eine nicht minder ausschlaggebende Rolle.

Diverse eingestreute Störimpulse bzw. die ganze ESD Problematik sind 
noch ein ganz anderes, die Hardware verriegelndes Kaliber und da ist und 
bleibt ein Power-Reset angesagt.

von Dieter R. (drei)


Lesenswert?

GermanFranz schrieb:
> Aufschlussreicher wär die Angabe gewesen was nun
> wirklich Sache ist!?

Bitte sehr, jeweils code size, aus link map, dezimale Angaben, 
Atmel/eigener Code:

i2c_master 1344
i2c_master + i2c_master_example 1496

I2C (ohne I2C_read_bytes/write_bytes) 642
I2C (mit I2C_read_bytes/write_bytes) 916

i2c_master + i2c_master_example entspricht etwa I2C mit I2C_read_bytes, 
ohne write

Jaja, "mit Deinem fetten I2C Treiber ..."

> Und wie hat denn Microchip auf welche
> gefundenen/vermuteten Problemen/Bugs reagiert?

Support Case ID assigned. So schnell sind die nicht.

Slave hab ich jetzt nicht nachgesehen. Kann ja mal jemand anders machen, 
der selbst ernsthaft an dem Thema arbeitet.

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.