BMP085 Problem mit Codevision

Gast #3147244
Lesenswert?

Hallo,
ich wende mich an alle, die wie ich mit Codevision programmieren.
Ich habe das Problem, dass ich schon zu Beginn nicht mal die Calibration
Werte des BMP085 über I2C auslesen kann.
Die Read-Routine habe ich aus der Hilfe Datei von Codevision (Beispiel 
Lesen EEPROM-Daten) übernomen.
Resultat: Ich habe u.a. mit dieser Routine die Werte aus einem Pollin 
Kompassmodul (HDMM01) problemlos lesen können. Nach den 
Berechnungsvorgaben wird dann tatsächlich aus den ausgelesenen Daten der 
richtige Winkelwert ausgegeben.
Das Problem ist die I2c-Übertragung: Auf den Oszilloskop ist deutlich zu 
sehen, dass die Geräteadresse (0xEE), die (BMP085-EEPROM-) Adresse 
(0xAA) und dann die Geräteadresse mit gesetztem Read-Bit (0xEF) 
übertragen wird. Dann ist die Datenleitung aber bis zum Ende auf H- 
(3,3V) Signal.
Die Anschlüsse sind richtig, als Spannung verwende ich 3,3V, Pull-up 
Widerstände sind natürlich vorhanden.
Ist das I2C-Protokoll anders auszulegen ?

Für einen Tipp wäre ich echt dankbar!
Gast #3147368
Lesenswert?

#define BMP085_ADDRESS 0xEE     // Device Address

// Declare your global variables here

//****************************************************
//**** Write one byte to BMP085 **********************
//****************************************************
void m_write(char address, char data)
 {
 i2c_start();                   // start xmission
 i2c_write (0xEE);              // send module address
 i2c_write (address);           // send address
 i2c_write (data);              // send data
 i2c_stop();                    // stop xmission
 }

//****************************************************
//**** Read one byte from BMP085 *********************
//****************************************************
char  m_read(char address)
 {
 char data;
 i2c_start();                   // start xmission
 i2c_write (0xEE);              // send module address
 i2c_write (address);           // send address
 i2c_start();
 i2c_write (0xEF);              // send bit0 set to one,
                                // that means a read cycle
                                // from BMP085 should be
                                // initiated
 //*******************************************************
 //** Note: the 0 in i2c_read (0) means, that the master
 // ends communication by not sending "Acknowledge" !!!!
 //*******************************************************
 data=i2c_read(0);              // read data from BMP085
 i2c_stop();                    // stop xmission
 return data;
 }
// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Port A initialization
PORTA=0x00;
DDRA=0xFF;
// Port B initialization
// PB0: SCL
// PB1: SDA
PORTB=0x00;
DDRB=0xFD;
// Port C initialization
PORTC=0x00;
DDRC=0xFF;
// Port D initialization
PORTD=0x00;
DDRD=0xFF;
// I2C Bus initialization
// I2C Port: PORTB
// I2C SDA bit: 1
// I2C SCL bit: 0
// Bit Rate: 100 kHz
i2c_init();
  delay_ms(2000);
while (1)
  {
  // Place your code here
  // Read calibration values
  msb=m_read(0xAA);     // read AC1-HB value from BMP085
  PORTD=msb;


  delay_ms(50);
  } // end of while(1)

}

Hallo,

ich habe hier den markanten Teil aufgeführt.
Zuerst habe ich versucht, alle Bytes von Adresse 0xAA bis 0xBF in einem 
Rutsch auszulesen.
Hier wird nur noch die Adresse 0xAA ausgelesen und an PortD sichtbar 
gemacht. Bei PortD leuchten alle Bits, weil die SDA-Leitung in der 
entsprechenden Zeit H-Signal führt. Die delays sind neu dazu, damit man 
auf dem Oszilloskop die beiden Signal gut verfolgen kann.
Schaltplan habe ich nicht. Ich kann nur sagen, dass ich die 
BMP085-Platine vorschriftsmässig nach Bosch angeschlossen habe. Sauberer 
Aufbau, wie es sich für einen Elektroniker mit fast 40 Jahren 
Berufserfahrung auch gehört. Will damit sagen, dass Lötstellen usw. 
schon ok sind, ich glaube nicht an ein Hardwareproblem.
Auch so, wie oben angegeben: SDA an PortB-Bit1, SCL an PortB-Bit0, GND 
und VDDD=3,3V. Die Signale sind 3,3V hoch, dies sollte als H-Signal für 
den ATMEGA32 ausreichen (schon probiert).
Das Ding ist neu, an einem ESD-Arbeitsplatz wird der Sensor verwendet.

Irgendeinen guten Gedanken, oder ist, was ich langsam glaube, der Sensor 
defekt geliefert worden?

Wolfgang
#3147439
Lesenswert?

Schickt der Sensor nur ein Byte als Antwort zurück?

Habe bei Sparkfun folgende Funktion gefunden...
Da kriegt er MSB und LSB... Aber ich weiß es nicht.
Kenne den Sensor nicht
1
// bmp085ReadShort will read two sequential 8-bit registers, and return a 16-bit value
2
// the MSB register is read first
3
// Input: First register to read
4
// Output: 16-bit value of (first register value << 8) | (sequential register value)
5
short bmp085ReadShort(unsigned char address)
6
{
7
  char msb, lsb;
8
  short data;
9
  
10
  i2cSendStart();
11
  i2cWaitForComplete();
12
  
13
  i2cSendByte(BMP085_W);  // write 0xEE
14
  i2cWaitForComplete();
15
  
16
  i2cSendByte(address);  // write register address
17
  i2cWaitForComplete();
18
  
19
  i2cSendStart();
20
  
21
  i2cSendByte(BMP085_R);  // write 0xEF
22
  i2cWaitForComplete();
23
  
24
  i2cReceiveByte(TRUE);
25
  i2cWaitForComplete();
26
  msb = i2cGetReceivedByte();  // Get MSB result
27
  i2cWaitForComplete();
28
  
29
  i2cReceiveByte(FALSE);
30
  i2cWaitForComplete();
31
  lsb = i2cGetReceivedByte();  // Get LSB result
32
  i2cWaitForComplete();
33
  
34
  i2cSendStop();
35
  
36
  data = msb << 8;
37
  data |= lsb;
38
  
39
  return data;
40
}
Gast #3147455
Lesenswert?

Hallo,

ja, ich kenne auch dieses Programm.

Das Datenblatt von Bosch sagt, dass keines der 11 16bit-Wörter den 
Zustand 0x0000 oder 0xFFFF hat. Wenn ich beide Bytes (0xAA=HighByte und 
0xAB das dazugehörige LowByte) auslese, sind beide zusammen 0xFFFF. Und 
das soll es nie geben.
Ich habe jetzt soviel versucht, dass ich fest davon ausgehe, dass der 
Sensor nicht antwortet.
Hardware ist ok (zum 1000. mal untersucht, auf alles mögliche).
Meiner Meinung nach kann es nur an der Software liegen. Wenn mein 
Programm stimmt und niemand daran etwas findet, muss der Sensor defekt 
sein.
Nur, der ist neu!

Wolfgang
Gast #3147473
Lesenswert?

Hallo,

das Programm von Sparkfun läuft ja so nicht auf dem ATMEGA mit 
Codevision.

Aber wenn man das Programm genau unter die Lupe nimmt und dann Zeile für 
Zeile umschreibt, dann kommt das Gleiche heraus wie in meinem Beispiel.
Ich habe dieses Beispiel (sparkfun) heute morgen schon versucht, ohne 
Erfolg !

Es gibt ja auch noch andere Beispiele. Aber auch die sind im Prinzip 
gleich.

Wolfgang
Gast #3147511
Lesenswert?

Hallo,

ja, ich habe es auch mit delays versucht, obwohl die Geschwindigkeit ja 
nicht hoch ist.
Ich hatte schon deshalb viele delays verwendet, um auf dem Oszilloskop 
die
verschiedenen Bytes ausfindig zu machen.

Diese conversion time ist m.E. nicht relevant, da hier feste 
(Konstanten) Werte aus dem internen EEPROM ausgelesen werden. Die sind 
bauteilspezifisch und werden später für die Berechnung benötigt. Diese 
Werte werden nie verändert.

Wolfgang
Gast #3221403
Lesenswert?

Hi
Just today I started using codevision for reading calibration values of 
BMP085 and I had similar problem.(only zero as output)

I tried your code.
After programing i disconnected the programer and also the main power of 
the mainbord (this will reset the BMP085 module)and I've got following 
calibration coeficient:
0xAA, 0xAB, 0xAC, oxAD : 36, 95, 250, 123

I will continue the project and will see are they correct.

Navid

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren