ja, die Addresse wird in TWAR gesetzt
hier eine init-Methode:
Code:
void TWI_init(uchar ownaddr)
{
TWAR = ownaddr;
TWCR = 0x45;
TWSR &= 0xFC;
TWBR = 0xA;
}
dann eine zum starten:
Code:
uchar TWI_start(uchar ndevaddr)
{
uchar errcounter;
errcounter = 0;
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); {
if(errcounter==10) {
errcounter = 0;
return 1;
}
errcounter++;
}
TWDR = ndevaddr;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
for(unsigned char i = 0; i < 20; i++)
asm("nop");
if( !((TWSR & 0xf8) == 0x18 ) ) {
return 1;
}
return 0;
}
zum senden:
Code:
void TWI_sendbyte(uchar nbyte)
{
TWDR = nbyte;
TWCR = (1<<TWINT) | (1<<TWEN);
while(!(TWCR & (1<<TWINT)));
}
und schließlich zum stoppen:
Code:
void TWI_stop(void)
{
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN);
for(unsigned char i = 0; i < 40; i++)
asm("nop");
TWCR |= 0x45;
for(unsigned char i = 0; i < 40; i++)
asm("nop");
}
ob meine ganzen nops wirklich nötig sind, hab ich noch nicht ausprobiert, schaden wirds aber nicht
Lesezeichen