-
@Dennis
Es ist natürlich schwer, einen Code zu analysieren, der nur aus Calls in eine unbekannte Library besteht.
Einiges kann man ahnen, anderes weniger.
I2C_start() und I2C_stop() dürften die entsprechenden Signale auf den Bus legen und I2C_write(xx) ein Byte senden. Aber was macht I2C_clock()? Die Clock auf einen Wert einstellen kann nicht sein, es gibt ja keinen Parameter und die Clock starten kann auch nicht sein, vor einem Start gibt es bei I2C keine Clock. Und was macht I2C_ack()? Ein ACK senden kann es nicht sein, das ACK kommt immer von dem, der gerade Daten empfangen hat. Und eine Abfrage, ob ein ACK empfangen wurde, kann es eigentlich auch nicht sein, dann würde ja irgendwas wie ein if im Code vorkommen.
Bevor das nicht wirklich geklärt ist, braucht man sich über Bitkombinationen keine Gedanken zu machen.
Hier mal kurz den Anfang einer I2C Übertragung:
Code:
Start erzeugen
Adressbyte senden
empfangenes ACK bzw NAK auswerten
wenn NAK
Slave antwortet nicht, Übertragung abbrechen
Stop erzeugen
wenn ACK
weiter senden
.
.
MfG Klebwax
-
Crazy Harry
mit deinem Controllbyte für den Segment Test leuchten jetzt an Segment 1 a,c,e,g und punkt und an Segment 3 b,e,f und punkt
Irgenwie passt das alles Absolut nicht zu einander wenn ich alle Segmente mit voller Helligkeit und komplett anhaben möchte muss ich beim Controllbyte 0b01111111 angeben das habe ich aber auch nur mit probieren heraus gefunden wenn ich 0b01111011 angebe leuchtet Segment 1/3 voll und bei ob01110111 leuchten Segment 2/4 voll
- - - Aktualisiert - - -
Das ist der Code der die Daten über den I2C Bus sendet
Code:
#define SDA T1 /* Set P3.5 = SDA */
#define SCL T0 /* Set P3.4 = SCL */
#define I2C_DELAY 0x0F /* For delay i2c bus */
void I2C_delay(void)
{
unsigned char i;
for(i=0; i<I2C_DELAY; i++);
}
void I2C_clock(void)
{
I2C_delay();
SCL = 1; /* Start clock */
I2C_delay();
SCL = 0; /* Clear SCL */
}
void I2C_start(void)
{
if(SCL)
SCL = 0; /* Clear SCL */
SDA = 1; /* Set SDA */
SCL = 1; /* Set SCL */
I2C_delay();
SDA = 0; /* Clear SDA */
I2C_delay();
SCL = 0; /* Clear SCL */
}
void I2C_stop(void)
{
if(SCL)
SCL = 0; /* Clear SCL */
SDA = 0; /* Clear SDA */
I2C_delay();
SCL = 1; /* Set SCL */
I2C_delay();
SDA = 1; /* Set SDA */
}
bit I2C_write(unsigned char dat)
{
bit data_bit;
unsigned char i;
for(i=0;i<8;i++) /* For loop 8 time(send data 1 byte) */
{
data_bit = dat & 0x80; /* Filter MSB bit keep to data_bit */
SDA = data_bit; /* Send data_bit to SDA */
I2C_clock(); /* Call for send data to i2c bus */
dat = dat<<1;
}
SDA = 1; /* Set SDA */
I2C_delay();
SCL = 1; /* Set SCL */
I2C_delay();
data_bit = SDA; /* Check acknowledge */
SCL = 0; /* Clear SCL */
I2C_delay();
return data_bit; /* If send_bit = 0 i2c is valid */
}
unsigned char I2C_read(void)
{
bit rd_bit;
unsigned char i, dat;
dat = 0x00;
for(i=0;i<8;i++) /* For loop read data 1 byte */
{
I2C_delay();
SCL = 1; /* Set SCL */
I2C_delay();
rd_bit = SDA; /* Keep for check acknowledge */
dat = dat<<1;
dat = dat | rd_bit; /* Keep bit data in dat */
SCL = 0; /* Clear SCL */
}
return dat;
}
void I2C_ack()
{
SDA = 0; /* Clear SDA */
I2C_delay();
I2C_clock(); /* Call for send data to i2c bus */
SDA = 1; /* Set SDA */
}
void I2C_noack()
{
SDA = 1; /* Set SDA */
I2C_delay();
I2C_clock(); /* Call for send data to i2c bus */
SCL = 1; /* Set SCL */
}
-
So ich habe den Fehler gefunden habe einfach nur das Datenblatt falsch interpretiert es hat bei mir klick gemacht als mir der hinweis gegeben wurde das ja das ACK bit vom Empfänger kommt und nicht vom sender nachdem ich das raus genommen habe funktionieren die Anzeigen wunder bar danke für eure schnelle und gute Hilfe
gruß
Dennis