Eines vorab: Kann bitte ein Forenadmin diesen Thread löschen? Ich weis nicht was ich da falsch gemacht habe, aber ich kann dort nichts reinschreiben und weg bekomm ich ihn auch nicht.
Danke schonmal im voraus.
Schade, nachdem ich dachte ich habe nun alle Werkzeuge an der Hand um eigenständig mit dem I2C Bus umzugehen, wurde ich nun eines besseren belehrt.
Zielstellung war es Temperatur und Druck aus einem BMP180 zu lesen.
Das lesen der Messwerte war kein Problem aber das Auslesen der Callibrationdata.
Diese sind bei jedem BMP anders und sind im EEPROM des BMP in den Adressen 0xAA-0xBF gespeichert und müssen bei Programmstart einmal abgefragt werden.
Nach anfänglichen Schwierigkeiten habe ich geschafft einen Code zusammenzubasteln der die Callibrationdata aus dem BMP180 rauszieht.... zumindest so fast.
Das ist erstmal der Code der die Calibrationdata aus dem BMP zeihen soll
///////////////////
//GetBMP Function//
///////////////////
void GetBMP (
short *BMP_AC1=0,
short *BMP_AC2=0,
short *BMP_AC3=0,
short *BMP_B1=0,
short *BMP_B2=0,
short *BMP_MB=0,
short *BMP_MC=0,
short *BMP_MD=0,
unsigned short *BMP_AC4=0,
unsigned short *BMP_AC5=0,
unsigned short *BMP_AC6=0){
short MSB=0;
short LSB=0;
short result=0;
TWBR = (1<<TWBR7) | (1<<TWBR4) ; //Set SCL Clock Speed
TWSR = 0b00000000; //Set prescaler
for(int a=0xAA;a<=0xBF;a++){
Serial.println(a,HEX);
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //Send StartCondition
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWDR = 0xEE; //Send Slave Adress +Write(0)
TWCR = (1<<TWINT) | (1<<TWEN); //Set TWINT 1
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWDR = a; //Send per calib data Adress
//Serial.println(i,HEX);
TWCR = (1<<TWINT) | (1<<TWEN); //Set TWINT 1
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //Send New Start Condition
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWDR = 0xEF; //Send Slave Adress +Read(1)
TWCR = (1<<TWINT) | (1<<TWEA)| (1<<TWEN); //Set TWINT 1
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
for(int i=0;i<=1;i++){
if(i!=(1))
{ TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN) ; //Send ACK
while (!(TWCR & (1 << TWINT)));
} //Wait for per ACK
else
{ TWCR = (1<<TWINT) | (1<<TWEN) ; //Send NACK
while (!(TWCR & (1 << TWINT))); } //Wait for per ACK
result=0;
if(i==0){MSB=0;MSB=TWDR;Serial.print("IF: <<");Serial.print(a,HEX);Serial.print(">> ");Serial.print("MSB");Serial.print(" ");Serial.println(MSB,BIN);
}
else{LSB=0;LSB=TWDR;Serial.print("ELSE: <<");Serial.print(a+i,HEX);Serial.print(">> ");Serial.print("LSB");Serial.print(" ");Serial.println(LSB,BIN);
result=MSB<<8;
result=result+LSB;
Serial.print("RESULT: <<");Serial.print(" ");Serial.print(">> ");Serial.print(result,BIN);Serial.print(" ");Serial.print(result);Serial.print(" ");
switch(a){
case 0xAA : *BMP_AC1 = result;Serial.println("AC1");break;
case 0xAC : *BMP_AC2 = result;Serial.println("AC2"); break;
case 0xAE : *BMP_AC3 = result;Serial.println("AC3"); break;
case 0xB0 : *BMP_AC4 = result;Serial.println("AC4"); break;
case 0xB2 : *BMP_AC5 = result;Serial.println("AC5"); break;
case 0xB4 : *BMP_AC6 = result;Serial.println("AC6"); break;
case 0xB6 : *BMP_B1 = result;Serial.println("B1"); break;
case 0xB8 : *BMP_B2 = result;Serial.println("B2"); break;
case 0xBA : *BMP_MB = result;Serial.println("MB"); break;
case 0xBC : *BMP_MC = result;Serial.println("MC"); break;
case 0xBE : *BMP_MD = result;Serial.println("MD"); break;
default :Serial.println("default"); break;
}//iswitch
}//if i odd
}//for i
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN); //Send Stop Condition
a++;}//for a
}//GetBMP
Das ergebnis ist dieses
AA
IF: <<AA>> MSB 11001
ELSE: <<AB>> LSB 11110111
RESULT: << >> 1100111110111 6647 AC1
AC
IF: <<AC>> MSB 11111011
ELSE: <<AD>> LSB 1101011
RESULT: << >> 11111111111111111111101101101011 -1173 AC2
AE
IF: <<AE>> MSB 11000111
ELSE: <<AF>> LSB 10101110
RESULT: << >> 11111111111111111100011110101110 -14418 AC3
B0
IF: <<B0>> MSB 10000001
ELSE: <<B1>> LSB 11010010
RESULT: << >> 11111111111111111000000111010010 -32302 0010
Coment:in der Nächten Zeile müsste eigentlich wieder die Adresse gefolgt von einem if kommen. Statt dessen schreibt er irgendwelchen kryptischen Mist der so im Code nicht vorkommt.
RESULT: <���>> MSB 11111111111111111000000111111111
B2
IF: <<B2>> MSB 1100011
ELSE: <<B3>> LSB 1001000
RESULT: << >> 110001101001000 25416 <<B3>> LSB �c�>> MSB 110001111111111
B4
IF: <<B4>> MSB 1010001
ELSE: <<B5>> LSB 10010101
RESULT: << >> 101000110010101 20885 <<B5>> LSB 1�Q�>> MSB 101000111111111
B6
IF: <<B6>> MSB 11001
ELSE: <<B7>> LSB 1110011
RESULT: << >> 1100101110011 6515 B1
B8
IF: <<B8>> MSB 0
ELSE: <<B9>> LSB 101110
RESULT: << >> 101110 46 B2
BA
IF: <<BA>> MSB 10000000
ELSE: <<BB>> LSB 0
RESULT: << >> 11111111111111111000000000000000 -32768 MB
BC
IF: <<BC>> MSB 11010001
ELSE: <<BD>> LSB 11110110
RESULT: << >> 11111111111111111101000111110110 -11786 MC
BE
IF: <<BE>> MSB 1010
ELSE: <<BF>> LSB 111
RESULT: << >> 101000000111 2567 MD
Ich weis nur nicht warum.
Ich habe auch den BMP schonmal getauscht aber das Ergebnis war gleich.
Neben den kryptischen Werten verwirrt mich auch ein wenig das hier
RESULT: << >> 11111111111111111100011110101110 -14418 AC3
Die Zahl scheint zu stimmen aber AC3 ist ein short und ein short sind doch nur 16 bit + Vorzeichenbit oder?
also sollte die zahl maximal
1 11000111 10101110
sein statt
11111111 11111111 11000111 10101110
oder versteh ich da was falsch?
nochmal zum Abgleich der gesamte Code
short pres =0;
short temp =0;
short BMP_AC1=0;
short BMP_AC2=0;
short BMP_AC3=0;
short BMP_B1=0;
short BMP_B2=0;
short BMP_MB=0;
short BMP_MC=0;
short BMP_MD=0;
unsigned short BMP_AC4=0;
unsigned short BMP_AC5=0;
unsigned short BMP_AC6=0;
////////////////////
//ReadBMP Function//
////////////////////
void ReadBMP(short*temp,short*pres){
short MSB=0;
short LSB=0;
short result=0;
///////////////////////////////
//Get uncompensed temperature//
///////////////////////////////
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //Send StartCondition
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWDR = 0xEE; //Send Slave Adress +Write(0)
TWCR = (1<<TWINT) | (1<<TWEN); //Set TWINT 1
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWDR = 0xF4; //Send per Control Register Adress
TWCR = (1<<TWINT) | (1<<TWEN); //Set TWINT 1
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWDR = 0x2E; //Send per Control Setting
TWCR = (1<<TWINT) | (1<<TWEN); //Set TWINT 1
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //Send New Start Condition
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWDR = 0xEF; //Send Slave Adress +Read(1)
TWCR = (1<<TWINT) | (1<<TWEA)| (1<<TWEN); //Set TWINT 1
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
for(int i=0;i<2;i++){
if(i!=(2))
{ TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN) ; //Send ACK
while (!(TWCR & (1 << TWINT))); } //Wait for per ACK
else
{ TWCR = (1<<TWINT) | (1<<TWEN) ; //Send NACK
while (!(TWCR & (1 << TWINT))); } //Wait for per ACK
switch(i){
case 0 : MSB = TWDR; break;
case 1 : LSB = TWDR; break;
}
}//for
result=MSB<<8;
result=result+LSB;
Serial.print(" result: "); Serial.println(result);
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN); //Send Stop Condition
};//ReadBMP
///////////////////
//GetBMP Function//
///////////////////
void GetBMP (
short *BMP_AC1=0,
short *BMP_AC2=0,
short *BMP_AC3=0,
short *BMP_B1=0,
short *BMP_B2=0,
short *BMP_MB=0,
short *BMP_MC=0,
short *BMP_MD=0,
unsigned short *BMP_AC4=0,
unsigned short *BMP_AC5=0,
unsigned short *BMP_AC6=0){
short MSB=0;
short LSB=0;
short result=0;
TWBR = (1<<TWBR7) | (1<<TWBR4) ; //Set SCL Clock Speed
TWSR = 0b00000000; //Set prescaler
for(int a=0xAA;a<=0xBF;a++){
Serial.println(a,HEX);
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //Send StartCondition
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWDR = 0xEE; //Send Slave Adress +Write(0)
TWCR = (1<<TWINT) | (1<<TWEN); //Set TWINT 1
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWDR = a; //Send per calib data Adress
//Serial.println(i,HEX);
TWCR = (1<<TWINT) | (1<<TWEN); //Set TWINT 1
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN); //Send New Start Condition
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
TWDR = 0xEF; //Send Slave Adress +Read(1)
TWCR = (1<<TWINT) | (1<<TWEA)| (1<<TWEN); //Set TWINT 1
while (!(TWCR & (1 << TWINT))); //Wait for per ACK
for(int i=0;i<=1;i++){
if(i!=(1))
{ TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN) ; //Send ACK
while (!(TWCR & (1 << TWINT)));
} //Wait for per ACK
else
{ TWCR = (1<<TWINT) | (1<<TWEN) ; //Send NACK
while (!(TWCR & (1 << TWINT))); } //Wait for per ACK
result=0;
if(i==0){MSB=0;MSB=TWDR;Serial.print("IF: <<");Serial.print(a,HEX);Serial.print(">> ");Serial.print("MSB");Serial.print(" ");Serial.println(MSB,BIN);
}
else{LSB=0;LSB=TWDR;Serial.print("ELSE: <<");Serial.print(a+i,HEX);Serial.print(">> ");Serial.print("LSB");Serial.print(" ");Serial.println(LSB,BIN);
result=MSB<<8;
result=result+LSB;
Serial.print("RESULT: <<");Serial.print(" ");Serial.print(">> ");Serial.print(result,BIN);Serial.print(" ");Serial.print(result);Serial.print(" ");
switch(a){
case 0xAA : *BMP_AC1 = result;Serial.println("AC1");break;
case 0xAC : *BMP_AC2 = result;Serial.println("AC2"); break;
case 0xAE : *BMP_AC3 = result;Serial.println("AC3"); break;
case 0xB0 : *BMP_AC4 = result;Serial.println("AC4"); break;
case 0xB2 : *BMP_AC5 = result;Serial.println("AC5"); break;
case 0xB4 : *BMP_AC6 = result;Serial.println("AC6"); break;
case 0xB6 : *BMP_B1 = result;Serial.println("B1"); break;
case 0xB8 : *BMP_B2 = result;Serial.println("B2"); break;
case 0xBA : *BMP_MB = result;Serial.println("MB"); break;
case 0xBC : *BMP_MC = result;Serial.println("MC"); break;
case 0xBE : *BMP_MD = result;Serial.println("MD"); break;
default :Serial.println("default"); break;
}//iswitch
}//if i odd
}//for i
TWCR = (1<<TWINT) | (1<<TWSTO) | (1<<TWEN); //Send Stop Condition
a++;}//for a
}//GetBMP
void setup() {
Serial.begin(9600);
Serial.println(" ");
GetBMP(&BMP_AC1,&BMP_AC2,&BMP_AC3,&BMP_B1,&BMP_B2,&BMP_MB,&BMP_MC,&BMP_MD,BMP_AC4,BMP_AC5,BMP_AC6);
}
void loop() {
ReadBMP(&temp,&pres);
Serial.println(BMP_AC1,BIN);
Serial.println(BMP_AC2,BIN);
Serial.println(BMP_AC3,BIN);
Serial.println(BMP_AC4,BIN);
Serial.println(BMP_AC5,BIN);
Serial.println(BMP_AC6,BIN);
Serial.println(BMP_B1,BIN);
Serial.println(BMP_B2,BIN);
Serial.println(BMP_MB,BIN);
Serial.println(BMP_MC,BIN);
Serial.println(BMP_MD,BIN);
}
//////////////////////////////
//Only for Arduino IDE Debug//
//////////////////////////////
void output(const byte value, const char *suffix)
{
if (value < 10) {Serial.print('0');}
Serial.print(value);
Serial.print(suffix);
}
Anbei mal noch das Datenblat vom BMP
BMP180 Datasheet by SparkFun Electronics _ Digi-Key Electronics.zip (159.1 KB)

