shedepe
15.05.2010, 13:05
Hall zusammen
ich versuche nun schon seit 2 Tagen die Kommunikation zwischen den beiden Controllern zum Laufen zu bringen und bin inzwischen dabei angelangt, dass ich direkt den Beispielcode aus dem Wiki (Twi Slave mit AVR-GCC) übernommen habe und um eine Ausgabe auf einem Display erweitert habe. Der funzt jedoch auch nicht.
Pull Ups (4,7k) sind auch eingelötet.
Hier noch der Code vom Master (Habe mal nur den Lesezugriff getestet)
uint8_t byte1 = 100;
uint8_t byte2 = 43;
uint8_t byte3 = 44;
int main(void)
{
HintergrundBeleuchtungAn();
lcd_init(LCD_DISP_ON);
i2c_init(); // init I2C interface
_delay_ms(1500);
lcd_gotoxy(12,1);
lcd_puts("Read");
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
{
i2c_write(0x00); //Buffer Startadresse zum Auslesen
i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen
byte1= i2c_readAck(); // Bytes lesen...
byte2= i2c_readAck();
byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK
i2c_stop();
// Zugriff beenden
lcd_gotoxy(0,0);
lcd_puts("SUCCES");
char temp[4];
lcd_gotoxy(0,1);
lcd_puts(itoa(byte1, temp, 10));
lcd_gotoxy(4,1);
lcd_puts(itoa(byte2, temp ,10));
lcd_gotoxy(7,1);
lcd_puts(itoa(byte3, temp ,10));
}
else
{
lcd_gotoxy(0,1);
lcd_puts("ERROR"); /* Hier könnte eine Fehlermeldung ausgegeben werden... */
}
if ((byte1 != 100)||(byte2 != 43)||(byte3 != 44))
{
lcd_gotoxy(0,1);
lcd_puts("ERROR_");
/* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */
}
for(;;);
}
Und der Code des Slaves
init_twi_slave(SLAVE_ADRESSE);;
for(uint8_t i=0;i<i2c_buffer_size;i++)
{
i2cdata[i]=10+i * 3;
}
while(1)
{
for(uint8_t i=0;i<i2c_buffer_size;i++)
{
SetPercentage(i2cdata[i]);
_delay_ms(500);
}
}
SetPercentage ist eine Funktion die mir Werte zwischen 0 und 100 auf einer LED leiste ausgibt
Weiß jemand was ich falsch mache ?
ich versuche nun schon seit 2 Tagen die Kommunikation zwischen den beiden Controllern zum Laufen zu bringen und bin inzwischen dabei angelangt, dass ich direkt den Beispielcode aus dem Wiki (Twi Slave mit AVR-GCC) übernommen habe und um eine Ausgabe auf einem Display erweitert habe. Der funzt jedoch auch nicht.
Pull Ups (4,7k) sind auch eingelötet.
Hier noch der Code vom Master (Habe mal nur den Lesezugriff getestet)
uint8_t byte1 = 100;
uint8_t byte2 = 43;
uint8_t byte3 = 44;
int main(void)
{
HintergrundBeleuchtungAn();
lcd_init(LCD_DISP_ON);
i2c_init(); // init I2C interface
_delay_ms(1500);
lcd_gotoxy(12,1);
lcd_puts("Read");
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE))) //Slave bereit zum lesen?
{
i2c_write(0x00); //Buffer Startadresse zum Auslesen
i2c_rep_start(SLAVE_ADRESSE+I2C_READ); //Lesen beginnen
byte1= i2c_readAck(); // Bytes lesen...
byte2= i2c_readAck();
byte3= i2c_readNak(); // letztes Byte lesen, darum kein ACK
i2c_stop();
// Zugriff beenden
lcd_gotoxy(0,0);
lcd_puts("SUCCES");
char temp[4];
lcd_gotoxy(0,1);
lcd_puts(itoa(byte1, temp, 10));
lcd_gotoxy(4,1);
lcd_puts(itoa(byte2, temp ,10));
lcd_gotoxy(7,1);
lcd_puts(itoa(byte3, temp ,10));
}
else
{
lcd_gotoxy(0,1);
lcd_puts("ERROR"); /* Hier könnte eine Fehlermeldung ausgegeben werden... */
}
if ((byte1 != 100)||(byte2 != 43)||(byte3 != 44))
{
lcd_gotoxy(0,1);
lcd_puts("ERROR_");
/* Die Bytes wurden nicht korrekt übertragen und wieder gelesen! */
}
for(;;);
}
Und der Code des Slaves
init_twi_slave(SLAVE_ADRESSE);;
for(uint8_t i=0;i<i2c_buffer_size;i++)
{
i2cdata[i]=10+i * 3;
}
while(1)
{
for(uint8_t i=0;i<i2c_buffer_size;i++)
{
SetPercentage(i2cdata[i]);
_delay_ms(500);
}
}
SetPercentage ist eine Funktion die mir Werte zwischen 0 und 100 auf einer LED leiste ausgibt
Weiß jemand was ich falsch mache ?