-
Problem mit i2c (c)
Hallo,
Leider habe ich mal wieder ein Problem :(
Es geht darum, dass ich für meinen Roboter die Lichtsensor Werte über einen LCD ausgeben lassen will.
Dieses hängt an einem Atmega16, der eigentliche Controller(atmega32) hatte nicht mehr genügend pins frei.
Zum wollte ich wie im rn-wissen beschrieben den I2C benutzen und dann auf dem LCD statt übert uart ausgeben lassen.
Der Atmega32 hat von mir einen 8Mhz Quarz bekommen, den Atmega16 habe ich über die Fusebits auf den Internen RC-Oscillator 8Mhz gestellt.
Allerdings funktioniert das ganze nicht, das LCD zeigt immer nur den anfangs initialisierten Wert für i2cdata an.
Ideen?
-
Hallo,
elektrisch hast du alles richtig angeschlossen, oder? Also wichtig ist vor allem, dass beide Controller dieselbe Masse als Bezugspunkt haben.
Welchen Widerstandswert haben denn deine Pull-up-Widerstände, welche Geschwindigkeit (SCL Frequenz) hast du für den Bus gewählt?
Gut wär's wenn du noch wichtigsten Programmabschnitte zeigst, sonst fischt man zu lange im Trüben... ;)
Grüße, Bernhard
-
Ja, ich denke schon das ich alles richtig angeschlossen habe.
Die beider controller haben die selbe Spannungsversorgung, also auch Masse.
Als Pull-Up habe ich zwei 5,6 kOhm Widerstände gewählt.
Als Code für den Slave mit dem LCD habe ich:
Code:
#define SLAVE_ADRESSE 0x50
void lcd_puti( const int val )
{
lcd_clrscr();
char buffer[8];
lcd_puts( itoa(val, buffer, 10) );
}
int main(void)
{
init_twi_slave(SLAVE_ADRESSE);
for(uint8_t i=0;i<i2c_buffer_size;i++)
{
i2cdata[i]=10+i;
}
lcd_init(LCD_DISP_ON);
_delay_ms(500);
lcd_puti(i2cdata[5]);
}
natürlich mit includes;)
und als code für den master:
Code:
i2c_init();
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE)))
{
i2c_write(0x00);
i2c_write(30);
i2c_stop();
}
else
{
PORTB |= (1<<PB0);
}
Hier praktisch direkt von rn-wissen übernommen.
Für Testzwcke habe ich den Code noch nicht wirklich verändert.
Die LED an B0 geht immer an.
-
Hallo,
wenn ich das richtig nachvollzogen habe, dann wird hier:
Code:
i2c_init();
if(!(i2c_start(SLAVE_ADRESSE+I2C_WRITE)))
{
i2c_write(0x00);
i2c_write(30);
i2c_stop();
nur das "nullte" Byte des Arrays auf 30 gesetzt.
Du liest aber mit
Code:
lcd_puti(i2cdata[5]);
das 5. Byte aus, welches ja nicht vom Master verändert wurde.
Könnte das vielleicht die Ursache sein? ;)
Grüße,
Bernhard
-
Nein, ich hatte das ganze auch schon mit 0 getestet.
Der Wert stimmt auch dann nicht. Außerdem leuchtet ja die LED, was anzeigt, dass der Master gar nicht schreiben konnte.