Guten abend,

bin mal wieder am verzweifeln.

Also... Ich versuche einen BMA020 über TWI zu konfigurieren und auszulesen.

Nun bin ich hergegangen und habe folgenden C-code gebastelt:
Code:
/*
 * BMA020.c
 *
 * Created: 26.01.2014 14:28:04
 *  Author: Jimmy
 */ 


#include <avr/io.h>
#include <avr/delay.h>
#include <util/twi.h>

int main(void)
{
    
    // Portrichtung
    DDRD=0xFF;
    DDRC &= ~((1<<PC5) | (1<<PC4));
    PORTC|=(1<<PC5) | (1<<PC4);
    _delay_ms(1000);
    DDRB=0xFF;
    
    // TWI Initialisieren
    TWBR=32;
    TWSR=0;
    
    TWCR|=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);    // TWI starten
    while (!(TWCR & (1<<TWINT)));
    
        
    TWDR=0x70;    // Adresse laden (schreiben)
    TWCR|=(1<<TWINT)|(1<<TWEN);    // Adresse senden
    while(!(TWCR&(1<<TWINT)));
    PORTD=TWSR;
    
    TWDR=0x14;    // Zielregister laden
    TWCR|=(1<<TWINT)|(1<<TWEN);    // Zielreigster ansprechen
    while(!(TWCR&(1<<TWINT)));
    
    
    TWDR|=(1<<0);    // Inhalt fürs Register 0x14h laden
    TWCR|=(1<<TWINT)|(1<<TWEN);    // Inhalt senden
    while(!(TWCR&(1<<TWINT)));
    
    TWCR|=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);    // TWI beenden
    while(!(TWCR&(1<<TWINT)));
    
    while(1)
    {
        _delay_ms(1000);
        PORTB|=(1<<PB7);
        _delay_ms(1000);
        PORTB&=~(1<<PB7);
    }
}
ähm ja...
jetzt zu meinem Problemm. Ich verstehe nicht was der TWI da macht, bzw. warum er was falsches macht.

Laut Datenblatt des BMA020 soll das Protokoll zum Konfigurieren so aussehen:

TWI starten ---> BMA020-Schreib adresse --> welches Register --> Daten fürs Register --- > TWI Ende

Jetzt habe ich mit PORTD=TWSR; mir den Status auf eine LED-Anzeige legen lassen.
Dabei stelle ich folgendes fest:

Code:
  TWCR|=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);    // TWI starten
    while (!(TWCR & (1<<TWINT)));
Status nach dem Starten des TWI: 08h

Code:
 TWDR=0x70;    // Adresse laden (schreiben)
    TWCR|=(1<<TWINT)|(1<<TWEN);    // Adresse senden
    while(!(TWCR&(1<<TWINT)));
    PORTD=TWSR;
Status nach Senden der Adresse: 18h

Code:
TWDR=0x14;    // Zielregister laden
    TWCR|=(1<<TWINT)|(1<<TWEN);    // Zielreigster ansprechen
    while(!(TWCR&(1<<TWINT)));
Status nach Senden des Zielregister: 10h (hier müsste aber 28h stehen)

Laut Datenblatt vom ATmega8 sind die 08h und 18h dort wo sie sind richtig.

Warum sendet der Controller nicht den Inhalt von TWDR wie gefordert, sondern wiederholt den Start des TWI?