Chce użyć sprzętowego i2c w atmedze8. Znalazlem taka biblioteke na elektrodzie:
Chce odczytac dane z przetwornika A/C.
Domyslam sie ze trzeba to zrobic w ten sposob:
twi_start();
twi_rd();
pomiar1=TWDR;
twi_stop();
ale gdzie podac adres przetwornika? Prosze pomozcie bo siedze juz nad tym od 2 dni i mi nic nie wychodzi.
//*********************************************************
// WARUNEK STARTU LUB PONOWNEGO STARTU TWI
// funkcja zwroci 1 jezeli warunek startu lub ponownego startu nie zostal wystawiony
// funkcja zwroci 0 jezeli warunek startu lub ponownego startu
//*********************************************************
unsigned char twi_start(void)
{
TWCR |= 0b11100100; // wysylij warunek startu i ustaw TWEA
while (!(TWCR & 0b10000000)); // czekaj na TWRC.TWINT=1
TWCR &= 0b01011111; // TWCR.TWSTA=0
if (((TWSR & 0xF8) != 0x08) && ((TWSR & 0xF8) != 0x10))
{
return 1; // jezeli status != kod poprawnego startu to zwroc error
};
return 0; // zwroc kod !error
}
//*********************************************************
// WARUNEK SOPU TWI
//*********************************************************
void twi_stop(void)
{
TWCR |= 0b10010100; // ustaw bit stopu i twint
}
//*********************************************************
// ZAPIS BAJTU DANYCH NA TWI
// funkcja zwroci 1 jezeli slave nie wystawi ACK
// funkcja zwroci 0 jezeli slave wystawi ACK
//*********************************************************
unsigned char twi_wr(unsigned char data_byte)
{
TWDR = data_byte; // zaladuj TWDR danymi
TWCR |= 0b10000000; // wyzeruj flage TWCR.TWINT
while (!(TWCR & 0b10000000)); // czekaj na TWRC.TWINT=1 oznaczajacy wyslanie TWRD i odebranie ACK/!ACK
if (((TWSR & 0xF8) != 0x18) && ((TWSR & 0xF8) != 0x28) && ((TWSR & 0xF8) != 0x40))
{
return 1; // jezeli status != kod odebrania ACK to zwroc error
};
return 0; // zwroc kod !error
}
//*********************************************************
// ODCZYT BAJTU DANYCH Z TWI
// funkcja zwroci 1 jezeli afery
// funkcja zwroci bajt danych jezeli odbior poprawny
// jezeli ack=1 master reciver wystawi na szyne ack
// jezeli ack=0 master reciver wystawi na szyne no_ack
//*********************************************************
unsigned char twi_rd(unsigned char ack)
{
if (ack == 1)
{
TWCR |= 0b10000000; // wyzeruj flage TWCR.TWINT
}
else
{
TWCR &= 0b10111111; // wyzeruj flage TWCR.TWINT & TWCR.TWEA
};
while (!(TWCR & 0b10000000)); // czekaj na TWRC.TWINT=1 oznaczajacy odebranie TWRD i odebranie ACK/!ACK
if (((TWSR & 0xF8) != 0x50) && ((TWSR & 0xF8) != 0x58))
{
return 1; // jezeli status != kod poprawnego startu to zwroc error
};
return TWDR; // zwroc dane z i2c
} Chce odczytac dane z przetwornika A/C.
Domyslam sie ze trzeba to zrobic w ten sposob:
twi_start();
twi_rd();
pomiar1=TWDR;
twi_stop();
ale gdzie podac adres przetwornika? Prosze pomozcie bo siedze juz nad tym od 2 dni i mi nic nie wychodzi.