- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 10 von 38

Thema: I²C mit Bitrate > 100 kHz - nur mit Treiber ?

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Hi PICture, hallo Klebwax,

    denke für die Antwort. Die Separierung der Flachkabel-Adern habe ich schon, zwar nur durch je eine GND-Ader. Das fand ich zwar selbst sinnvoll, ABER es kam einfach von den beiden aktuellen Platinen von robotikhardware, deren I²C-Stecker schon automatisch diese Funktion hergibt.

    Und Klebwax danke ich für das theoretische Privatissimum. So komme ich ja wieder ein Stück weiter in die tieferen Geheimnisse der Elektronik. Danke! Da fehlts mir ja wirklich an allen Enden und Ecken.
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Was bisher geschah:
    - Eigene Platine für 10 Servos wurde fertiggestellt und entwanzt (SCL auf SDA und umgekehrt *greuel*). Fertig.
    - Die I 2C-Bibliotheken des Forumkollegen (danke ...) wird durchgearbeitet. Ich bin noch dran.
    - Die Application Notes von Atmel zu TWI, AVR311, ~12 und ~15 wurden durchgelesen. Fertig.
    - Das U SB-I 2C-Testteilchen von ELV, Basis ATmega 88, wurde zusammengesteckt und getestet. Fertig.
    - Das U SB-Teilchen wurde auf 400kbps gesetzt.
    - Alle drei Platinen (2 fertige von robotikhardware, 1 eigene) sind mit dem U SB-Teilchen bei 400 kbps sicher ansprechbar. Getestet wurden z.B. Sendesequenzen von 16 Bytes und sofort anschließend 10 Bytes zurücklesen. Dabei traten keine Störungen auf.
    - Die Tests mit dem U SB-I2 C-Tester wurden mit der identischen Hardwareausrüstung wie die Platine-zu-Platine-Tests durchgeführt - es wurde nur eben der Master gewechselt und ein Stück verdrilltes Kabel, 20 cm - 4 Drähte, an das ursprüngliche Flachbandkabel ZUSÄTZLICH angeschlossen.
    - Alle drei Platinen sind als Master und als Slave mit und ohne Timerinterrupts, die unabhängig von der I2C-Geschichte sind, getestet worden.
    - Mit den genannen drei Platinen sind Sendefrequenzen um 100 kHz (TWBR > 90) praktisch störungsfrei, höhere Sendefrequenzen werden sofort oder nach mehreren Datentelegrammen gestört.

    Die AVR315 empfielt "TWBR should be 10 or higher if the TWI operates in Master mode". Ausserdem berichtet diese AppNote, dass die "CPU clock frequency in the Slave must be at least 16 times higher than the SCL frequency". Daraus müsste bei meinen 20MHz-an-20MHz-Platinen eine Kommunikation theoretisch mit 800 kbps möglich und eine mit 400 kHz eben schon sicher sein. 400 kbps sind mit dem U SB-Teilchen offenkundig möglich (die tatsächliche Taktrate bei eingerasteter 400 kHz-Kommunikation wurde noch nicht gemessen/bestätigt). Leider kenne ich auch nicht den Code dieses praktischen Werkzeugs.

    Wo die Kommunikation hängen bleibt, konnte ich noch nicht feststellen, aber ich würde es schon gerne wissen.

    Weitere Bemühungen zum I 2C pausieren aktuell.
    Ciao sagt der JoeamBerg

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    @oberallgeier

    I2C ist so ein Hobby von mir (ich würde also gerne helfen). Ich hab aber leider im Moment einen großen Brocken am Hals, so daß ich mich deinem Problem nicht mit der erforderlichen Sorgfalt widmen kann. Sei also nicht böse, wenn Antworten ausbleiben.

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

  4. #4
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694

    Experimentelle Softwareentwicklung

    Zitat Zitat von oberallgeier Beitrag anzeigen
    ... Weitere Bemühungen zum I 2C pausieren aktuell ...
    ... Nur pausiert das Gehirn nachts nicht immer. Das scheint nicht nur bei mir so zu sein, wenn ich mir so manches 2- (3- oder 4-) -Uhr-nachts-Posting ansehe.

    Mir war ein-/aufgefallen, dass der Abbruch der I2C-Kommunikation immer nach einer ganz bestimmten, genau lokalisierbaren Aktion (UART-Ausgabe eines rückgelesenen Datensatzes) erfolgte, auch wenn oft vorher die gleiche oder ähnliche Test-Schreib- und Leseaktion durchgefahren wurde (läuft RC-5-gesteuert). Der Abbruch erfolgte mal nach mehr, mal nach weniger Durchläufen, manchmal sofort nach dem Lesen - je nach I2C-Geschwindigkeit. An dieser Stelle wurde die Leseadresse geschrieben - und danach ein "i2c_start(SLAVE_MoCo+I2C_READ)" gesendet. Jetzt, nachdem ich VOR diesem Readbefehl, nach dem Schreiben der Leseadresse ein i2c_stop gesetzt habe, rauscht mein I2C mit maximaler Geschwindigkeit - maximal nach ATMEL-Spezifikation: TWBR should be 10 or higher... , aktuell habe ich TWBR = 10.

    Testaufbau: RNControl, m1284/20MHz, Eigenbau Servoplatine, m328/20MHz, 9-poliges Flachbandkabel, ca. 1m20.

    Danke für die vielen hilfreichen Tips, danke m..c..


    Anmerkung: Manche Menschen machen keinen Fehler zweimal, aber sie lassen auch keinen aus . . .
    Ciao sagt der JoeamBerg

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    ... I2C mit maximaler Geschwindigkeit ... TWBR = 10 ...
    So, nun ist meine Stimmung doch deutlich gestiegen. Ich habe endlich einen halbwegs realistischen Testaufbau - drei Controller. Dazu ein fast zweieinhalb Meter langes 10fach-Flachkabel. Und I2C läuft mit TWBR = 5. Master wie vor mit 20 MHz. Da machts einfach gute Laune, wenn der Master bei einem Rundruf in seine - hier noch unbekannte I²C-Welt (...for ( uint8_t look=0x00; look <= 0xFC; look = look + 2 )...) auch die tatsächlich vorhandenen Controller erkennt , siehe Dump vom Terminal :

    Code:
     C501 R5M_x15-16 m1284p/20MHz 28Nov2012 16:46
     I2C >>400kHz [t05], I2C mit Taste [gelb], dann [OK] zu MoCo328
     Motoren rauf+runter mit Taste [P100]
     Gute Funktion mit extINT2 für RC-5
     Initialisierung ADC auf ADC5/PA5=Poti
     UbattADC5 Min = 2 , Mess = 678
    
     Es folgt Aufruf i2clook
     Suche vorhandene I²C-Devices von 0x00 bis 0xFE
    -----------------------------------------------------------------
     Slave erkannt auf 130 dez = 0x82
     Slave erkannt auf 132 dez = 0x84
    ------------------------------------------------------------
     Rückkehr von i2clook
    
     Beginn Schleife/RC-5-lesen in ~r1n15~
     Aktiv :  Taste [MIX], [P100], [9] und [gelb]
     Bitte um Aktion _
    Ach so - jedes Minus oben im Slave-Suchabschnitt ist eine nicht-antwortende Adresse.
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo oberallgeier.

    Gratulation zum Erfolg bei diesem Teil-Problem.


    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  7. #7
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Das Thema ist erfolgreich abgeschlossen, im ersten Posting (klick) ist ein Inhaltsverzeichnis der relevanten Beiträge.
    Ciao sagt der JoeamBerg

  8. #8
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    8.694
    Viel Unverständnis zu diesem Zustand (passt halt nur so ungefähr in diesen Thread):

    I2C-Lesen braucht ne Pause.

    Vorgeschichte: Bei meinem Archie hängen an einem I²C-Master (mega1284/20MHz) mehrere Slaves, einer davon eine Motor-Steuerplatine (mega328/20MHz) mit Treiberplatine für zwei Motoren je max 60W. Die Befehle für die Motoransteuerung der beiden Motoren gehen vom Master zur Motor-Steuerplatine per I²C, das läuft prächtig. Lesen des Slavepuffers - z.B. Encoderstand oder Ist-Speed - ging oft, meist, führte bisher stehts nach 1 bis etwa 20 (evtl. mehr?) Lesevorgängen zum Blackout des Masters. Blackout: TWI-Übertragung stoppte (z.B. belegt durch testweise Ausgabe per UART), aber ISR (TIMER2_COMPA_vect) lief weiter mit 20kHz-Interrupt, erkennbar am Toggeln der 1-sec-Heartbeat-LED.

    Sonstige Angaben: 2 UARTkanäle laufen per Interrupt - 1x 115,2 kBd fürs Terminal und 1x 57,6 kBd für die PingPong-LED-Anzeigetafel, ISR (TIMER2_COMPA_vect) mit 20 kHz, ADC im free running mit rund 15 kHz, External Interrupt 20 für RC5, I2C nach PFleury mit 100 kHz.

    Fazit bisher: Telegramme werden an die Slaves per I²C nur gesendet, es wird nichts zurückgelesen. Ein ziemlich unbefriedigender Zustand (aber Archie lief ziemlich gut).

    Versuch einer Nachbesserung heute, dazu zuerst Versuch einer Identifizierung der Abbruchstelle. Um die Absturzstelle des Codes zu identifizieren wurden zuerst kurze UART-Telegramme in die I²C-Lesesequenz eingefügt. Die erste im Master gleich nach dem Schreiben der Adresse des ersten zu lesenden Pufferbytes. Und schon läufts klaglos. Ein einziges Millisekundenwait tat den gleichen Nutzen, mittlerweile tuts ein wait von 100 Mikrosekunden. Kontrolle: ohne Wait bekomme ich den Master nach 1 bis 15 Lesevorgängen ins Koma.

    Derzeit wurde als Testsequenz tausend Mal auf den Puffer zugegriffen und stets jeweils die gleichen fünf Bytes der Motorplatine ausgelesen, Slaveadresse 130 dez = 0x82, Startbyte zum Lesen = 23. No Problem, mit UART-Ausgabe und einem Wait von 50 ms in der Leseschleife eine Sache von gut 60 sec (die ersten fünf brauche ich um den Befehl per RC5 an den Master zu senden). Das sieht zum Schluss am Terminal so aus, die Sekunden ist die aktuelle Boardzeit mit Start beim Power on:

    PHP-Code:
        I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    985    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    986    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    987    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    988    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    989    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    990    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    991    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    992    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    993    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    994    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    995    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    996    Zeit  65 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    997    Zeit  66 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    998    Zeit  66 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    999    Zeit  66 sec
        
    I2CMrid # 131/23    O-AL 23    O-AH 24    O-BL 25    O-BH 26    1000    Zeit  66 sec
        
    Ende test841 
    Fazit: diese tausend Lesevorgänge lassen vermuten, dass zuküftig keine Störungen mehr auftauchen.

    Hier zur Erläuterung der Leseabschnitt der Funktion void I2CMrid ( void ) // I2C, Motordaten auslesen über I²C
    Code:
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    //      Lesen vom Slave     
      if(!(i2c_start(SLAVE_MoCo+I2C_WRITE))) //Slave bereit zum schreiben/lesen?
      {                                     //
            i2c_stop();     // Dies scheint notwendig, um den Lesepointer korrekt
                            //      zu positionieren
        i2c_start(SLAVE_MoCo+I2C_WRITE);    // Slave bereit zum schreiben/lesen?
    //  i2cdmy = i2c_write( 0x15 );         // Bufferadresse 15hex/21dez zum Lesen
    //  i2cdmy = i2c_write( 0x04 );         // Bufferadresse 04hex/04dez zum Lesen
        i2cdmy = i2c_write( laddr );        // Lese Buffer ab Adresse laddr
            i2c_stop();                     //
    //uputs0 ("\r\tLabel nach Start ");     // Nach Einfügen dieser Zeile lief es gut!
    //  wms  (    1);                       //  daher statt der UART-Ausgabe das wait
        wmus (  100);                       //  kurzes Wait, ca. 0,1 ms
        i2cdmy  = i2c_start(SLAVE_MoCo+I2C_READ); // <<<### Lesen beginnen
        ipwm12  = i2c_read (ACK);           // Bytes lesen...
        soll12  = i2c_read (ACK);           //
        ipwm34  = i2c_read (ACK);           // 
        soll34  = i2c_read (ACK);           //
        i2cdmy  = i2c_read (NAK);           // letztes Byte lesen, NAK
            i2c_stop();                     // Zugriff beenden
      }                                     //
      else                                  // Wenn Fehler, dann nelde jetzt:
      {                                     //    Lesefehler, dazu Fehlerblinken
        uputs0("\r\n\t### Kein Lesen möglich.\r\n");     //
        i2cerr      = 0b00000001;           // Fehlercode zu i2c-read nicht möglich
      }                     // Ende if(!(i2c_start(SLAVE_MoCo+I2C_WRITE)))
    Frage/Bitte:
    Kann mir jemand bitte erklären wo ungefähr die Leseroutine sich durch eine zu knappe zeitliche Bemessung aufhängen könnte? Ich dachte, dass das
    Ciao sagt der JoeamBerg

Ähnliche Themen

  1. ADU und Treiber
    Von manhunt im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 15.06.2009, 18:27
  2. CAN-BUS: Wie könnte man die Bitrate messen?
    Von Kaiser-F im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 29.09.2006, 09:38
  3. Treiber IC
    Von jonas im Forum Elektronik
    Antworten: 10
    Letzter Beitrag: 27.04.2005, 16:58
  4. FET-Treiber
    Von FelixR im Forum Elektronik
    Antworten: 0
    Letzter Beitrag: 20.02.2005, 14:15
  5. Treiber Ic
    Von Robbigay im Forum Motoren
    Antworten: 10
    Letzter Beitrag: 05.05.2004, 20:00

Berechtigungen

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

Labornetzteil AliExpress