Hallo AVRco's,
in meinem Projekt laufen diverse I2C Bausteine über die I2CPort Implementierung von AVRco. Als ich das Ganze entworfen und getestet habe, lief alles auf 400 kBit/sec Busgeschwindigkeit. Ich habe jetzt aber das Problem, daß der Bus viel zu langsam läuft. Bei 400 kBit/sec sollte das CLK-Signal des ATMEGA Masters eigentlich 400 kHz haben, d.h. 2,5 µSec Periodendauer. Hat es aber nicht mehr, mein Oszi zeigt 17,5 µSec (= 57 kBit/sec) an, also um den Faktor 7 zu langsam. Entsprechend verlängern sich die Wartezeiten für die Datenübertragung. Das hat mal funktioniert, aber jetzt sind die Probleme da.
Die Fuses meiner Systeme (ATMega 2561) sind OK, die Taktrate 14,7 MHz, Timer, UART alles normal. Nur das Soft-TWI nicht.
Anbei mein Header mit der Berechnung zu I2CClk:
Mit dem Wert von 36 Prozessor-Taktzyklen kommt die zu niedrige Rate von 57 kBit/sec (17,5 µsec) raus, erst wenn ich einen Wert von I2Cclk 0, 1 setze, kommt annähernd 400 kBit/sec raus.
Hab ich was falsch oder ist im AVRco was NIO?
Gruß, Michael
in meinem Projekt laufen diverse I2C Bausteine über die I2CPort Implementierung von AVRco. Als ich das Ganze entworfen und getestet habe, lief alles auf 400 kBit/sec Busgeschwindigkeit. Ich habe jetzt aber das Problem, daß der Bus viel zu langsam läuft. Bei 400 kBit/sec sollte das CLK-Signal des ATMEGA Masters eigentlich 400 kHz haben, d.h. 2,5 µSec Periodendauer. Hat es aber nicht mehr, mein Oszi zeigt 17,5 µSec (= 57 kBit/sec) an, also um den Faktor 7 zu langsam. Entsprechend verlängern sich die Wartezeiten für die Datenübertragung. Das hat mal funktioniert, aber jetzt sind die Probleme da.
Die Fuses meiner Systeme (ATMega 2561) sind OK, die Taktrate 14,7 MHz, Timer, UART alles normal. Nur das Soft-TWI nicht.
Anbei mein Header mit der Berechnung zu I2CClk:
Code
Define
ProcClock = 14745600; {Hertz}
SysTick = 10; {msec}
StackSize = $0100, iData;
FrameSize = $0880, iData;
RTClock = iData, DateTime;{Time, DateTime}
RTCsource = SysTick;
DCFclock = iData;
DCFport = PinE, 7, positive; {Port, Pin#, Polarity} // Set this to the Fast Input that can be the DCF77 Input (normally PE7)
I2Cport = PortD; // use port PortD for the Soft-I2C
I2Cclk = 0, 36; // 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
Serport = 230400, Stop2; //, TimeOut; //921600 460800 230400 115200
ProcClock = 14745600; {Hertz}
SysTick = 10; {msec}
StackSize = $0100, iData;
FrameSize = $0880, iData;
RTClock = iData, DateTime;{Time, DateTime}
RTCsource = SysTick;
DCFclock = iData;
DCFport = PinE, 7, positive; {Port, Pin#, Polarity} // Set this to the Fast Input that can be the DCF77 Input (normally PE7)
I2Cport = PortD; // use port PortD for the Soft-I2C
I2Cclk = 0, 36; // 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
Serport = 230400, Stop2; //, TimeOut; //921600 460800 230400 115200
Mit dem Wert von 36 Prozessor-Taktzyklen kommt die zu niedrige Rate von 57 kBit/sec (17,5 µsec) raus, erst wenn ich einen Wert von I2Cclk 0, 1 setze, kommt annähernd 400 kBit/sec raus.
Hab ich was falsch oder ist im AVRco was NIO?
Gruß, Michael