PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit i2c (c)



avrrobot
30.10.2011, 14:05
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 (http://rn-wissen.de/index.php/TWI_Slave_mit_avr-gcc) 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?

BMS
30.10.2011, 16:05
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

avrrobot
30.10.2011, 16:41
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:


#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:


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.

BMS
30.10.2011, 20:04
Hallo,
wenn ich das richtig nachvollzogen habe, dann wird hier:

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

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

avrrobot
31.10.2011, 08:33
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.