-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: I2C Bus "störungssicher" machen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    26
    Beiträge
    460

    I2C Bus "störungssicher" machen

    Anzeige

    Hallo!

    Ich habe Probleme mit dem I2C Bus meiner Terrariusteuerung. Ich messe die Temperatur und die Luftfeuchtigkeit im Terrarium mit digitalen I2C Sensoren. Die Kabellängen sind etwas lang für den I2C Bus, aber ich habe sehr gute geschirmte CAN Buskabeln verwendet, und bei einer sehr langsamen Busfrequenz von 2kHz funktioniert das ganze ca. 5 Minuten lang, manchmal auch 10 oder 15, aber dann bleibt der Controller einfach hängen.

    Das kann schnell zur Katastrophe werden, z.B. wenn die Beregnungsanlage eingeschalten ist. Wenn dann der Controller hängen bleibt läuft sie einfach weiter bis der Wassertank leer ist, und mein Zimmer überflutet ist.

    Ich verwende die I2C Library von Peter Fleury: http://homepage.hispeed.ch/peterfleu...ic2master.html

    Die Sensorwerte frage ich mit dem Befehl "i2c_readAck" ab:

    Code:
    /*************************************************************************
     Read one byte from the I2C device, request more data from device 
     
     Return:  byte read from I2C device
    *************************************************************************/
    unsigned char i2c_readAck(void)
    {
        TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);
        while(!(TWCR & (1<<TWINT)));    
    
        return TWDR;
    
    }
    Ich glaube das Problem ist, dass er durch Busstörungen fehlerhafte Signale bekommt, und dann irgendwie in der Endlosschleif feststeckt.

    Kann man da etwas einbauen dass das Unterprogramm automatisch die Schleife unterbricht und irgendeinen Fehlercode zurückgibt? Wenn alle 5 Minuten mal ein Messwert "verworfen" wird, weil er fehlerhaft ist, ist das vollkommen egal (es wäre sogar egal wenn 9 von 10 verworfen werden würden ), nur darf der Controller nie hängen bleiben.


    lg
    Christoph
    Geändert von Christoph2 (02.04.2012 um 01:02 Uhr)

  2. #2
    Erfahrener Benutzer Begeisterter Techniker Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    41
    Beiträge
    398
    Ich bin jetzt nicht der I2C Experte, aber ich würde den I2C Bus mit niedrigerer Geschwindigkeit laufen lassen. Bsp. 10kBit/s . Habe dazu das [1] [2] hier gefunden.

    Gruß
    Georg

    [1] http://www.mikrocontroller.net/articles/I2C_als_Hausbus
    [2] http://hauscomputer.gmxhome.de/

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    09.02.2005
    Ort
    München
    Alter
    32
    Beiträge
    389
    Hallo Christoph,
    bau in die while() Schleife doch einfach ne zweite Abbruchbedingung ein. d.h. das die Schleife nach x Sekunden(über nen Timer) verlassen wird wenn kein ACK da ist.


    Gruß Matthias

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    12.11.2004
    Ort
    Hvalstad, Norwegen
    Beiträge
    140
    Pollen, also das warten in einer Schleife auf eine Bedingung, ist immer schlecht.
    Wenn deine Uebertragung nicht erfolgreich ist, bleibt der Controller haengen.
    Besser eine if() abfrage die die weitere Programabfolge anstoesst und die z.B. nach 1000 erfolglosen Versuchen ein Errorflag setzt.
    Nicht vergessen den Zaehlerstand zurueckzusetzen!

    Bsp:
    Code:
    int i2c_readAck(void) 
    {     
          TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWEA);     
          if(TWCR & (1<<TWINT)) // Erfolgreicher Empfang: Wert wird zurueckgegeben
         {         
               return TWDR;
         }
          else // Bisher kein erfolgreicher Empfang: -1 als Fehlercode. 
               //Im Hauptprogramm kann man diesen Rueckgabewert dann auswerten bzw. zaehlen.
         {        
               return -1;
         }
    }

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.557
    Zitat Zitat von Christoph2 Beitrag anzeigen
    ... I2C ... bleibt der Controller einfach hängen ... Lib... Fleury ...
    Könntest Du den Code vom I²C-Aufruf im Master dazulegen? Der ist manchmal verdächtig . . . . und hatte in meinen Realisierungen erstmal gestört . . . .

    Zur Tsunamigefahr: Wie wärs, wenn Du bei der Beregnungsanlage einen Zeitschalter einbaust, der nach ein paar Sekunden oder Minuten Regen dem Controller einen Reset verpasst ? ? ? Natürlich müsste der Controller danach - aber eben immer wenn er gerade die ARbeit aufnimmt - einige "ordentliche" Messwerte abliefern bis der Regen erneut schaudert.
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.03.2011
    Beiträge
    1.401
    Zitat Zitat von Christoph2 Beitrag anzeigen
    Hallo!

    Ich habe Probleme mit dem I2C Bus meiner Terrariusteuerung. Ich messe die Temperatur und die Luftfeuchtigkeit im Terrarium mit digitalen I2C Sensoren. Die Kabellängen sind etwas lang für den I2C Bus, aber ich habe sehr gute geschirmte CAN Buskabeln verwendet, und bei einer sehr langsamen Busfrequenz von 2kHz funktioniert das ganze ca. 5 Minuten lang, manchmal auch 10 oder 15, aber dann bleibt der Controller einfach hängen.
    Um das Problem an der Wurzel anzugehen, fehlen noch einige Informationen:

    Was für Störungen hast du auf dem Bus, zeigt die doch mal auf dem Scope. Wo kommen sie her? Du weißt schon, daß man Störungen an der Quelle bekämpft.

    Wie lang sind denn deine Kabel? In den I2C Specs steht nichts von einer maximalen Länge.

    Wie schnell sind deine Sensoren? Sind deine 2kHz fast nichts von 100k oder garnichts von 400k.

    Ich bin sicher das Problem ist lösbar.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.09.2009
    Ort
    Geilenkirchen
    Beiträge
    419
    Hallo!
    Was hältst du davon, wenn du noch eine Sicherheitsvorkehrung triffst?
    Hänge doch 2 oder 3 cm über dem Boden irgendetwas auf, das erkennt, wenn da wasser ist.
    Z.B. 2 Streifen Alufolie udn ein Verstärker
    Dann kannst du damit ein Interrupt auslösen und sofort die Beregnung Anhalten.

    Gruß
    Olaf

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.08.2008
    Ort
    Hallein
    Alter
    26
    Beiträge
    802
    Das Grundproblem von I2C ist halt schon, dass er unsymmetrisch ist und eben auf solche Störungen anfällig. Abhilfen sind Busgeschwindigkeit reduzieren, Kabellänge reduzieren und auf jeden Fall den Watchdog des AVR verwenden der deinen Controller im Fehlerfall resettet
    Kultuverein Metal Resurrection, für mehr Bands und Konzerte in Österreich (:

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    25.03.2006
    Ort
    nahe Tulln (Niederösterreich)
    Alter
    26
    Beiträge
    460
    Hi,

    danke für die vielen Antworten, erstmal noch ein paar Informationen: Die Stromversorgungskabeln für alle Verbrauer werden über 6,5m lange Kabeln von der Steuerung zum Terrarium geführt. Parallel dazu läuft ein CAT6 Kabel für den I2C Bus.
    Bei den Stromversorungskabeln sind 3 Kabeln dabei, die 3,5A PWM modulierten Strom führen, zum dimmen der Lampen. Das hat erstmal garnicht funktioniert. Ich habe dann direkt an die Steuerung eine kleine Schaltung mit CAN Bustreibern gehängt, die den standard I2C Bus auf Differentielle Signalübertragung umwandelt. Direkt beim Terrarium wird es wieder zurückgewandelt.
    Der Standard-I2C Bus ist jetzt nur noch auf der Hauptplatine (ca. 30cm) und im Terrarium zu den einzelnen Sensoren (ca. 1,5m geschirmte CAN Kabeln).

    Ich glaube hardwaremäßig kann man nicht mehr viel verbessern ohne viel Geld zu investieren. Und selbst wenn ich es durch Hardwareverbesserungen zum Laufen bekomme kann ich nie sicher sein dass es ewig funktioniert, z.B. wenn ich noch ein zusätzliches PWM Kabel dazulege oder so...
    Lieber wäre mir das eleminieren von den Endlosschleifen im Programm.

    Mit 10kHz Busgeschwindigkeit funktioniert es ca. 10 Sekunden, mit 2kHz ca. 5 Minuten.
    Das heißt bei 2kHz kommt durchschnittlich alle 5 Minuten ein "Fehler". Wenn ich den fehlerhaften Wert verwerfe, wird eben alle 5 Minuten ein Wert verworfen, das ist total egal.

    Irgendwelche Sicherungen gegen Überflutung wird es auch noch geben, aber das ist ja nicht das einzige Problem, das war nur ein Beispiel. Ich kann die Steuerung ja nicht alle 5 Minute resetten...

    @lorcan: Ich habe die i2c_read Befehle auf if-Abfragen umgeschrieben, jetzt mach der Controller aber überhaupt nichts mehr. Ich glaube es dauert einfach ein bischen bis das TWINT Bit rückgesetzt wird, und diese Zeit muss man abwarten. Wenn man es aber ohne Schleife macht, also nur mit if, dann fängt er an mit dem Empfangen, fragt aber sofort ab ob er schon fertig ist. Das ist er natürlich noch nicht, also gibt er den Fehlercode -1 zurück. Dann führt er den nächsten Befehl aus, z.B. das nächste i2c_write zur Abfrage des nächsten Sensors... Obwohl er den letzten Wert noch garnicht empfangen hat.

    Vielleicht reicht es aber auch, eine gewisse Zeit zu warten, anstatt zu warten bis das TWINT Bit rückgesetzt wird?
    Weiß jemand wie lange ungefähr, oder wie man das berechnen kann?

    lg
    Christoph

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.03.2011
    Beiträge
    1.401
    Bei den Stromversorungskabeln sind 3 Kabeln dabei, die 3,5A PWM modulierten Strom führen, zum dimmen der Lampen. Das hat erstmal garnicht funktioniert. Ich habe dann direkt an die Steuerung eine kleine Schaltung mit CAN Bustreibern gehängt, die den standard I2C Bus auf Differentielle Signalübertragung umwandelt. Direkt beim Terrarium wird es wieder zurückgewandelt.
    Der Standard-I2C Bus ist jetzt nur noch auf der Hauptplatine (ca. 30cm) und im Terrarium zu den einzelnen Sensoren (ca. 1,5m geschirmte CAN Kabeln).
    Du hast also gar keinen I2C Bus, sondern irgendetwas nicht näher beschriebenes anderes mit RS485 Pegeln. Bist du dir sicher, das das wirklich funktioniert?

    Es ist ziemlich schwer, zielführende Ratschläge zum I2C Bus zu geben, wenn du gar keinen hast.

    Das Grundproblem von I2C ist halt schon, dass er unsymmetrisch ist und eben auf solche Störungen anfällig
    Das wäre ein Hinweis gewesen, passt aber nicht bei RS485 Pegeln.

    Ich glaube auch nicht an direkte Störungen durch die PWM, die passt nicht zu Minuten. Da geht eher jede Übertragung in die Hose. Ich denke, die ganze Buswandlung funktioniert nicht zuverlässig, und die SCL Leitung hängt. Der Master, der eigentlich den Takt vorgibt, sieht das als Clock-Stretching und hängt dann auch.

    Lieber wäre mir das eleminieren von den Endlosschleifen im Programm
    Klingt gut, aber wenn dein Bus hängt und damit auch dein I2C Controler, hilft dir das hier nicht.

    Ohne Tricks und voll in den Specs, reicht ein I2C Bus leicht 5m bei 400kHz. Eingestreute Störungen führen nicht zum Hängen sondern "nur" zu fehlerhaften Daten.

    Die häufigsten Probleme entstehen durch "Verbesserungen" wie Pegelwandler oder Buswandler. Die Busleitungen sind nun mal Open Collector und nur nach Low getrieben, und das ist nicht einfach zu machen. Auch fertige Wandlerbausteine haben da ihre Einschränkungen, wie man in den Datenblättern lesen kann.

    Das nächste Problem sind die Kabel. Weil bei anderen Übertragungen verdrillte Leitungen eingesetzt werden, wird das auch als gut für I2C angesehen, und dann SDA und SCL als Paar geführt. Die Wirkung ist dann ein quasi Kurzschluß zwischen beiden durch die Kabelkapazität. Da geht dann auch nichts mehr.

    Da ich aber immer noch nicht weiß, wie lang dein Bus sein muß, jedenfalls ist er nicht kürzer als 30cm + 1,5m, kann ich dir schlecht einen Rat geben, dein Problem zu lösen.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Versteckte Ordner wieder "unversteckt" machen
    Von Sebas im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 2
    Letzter Beitrag: 20.09.2011, 16:19
  2. Wie viel Sachen kann ein Atmega 2560 "gleichzeitig" machen
    Von super-robman im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 9
    Letzter Beitrag: 06.09.2011, 16:20
  3. "PIR D203S" was ist das, was kann man damit machen
    Von bnitram im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 18.04.2011, 16:38
  4. Microstepper "kräftiger" machen ? (geklärt)
    Von PICture im Forum Motoren
    Antworten: 12
    Letzter Beitrag: 09.10.2010, 14:37
  5. ASM: was machen "swap" und "cbr" genau?
    Von RHS im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 18.08.2004, 18:16

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •