- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 7 von 7

Thema: I2C delay

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    20.12.2009
    Beiträge
    86

    I2C delay

    Anzeige

    Powerstation Test
    Hallo,

    ich habe folgendes Problem:

    Ich steuere per I2C-Bus 4xTLC59116 an. Nun habe ich festgestellt wenn der Atmega schreibt, gibt es beim Wechsel der TLCs einen delay von 200us [Siehe Oszibild].

    Diese Zeit ist mir unerklärlich und ich muss sie umbeding auf mindestens ca. 50us veringern.

    Ich arbeite mitn einem Atmega644, 20MHz.
    Busgeschwindigkeit 850kHz.

    An den Schreibbefehlen i2csendstart, i2csendbyte liegt es nicht.
    Kann es sein dass meine Globale Variable LINE zu viel Zeit in Anspruch nimmt?


    Code:
    // Mein Schreibbefehl: Sendet jedem TLC 16byte + 2bit
    // LINE ist ein Array von [4][16] <- für jeden TLC ein String
    // LINE ist eine globale variable
    
    void WRITE_LINE (void)	{
      uint8_t TLC;
      uint8_t Counter;
      uint8_t Coloumn = 3;
    
        for(TLC = 0xC6;TLC >= 0xC0; TLC-=2) {
          if (i2csendstart() != 0x08) {
            i2csendstop();
            _delay_us(5);
            return;
          }
          if (i2csendbyte(TLC) != 0x18) {
            i2csendstop();
            _delay_us(5);
            return;
          }
          if (i2csendbyte(0xA2) != 0x28) {
            i2csendstop();
            _delay_us(5);
            return;
          }
        
          for(Counter = 0; Counter <16; Counter ++) {
            if (i2csendbyte((LINE[Coloumn][Counter])) != 0x28) {
              i2csendstop();
              _delay_us(5);
              return;
            }
          }
          i2csendstop();
          Coloumn--;
        }  
      return; 
    }
    Danke,
    lg Koertis
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken tek0000.jpg  

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Tscha, in einem hast du recht:
    eine zweifache indizierung in der innersten Schleife tut weh. da kommen schon ein paar Cycles zusammen.
    Ich würde als erste Hilfe schon mal versuchen, vor der Schleife wenigsten LINE[column][0]
    zu einem char* zu machen und dann nurmehr diesen pointer inkrementieren.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    20.12.2009
    Beiträge
    86
    Ich habe jetzt die globale Variable gelöscht und diese in der Write_Line funktion übergeben, jedoch besteht immer noch der selbe delay von 210us...

    Code:
    void WRITE_LINE (uint8_t LINE[][16])	{
    uint8_t TLC = 0xC4;
    uint8_t Coloumn = 3;
    uint8_t Counter = 0;
        for(TLC = 0xC6;TLC >= 0xC0; TLC-=2) {
        //_delay_us(2);
          if (i2csendstart() != 0x08) {
            i2csendstop();
            _delay_us(5);
            return;
          }
          if (i2csendbyte(TLC) != 0x18) {
            i2csendstop();
            _delay_us(5);
            return;
          }
          if (i2csendbyte(0xA2) != 0x28) {
            i2csendstop();
            _delay_us(5);
            return;
          }
        
          for(Counter = 0; Counter <16; Counter ++) {
            if (i2csendbyte((LINE[Coloumn][Counter])) != 0x28) {
              i2csendstop();
              _delay_us(5);
              return;
            }
          }
          i2csendstop();
          Coloumn--;
        }
    
     
      
      return; 
    }
    oder geht es mit pointer inkrementieren schneller??

    lg Koertis

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Das da tut weh

    i2csendbyte(LINE[Coloumn][Counter])) ....

    Deswegen sag ich ja
    pointer = &LINE[Coloumn][0]

    und in der 16-erschleife dann nurmehr
    pointer++
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    20.12.2009
    Beiträge
    86
    Danke, ich werde es morgen probieren.
    Gibt es sonst noch eine schnellere Möglichkeit die Farbwerte irgendwie zu übergeben?

    lg Koertis

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    naja, das mögliche Limit ist zu ermitteln, wenn du ausrechnest, wieviel Bits bei 850 kHz in welcher Zeit über die Leitung gehen ( 1 Byte = 8+1 Bit).
    Schneller als das kann's nicht werden.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    20.12.2009
    Beiträge
    86
    Die Übertragung kann ich noch bis zu 1MHz erhöhen,
    aber wichitiger ist, den delay von 200us zwischen den Baustein zu reduzieren... denn so habe ich einen delay con 4x200us...

Berechtigungen

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

fchao-Sinus-Wechselrichter AliExpress