I2CPort / I2CClk Frequenz Problem?

  • 1
  • 2
  • 3
  • 4
  • Page 2 of 4
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: I2CPort / I2CClk Frequenz Problem?

 · 
Posted: 10.01.2011 - 18:36  ·  #9
Hallo Rolf,

Multitasking verwende ich nicht. Außerdem wäre dann nicht klar, warum es vorher mit NOPs ging, die wären vorher ja auch betroffen gewesen.
Ich verwende den Interrupt Timer1Capt und den Interrupt Timer0 (Systick). Ich habe den Timer1Capt abgeschaltet und meine eigenen Routinen im Systick deaktiviert. Leider bleibt das Ergebnis gleich: 330 kHz... bei I2CCLK = 0,1;

Hier noch einmal meine Imports. Systick steht auf 10 msec.

Import SysTick, FAT16, RTclock, DCFclock, SerPort, LCDPort, I2CPort;
From System Import Float, Pipes,StackChecks, FlashCheck_S, Random, Fix64 {, Exceptions};
From RTClock Import RTCAlarm;
From SysTick Import SystemTime32;

Wie generieren Sie denn den Takt für das Soft-TWI?

Michael
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: I2CPort / I2CClk Frequenz Problem?

 · 
Posted: 10.01.2011 - 20:32  ·  #10
Hallo Michael,

nach jeder Flanke wird ein sDelay(I2Cdelay) aufgerufen. Das sDelay sieht so aus:
Code
sDelay:
  dec   R17
  brne  sDelay
  ret 

Das sind innerhalb des sDelay 3 Zyklen.

Ich werde jetzt das sDelay durch NOPs ersetzen, wenn I2Cdelay < 10.

rolf
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: I2CPort / I2CClk Frequenz Problem?

 · 
Posted: 11.01.2011 - 09:10  ·  #11
Hallo Rolf,

ich teste das mit den NOPs gern. :fgrin:

Gruß, Michael
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: I2CPort / I2CClk Frequenz Problem?

 · 
Posted: 18.01.2011 - 13:17  ·  #12
Hallo,

Habe jetzt die die letzte Version 4.99.28 aufgespielt, leider immer noch keine 400 kBit/sec bei I2Cclk = 1, keine Veränderung, es sind immer noch 330 kBit/sec.. Im Handbuch steht das mit den 3 Zyklen, was rechnerisch ja 500 kBit bei 14,7 MHz zulassen sollte, die aber nicht erreicht werden.
Wie geht es jetzt weiter?

Gruß, Michael
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: I2CPort / I2CClk Frequenz Problem?

 · 
Posted: 18.01.2011 - 20:27  ·  #13
Hallo Michael,

ich habe aus dem Archiv den I2C Treiber von Anfang 2010 ausgegraben und konnte keine Änderung bezüglich
des Timings feststellen. Diese 3 Zyklen sind ja nur die halbe Miete. Da kommt noch Bit Verarbeitung, schieben,
I/O etc. dazu. Das summiert sich...
Aber wie gesagt, ich kann von der Treiberseite keine Ursache finden.

rolf
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: I2CPort / I2CClk Frequenz Problem?

 · 
Posted: 18.01.2011 - 20:51  ·  #14
Hallo Rolf,

geht das, daß Sie mir den alten Treiber schicken? Da das timing bei mir schon zeitkritisch ist, und ich weiß, daß ich das Ganze früher schon mal vermessen habe - da war noch alles OK..

Ich würde das dann gern mit dem alten Treiber auf meiner Hardware testen.

Und wie gesagt, ich hatte als Parameter früher 36, damit war es ja OK. Und jetzt ist 1 immer noch zu langsam, 36 um den Faktor 7 zu lahm.

Gruß, Michael

PS: Testen Sie es doch mal auf einem HW-System. Wenn Sie die 400 kBit erreichen (bei 14.7 MHz), dann will ich es glauben. Wie gesagt, es ging ja mal...
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: I2CPort / I2CClk Frequenz Problem?

 · 
Posted: 19.01.2011 - 16:55  ·  #15
Hallo Rolf,

weil mir das Thema wichtig ist, habe ich jetzt ein Minimal-Programm geschrieben, das nur I2C Zugriffe auf einen Baustein macht, kein gesonderter Interrupt, kein Multitasking. Anbei der Screen-Shot mit der Messung des SCL-Signals - immer noch ~ 320 kBit/ sec, also weit von 400 weg. Also ist doch der Treiber nicht in Ordnung. Wollen Sie das Thema angehen oder müssen wir uns damit abfinden? (Bei 8 MHz CPU Frequenz schafft man nur noch 172 kBit/sec...)

Michael

Code
Program Test;
{ $NOSHADOW}                                                                   // make this a comment, so that ALL registers get saved
{ $LCDNOINIT}              {user calls LCDsetup if desired}

{ $NOSAVE}
{ $WG}                     {global Warnings off} // activate for error.list and unused variables
{ $W+}                                           // activate for error.list and unused variables
{$TYPEDCONST OFF}             // so können Typdefinitionen in Const weggelassen werden... naja


Device = mega2561, VCC=5;


Define_Fuses                                                                    // Fuses hier zur Dokumentation angegeben. Nicht angegeben = 1 = NICHT gesetzt
  Override_Fuses;                                                               // Das funktioniert nicht wie im Compiler-Handbuch auf S. 52 beschrieben
  LockBits0      = [];
  FuseBits0      = [SUT1];                                                      // CKSEL3..1 = 111 --> 16 MHz external oscillator
                                                                                // CKSEL0 = 1, SUT1..0 = 01 --> Crystal oscillator, BOD enabled
  FuseBits1      = [SPIEN, EESAVE, BOOTSZ1];                                    // BOOTSZ1\SZ0 0 1 --> Bootloader at WORD ADDRESS $1F800, EESAVE --> EEPROM is preserved during a chip erase
  FuseBits2      = [BODLEVEL0,BODLEVEL2];                                       // Brown Out at 4.3V BL0: 1, BL1: 1, BL2: 0;     2.7V: BL0: 0, BL1: 1, BL2: 0
  ProgMode       = SPI;

Import SysTick, I2CPort;

From System  Import Float;


Define
  ProcClock       = 14745600;       {Hertz}
  SysTick         = 10;             {msec}
  StackSize       = $0100, iData;
  FrameSize       = $0880, iData;

  I2Cport         = PortD;                                                      // use port PortD for the Soft-I2C
  I2Cclk          = 0, 1;                                                  // Use PortD.0 for the SCL. The second number gives the # of µP Cycles for one Clock:
                                                                                // With 14.745.600 Hz one cycle is ~ 67,8 nSec.
                                                                                // So:  36 x 67,8 nSec =  2,4408 µSec = 409 kHz   (for 400 kBit/Sec)
                                                                                // So: 148 x 67,8 nSec = 10,0344 µSec = 100 kHz   (for 100 kBit/Sec)
  I2Cdat          = 1;                                                    // Use PortD.1 for the SDA


Implementation


{$IDATA}

{--------------------------------------------------------------}

{$EEPROM}


{$IDATA}
{ Var Declarations }
Var
   gByte : Byte;
   gInt  : Integer;

{--------------------------------------------------------------}
{ Main Program }
{$IDATA}

begin
                                                                                // PD0 = I SCL I²C Bus
                                                                                // PD1 = I SDA I²C Bus
                                                                                // PD2, PD3 = I Not used
                                                                                // PD4 = I ICP1 Main multiplexed PWM Input from Input 1 .. 16 (see PA0)
                                                                                // PD5 - PD7 = I Not used
   DDRD  := %00000000;                                                          // DDRx : 0 is Input, 1 is Output. If 0 = Input: then PortX = 1 activates the internal pullup
   PortD := %00010000;                                                          // All Inputs without Pullup, except ICP1

   I2Cout($4F,1,$60);                                                           // Initialize the DS75 to $60 = 12 Bit, $40 = 11 Bit, $20 = 10 Bit, $00 = 9 Bit
   I2Cout($4F,0);

   EnableInts;
   SysTickEnable;



   loop
      I2Cinp($4F,gInt);
   endloop;

{ $DEPHASE}
end Test.

Attachments
I2CPort / I2CClk Frequenz Problem?
Filename: I2C-Clk.jpg
Filesize: 194.12 KB
Title:
Download counter: 88
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: I2CPort / I2CClk Frequenz Problem?

 · 
Posted: 22.01.2011 - 20:16  ·  #16
Hallo Michael,

ich sehe das Problem natürlich. Auch ich habe bei 16MHz mit I2Cdelay = 0 (2 Nops) "nur" 372kBit/sec erreicht. Ich kann allerdings nichts finden was den Speed erhöhen könnte. Auch konnte ich keine Differenzen zu früheren Soft-I2C Treiber Versionen finden. Tut mir leid, ich kann da nicht weiterhelfen.

rolf
  • 1
  • 2
  • 3
  • 4
  • Page 2 of 4
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   142   157 · Page-Gen-Time: 0.031257s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI