Koertis
28.08.2010, 15:05
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?
// 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
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?
// 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