Als Basisaddresse hat der LM75 90.
Was ist nun richtig ?
Warum benutzt Du nicht die util/twi.h damit geht das wunderbar Beispiel:
Code:
void read_data (uint8_t *buffer) {
uint8_t status,twcr,len;
/*Zuerst wird der MASTER in Transmitter Mode betrieben, um
1. Die SLAVE Adresse zu senden
2. UM den Adresspointer zu übergeben, ab den gelesen werden soll
Sende Start Condition */
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
/*Sende Slave Adresse (Hier DS1307 mit WRITE Bit */
TWDR = DS1307 | TW_WRITE;
TWCR = (1<<TWINT)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
/*Sende die zu lesende Adresse, als Adresspointer */
TWDR = 0x00;//Stelle den pointer auf adresse 0x00
TWCR = (1<<TWINT)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
/*Ab jetzt wird der Master im Reciver Mode versetzt, um die
Bytes zu empfangen
Es wirt die rep. START Condition gesendet*/
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
/*Sende Slave Adresse (Hier DS1307 mit READ Bit */
TWDR = DS1307 | TW_READ;
TWCR = (1<<TWINT)|(1<<TWEN);
while ((TWCR & (1<<TWINT)) == 0);
len = 0;
while (len < 8){
if (len == 6 ){
twcr = (1<<TWINT)|(1<<TWEN);
} else {
twcr = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
}
TWCR = twcr;
while ((TWCR & (1<<TWINT)) == 0);
switch (status = TW_STATUS){
case TW_MR_DATA_NACK:
len = 8;
case TW_MR_DATA_ACK:
*buffer++ = TWDR;
break;
}
len++;
}
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
Damit lese ich 8 Bytes aus dem RTC DS1307 in einem Rutsch aus und speichere in einem Array ab.
Um eventuelle Fehler zu Finden kann man nach jedem Schritt irgendwas über UART ausgeben, dann weißt Du an welcher Stelle es kracht.
Das Beispiel ist nicht Perfekt, Die Endlosschleifen sind nicht gut, aber zum Testen sehr gut.
Gruß Sebastian
Lesezeichen