Jimmybot
26.01.2014, 20:40
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:
/*
* 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:
TWCR|=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // TWI starten
while (!(TWCR & (1<<TWINT)));
Status nach dem Starten des TWI: 08h
TWDR=0x70; // Adresse laden (schreiben)
TWCR|=(1<<TWINT)|(1<<TWEN); // Adresse senden
while(!(TWCR&(1<<TWINT)));
PORTD=TWSR;
Status nach Senden der Adresse: 18h
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?
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:
/*
* 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:
TWCR|=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN); // TWI starten
while (!(TWCR & (1<<TWINT)));
Status nach dem Starten des TWI: 08h
TWDR=0x70; // Adresse laden (schreiben)
TWCR|=(1<<TWINT)|(1<<TWEN); // Adresse senden
while(!(TWCR&(1<<TWINT)));
PORTD=TWSR;
Status nach Senden der Adresse: 18h
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?