Forum: Mikrocontroller und Digitale Elektronik I2C Problem beim Auslesen eines BMA020


von Felix H. (oteph)


Lesenswert?

Ich versuche gerade einen BMA020 über den I2C Bus anzusprechen.
Habe bisher alles ohne Interrupts Programmiert da ich einfach nur testen 
möchte.

Nun habe ich folgendes Problem:

Zunächst stelle ich den Presacler und die Bitrate ein:

[takt ist mit dem internen oszilator auf 8Mhz eingestellt, da ich keinen 
Passenden Quarz da habe ...]

[verwendeter Controller: atmega8-16PU]
1
#define bitRate 0x08
2
3
.
4
.
5
.
6
7
void init_TWI(void)
8
{
9
  //set bit rate
10
  TWBR = bitRate;
11
  //set prescaler
12
  TWSR |= (1 << TWPS1);
13
  TWSR &= ~(0 << TWPS1);
14
  //enable interrupts
15
  TWCR |= (1 << TWIE);
16
  
17
}

Dann sende ich den Startbefehl mit
1
 TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);

Nun muss ich ja auf das TWINT flag warten, um sicherzugehen dass der 
Start befehlt ausgegeben worden ist. Das mache ich mit:
1
  while (!(TWCR & (1<<TWINT)));
leider kommt diese Flag nie und das Programm bleibt an der Schleife 
hängen.


Jemand eine Idee woran das liegen könnte?


Noch eine frage:

Muss ich Pullups für die für SCL SDA PINS aktiviern, wenn ich keine 
externen verwende oder werden womöglich die durch TWEN = 1 sowieso 
eingeschaltet?


Und noch eine Frage:

wenn ich versuche die Target Spannung mit AVR studio auszulesen bekomme 
ich folgende fehlermeldung:
1
Timestamp:  2011-12-28 16:36:32.331
2
Severity:    WARNING
3
ComponentId:  23000
4
StatusCode:  0
5
6
Read voltage 0,0V is outside selected device's operating range: 2,7 V to 5,5 V.

am µC liegt aber sicher Spannung an. Habe aber unter Board setting noch 
nichts verstellt da ich keine Ahnung habe wie und wo die gespeichert 
werden und ich nicht womöglich Fuses falsch setzten möchte.

Ich verwende zum Programieren ein mySmartUSB light Stick.
Bei AVR Studio wird dieser als STK500 eingebunden.

Ich vermute ,dass die Boardsetting ,also auch die Target Spannung, 
normalerweise  beim STK500 Board eingestellt werden können, da ich das 
mit meinem stick jedoch nicht machen kann, kann ich auch nichts 
auslesen.
von holger (Gast)


Lesenswert?

>Habe bisher alles ohne Interrupts Programmiert

Dann ist die folgende Zeile falsch:

  //enable interrupts
  TWCR |= (1 << TWIE);
von Felix H. (oteph)


Lesenswert?

Habe die Interrupts nur aktiviert da ich sie später noch verwenden da 
ich das Programm später auf Interruptus umstellen möchte. Global wurden 
Interrupts nicht aktiviert.

Ich sollte doch die TWIE flag auch manuell auslesen können selbst wenn 
ich Interrupts aktiv habe. Oder wird die wieder auf 0 gesetzt wenn der 
Interrupt normalerweise ausgelöst worden wäre?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.