IOW56 und Bosch BMP085

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

fstfrs11
Posts: 23
Joined: Mon Sep 27, 2010 11:31 am

IOW56 und Bosch BMP085

Post by fstfrs11 »

Hallo, ich habe folgendes Problem:
Ich möchte mit meinem IOW56 über I2C den Drucksensor Bosch BMP085 (http://www.bosch-sensortec.com/content/ ... 000-05.pdf) auslesen.
Zuerst muss man die Kalibrierdaten aus dem EEPROM auslesen. Die Datenregister sind AAh, ABh.....BFh.
Die Device Address des Sensors ist EEh (write) bzw. EFh (read);
Ich komm nun leider überhaupt nicht mit dem IOW klar. Was muss ich nun alles schreiben, damit ich lesen kann?
Hab bislang folgendes geschrieben:

int _tmain(int argc, _TCHAR* argv[])
{

IOWKIT_HANDLE ioHandle;
IOWKIT56_IO_REPORT report;
ULONG ret;


ioHandle = IowKitOpenDevice();

if (ioHandle != NULL)
{
printf("Device Open Successful\n"); //OPEN DEVICE
}
else
{
printf("Device Open Failed\n");
}

if(ioHandle != NULL)
{
//INITIALISIERUNG DES I2C:
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x01; // I2C Config
report.Bytes[0] = 0x01; // I2C enable
report.Bytes[1] = 0x02; // Speed: 50kHz
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);

//ADDRESS WRITE:
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x02; // Write Request
report.Bytes[0] = 0xC2; // binär: 1100 0011 Start, Stop und 3Bytes
report.Bytes[1] = 0xEE; //Adresse des BMP085: 1110 111 und 0 für WRITE
report.Bytes[2] = 0xAA; //1. Datenregister EEPROM
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
ret = IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);


//READ TRANSACTION
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x03;
report.Bytes[0] = 0x03;
IowKitWrite(ioHandle, IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT_SPECIAL_REPORT_SIZE);
ret = IowKitRead(ioHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT_SPECIAL_REPORT_SIZE);



}
Kann mir bitte jemand weiterhelfen?
Vielen Dank Euch!
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW56 und Bosch BMP085

Post by Christoph Jung »

Ich habe gerade für die Electronica ein Programm als Demo dazu geschrieben.

Hier die Routine, womit man alles ausliest und berechnet:

Code: Select all

int CMesse_DongleView::GetPressure(void)
{
	//Auslesen des BMP085 Digitam Pressure Sensor von Bosch
	/**
		Adresse 0xEE -> Schreiben
		Adresse 0xEF -> Lesen
	*/

	CString t;

	//Calib data
	short AC1, AC2, AC3;
	unsigned short AC4, AC5, AC6;
	short B1, B2, MB, MC, MD;


	//uncompressed temp
	//uncompressed pressure
	long UT, UP;
	short oss = 0;
		
	//
	long B6, X1, X2, X3, B3;
	unsigned long B4;
	long B5, B7, T, p;
	float hPa;
	long Pa;

	//Beispielwerte aus Datenblatt
	/*
	AC1 = 408;
	AC2 = -72;
	AC3 = -14383;
	AC4 = 32741;
	AC5 = 32757;
	AC6 = 23153;
	B1 = 6190;
	B2 = 4;
	MB = -32768;
	MC = -8711;
	MD = 2868;

	X1 = 4743;
	X2 = -2344;
	B5 = 2399;

	UT = 27898;
	UP = 23843;
	*/

	//Calibrierungsdaten auslesen

	IOWKIT_SPECIAL_REPORT io24rep;

	memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
	io24rep = ReadI2C(m_handles.psi, 0xEE, 0xAA, 6);

	AC1 = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2];
	AC2 = (io24rep.Bytes[3] << 8) | io24rep.Bytes[4];
	AC3 = (io24rep.Bytes[5] << 8) | io24rep.Bytes[6];


	memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
	io24rep = ReadI2C(m_handles.psi, 0xEE, 0xB0, 6);

	AC4 = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2];
	AC5 = (io24rep.Bytes[3] << 8) | io24rep.Bytes[4];
	AC6 = (io24rep.Bytes[5] << 8) | io24rep.Bytes[6];

	memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
	io24rep = ReadI2C(m_handles.psi, 0xEE, 0xB6, 4);

	B1 = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2];
	B2 = (io24rep.Bytes[3] << 8) | io24rep.Bytes[4];
	
	memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
	io24rep = ReadI2C(m_handles.psi, 0xEE, 0xBA, 6);

	MB = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2];
	MC = (io24rep.Bytes[3] << 8) | io24rep.Bytes[4];
	MD = (io24rep.Bytes[5] << 8) | io24rep.Bytes[6];

	//Messung vornehmen
	memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
	io24rep.ReportID = 0x02;
	io24rep.Bytes[0] = 0xC3;
	io24rep.Bytes[1] = 0xEE;
	io24rep.Bytes[2] = 0xF4;
	io24rep.Bytes[3] = 0x2E;

	IowKitWrite(m_handles.psi, IOW_PIPE_SPECIAL_MODE, (char*) &io24rep, IOWKIT_SPECIAL_REPORT_SIZE);
	IowKitRead(m_handles.psi, IOW_PIPE_SPECIAL_MODE, (char*) &io24rep, IOWKIT_SPECIAL_REPORT_SIZE);

	Sleep(5);

	memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
	io24rep = ReadI2C(m_handles.psi, 0xEE, 0xF6, 2);

	UT = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2];


	memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
	io24rep.ReportID = 0x02;
	io24rep.Bytes[0] = 0xC3;
	io24rep.Bytes[1] = 0xEE;
	io24rep.Bytes[2] = 0xF4;
	io24rep.Bytes[3] = 0x34 | (oss << 6);

	IowKitWrite(m_handles.psi, IOW_PIPE_SPECIAL_MODE, (char*) &io24rep, IOWKIT_SPECIAL_REPORT_SIZE);
	IowKitRead(m_handles.psi, IOW_PIPE_SPECIAL_MODE, (char*) &io24rep, IOWKIT_SPECIAL_REPORT_SIZE);

	Sleep(4);

	memset(&io24rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
	io24rep = ReadI2C(m_handles.psi, 0xEE, 0xF6, 3);

	//UP = ((io24rep.Bytes[1] << 16) | (io24rep.Bytes[2] << 8) | io24rep.Bytes[3]) >> (8-oss);
	UP = (io24rep.Bytes[1] << 8) | io24rep.Bytes[2] ;

	//Calc true temperature
	X1 = (UT - AC6) * (AC5 / pow(2.0,15));
	X2 = (MC * pow(2.0,11)) / (X1 + MD);
	B5 = X1 + X2;


	T = (B5 + 8) / pow(2.0,4);			//temp in 0.1°C

	float te;
	te = T / 10;


	TRACE(_T("---Config-Daten---\r\n"));
	t.Format(_T("%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n%d\r\n"), AC1, AC2, AC3, AC4, AC5, AC6, B1, B2, MB, MC, MD);
	TRACE(t);
	TRACE(_T("-----------\r\n"));
	
	X1 = 0;
	X2 = 0;
	B3 = 0;

	TRACE(_T("---Zwischenergebnis-Daten---\r\n"));

	//calc true pressure
	B6 = B5 - 4000;
	X1 = (B2 * (B6 * B6 / pow(2.0,12))) /  pow(2.0,11);
	X2 = AC2 * B6 / pow(2.0,11);
	X3 = X1 + X2;
	//B3 = ((AC1 * 4 + X3) << oss + 2) / 4;
	B3 = ((AC1 * 4 + X3)) / 4;

	t.Format(_T("B6 %d\r\nX1 %d\r\nX2 %d\r\nX3 %d\r\nB3 %d\r\n"),B6, X1, X2, X3, B3);
	TRACE(t);

	X1 = AC3 * B6 / pow(2.0,13);
	X2 = (B1 * (B6 * B6 / pow(2.0,12))) / pow(2.0,16);
	X3 = ((X1 + X2) + 2) / pow(2.0,2);
	B4 = AC4 * (unsigned long) (X3 + 32768) / pow(2.0,15);
	B7 = ( (unsigned long) UP - B3) * (50000 >> oss);
	if(B7 < 0x80000000)
		p = (B7 * 2) / B4;
	else
		p = (B7 / B4) * 2;

	t.Format(_T("X1 %d\r\nX2 %d\r\nX3 %d\r\nB4 %d\r\nB7 %d\r\np %d\r\n"), X1, X2, X3, B4, B7, p);
	TRACE(t);

	X1 = (p / pow(2.0,8)) * (p / pow(2.0,8));

	t.Format(_T("X1 %d\r\n"), X1);
	TRACE(t);

	X1 = (X1 * 3038) / pow(2.0,16);
	X2 = (-7357 * p) / pow(2.0,16);
	Pa = p + (X1 + X2 + 3791) / pow(2.0,4);

	t.Format(_T("X1 %d\r\nX2 %d\r\nPa %d\r\n"), X1, X2, Pa);
	TRACE(t);

	hPa = Pa / 100.0;

	float alt = 0.0;
	float n = 0.0;

	TRACE(_T("-----------\r\n"));

	n = pow( Pa/101325.0,0.190295);
	alt = 44330*(1.0-n);
	
	t.Format(_T("Temperatur:%.2f\r\n Pa:%d\r\n hPa:%.2f\r\n Alt:%.2f cm\r\n"), te, Pa, hPa, alt);
	TRACE(t);

	return 0;
}

Pa ist der Wert in Pascal. Einfach durch 100 Teilen und man hat HektoPascal (hPa).
alt ist die Höhe über Meeresspiegel. Achtung wenn man den Luftfruck mit der Zimmertemperatur berechnet, dann weicht der Wert vom Realen ab.

Die TRACE sind für die Debug-Ausgabe um alles zu kontrollieren.

Die Funktion "ReadI2C()";

Code: Select all

IOWKIT_SPECIAL_REPORT ReadI2C(HANDLE handle, UCHAR addr, UCHAR cmd, UCHAR count)
{
	IOWKIT_SPECIAL_REPORT rep;
	memset(&rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);

	rep.ReportID = 0x02;  //I2C write request
	rep.Bytes[0] = 0xC2;  //2 Bytes I2C start stopp
	rep.Bytes[1] = addr; //LEDW-Address write
	rep.Bytes[2] = cmd;   //command

	IowKitWrite(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT_SPECIAL_REPORT_SIZE);
	//swallow ACK report
	IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT_SPECIAL_REPORT_SIZE);


	memset(&rep, 0x00, IOWKIT_SPECIAL_REPORT_SIZE);
	rep.ReportID = 0x03;  //I2C read request
	rep.Bytes[0] = count;  //1 Bytes I2C start stopp
	rep.Bytes[1] = addr | 0x01; //LEDW-Address read
	
	IowKitWrite(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT_SPECIAL_REPORT_SIZE);
	//read answer containing command-value
	IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT_SPECIAL_REPORT_SIZE);

	return rep;
}
Ich hoffe das hilft weiter.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: IOW56 und Bosch BMP085

Post by Guido Körber »

Grundsätzlich sehe ich da erst mal drei Fehler:

Beim Write wird Stop mit angegeben, das ist nicht gut bei dieser Art Transaktion, Lesezugriffe mit vorherigem Senden eines Kommandos werden mit Repeated-Start gemacht, also ohne Stop nach dem Write.

Es werden 3 Bytes für den Write angegeben, aber nur zwei Bytes im Buffer gesetzt, was macht das dritte Byte?

Beim Read wird die Geräteadresse nicht angegeben.
fstfrs11
Posts: 23
Joined: Mon Sep 27, 2010 11:31 am

Re: IOW56 und Bosch BMP085

Post by fstfrs11 »

Vielen Dank für die Untersützung.

Bei dem obigen "Demo"-Programm: Woher kommt das Handle m_handles.psi?

Danke vielmals!
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW56 und Bosch BMP085

Post by Christoph Jung »

das ist das HANDLE (IOWKIT_HANDLE) welches ich als globale variable verwende.

Code: Select all

	typedef struct IOW_DEVICES
	{
		IOWKIT_HANDLE licht;
		IOWKIT_HANDLE psi;
		IOWKIT_HANDLE humi;

	} IOW_DEVICES;
ein einfaches

"IOWKIT_HANDLE m_handle;" reicht, wenn man nur einen IO-Warrion angeschlossen hat und verwendet.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
fstfrs11
Posts: 23
Joined: Mon Sep 27, 2010 11:31 am

Re: IOW56 und Bosch BMP085

Post by fstfrs11 »

ich habe nun das Programm ebenso umgesetzt wie das "Demo" Programm. Leider werden schon die Kalibrierdaten
nicht ausgelesen, da in den meisten ACs eine Null steht. Ich habe IOWKIT_HANDLE m_handle; global deklariert. Ihr Programm ist für den IOW24 gemacht, es muss aber genauso auch für den IOW56 funktionieren, oder? Zudem habe ich neuerdings das Problem, dass ich beinahe nach jedem Kompilieren den IOW neu aus-und anstecken muss, damit er geöffnet werden kann. Grüße
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW56 und Bosch BMP085

Post by Christoph Jung »

Für den IO-Warrior56 geleten andere Größen. Dort ist es nicht IOWKIT_SPECIAL_REPORT sonder IOWKIT56_SPECIAL_REPORT.
Das muss natürlich angepasst werden sonst kommt nichts oder nur Datenmüll raus.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
fstfrs11
Posts: 23
Joined: Mon Sep 27, 2010 11:31 am

Re: IOW56 und Bosch BMP085

Post by fstfrs11 »

Ich habe nun IOWKIT_SPECIAL_REPORT in IOWKIT56_SPECIAL_REPORT geändert und IOWKIT_SPECIAL_REPORT_SIZE in IOWKIT56_SPECIAL_REPORT_SIZE.
Leider ist immer noch ab Bytes[2] alles "0". Wenn man den IOW56 absteckt, dann steht immer noch überall das gleiche drin,
Hier mal der Code wie er aktuell ist:



#include "stdafx.h"
#include "stdlib.h"
#include "windows.h"
#include "iowkit.h"
#include "string.h"
#include "math.h"

IOWKIT_HANDLE m_handle;
IOWKIT56_SPECIAL_REPORT ReadI2C(HANDLE handle, UCHAR address, UCHAR cmd, UCHAR count) //READ ROUTINE
{
IOWKIT56_SPECIAL_REPORT rep;


memset(&rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
rep.ReportID = 0x02; //WRITE
rep.Bytes[0] = 0xC2; //Start-, Stopbit, 2 Bytes to transmit
rep.Bytes[1] = address; //address write
rep.Bytes[2] = cmd; //command

IowKitWrite(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE); //for ACK report


memset(&rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
rep.ReportID = 0x03; //READ
rep.Bytes[0] = count; // 1 Bytes, Start, Stop
rep.Bytes[1] = address | 0x01; // address read

IowKitWrite(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*) &rep, IOWKIT56_SPECIAL_REPORT_SIZE); //for ACK report


return rep;

}

int _tmain(int argc, _TCHAR* argv[])
{

IOWKIT_HANDLE ioHandle;
ioHandle = IowKitOpenDevice();

if (ioHandle != NULL)
{
printf("Device Open Successful\n"); //OPEN DEVICE
}
else
{
printf("Device Open Failed\n");
}







short AC1, AC2, AC3; //Calibration Data
unsigned short AC4, AC5, AC6;
short B1, B2, MB, MC, MD;


long UT, UP; //uncompensated Temperature/Pressure
short oss = 0; //Oversampling Setting

long B6, X1, X2, X3, B3;
unsigned long B4;
long B5, B7, T, p;
float hPa;
long Pa;


IOWKIT56_SPECIAL_REPORT iow56rep;

memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep.ReportID = 0x01; //config I2C
iow56rep.Bytes[0] = 0x01; // enable I2C
iow56rep.Bytes[1] = 0x02; //speed 50kHz
IowKitWrite(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);

//READ CALIBRATION DATA
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xAA, 6);


AC1 = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
AC2 = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
AC3 = (iow56rep.Bytes[5] << 8) | iow56rep.Bytes[6]; //Verknüpfen von MSB und LSB


memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xB0, 6);

AC4 = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
AC5 = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
AC6 = (iow56rep.Bytes[5] << 8) | iow56rep.Bytes[6]; //Verknüpfen von MSB und LSB


memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xB6, 4);

B1 = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
B2 = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB

memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xBA, 6);

MB = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB
MC = (iow56rep.Bytes[3] << 8) | iow56rep.Bytes[4]; //Verknüpfen von MSB und LSB
MD = (iow56rep.Bytes[5] << 8) | iow56rep.Bytes[6]; //Verknüpfen von MSB und LSB

//MEASUREMENT TEMPERATURE
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep.ReportID = 0x02; //WRITE
iow56rep.Bytes[0] = 0xC3; //Start, Stop, 3 Byte
iow56rep.Bytes[1] = 0xEE; //device address write
iow56rep.Bytes[2] = 0xF4; //register address 0xF4
iow56rep.Bytes[3] = 0x2E; // write 0x2E into register 0xF4

IowKitWrite(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);

Sleep(5); //wait until conversion is finished

memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xF6, 2);

UT = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2]; //Verknüpfen von MSB und LSB

//MEASUREMENT PRESSURE
memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep.ReportID = 0x02; //WRITE
iow56rep.Bytes[0] = 0xC3; //Start, Stop, 3 Byte
iow56rep.Bytes[1] = 0xEE; //device address write
iow56rep.Bytes[2] = 0xF4; //register address F4
iow56rep.Bytes[3] = 0x34 | (oss << 6); //write 0x34 into register 0xF4

IowKitWrite(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(m_handle, IOW_PIPE_SPECIAL_MODE, (char*) &iow56rep, IOWKIT56_SPECIAL_REPORT_SIZE);

Sleep(4);

memset(&iow56rep, 0x00, IOWKIT56_SPECIAL_REPORT_SIZE);
iow56rep = ReadI2C(m_handle, 0xEE, 0xF6, 3);

//UP = ((io24rep.Bytes[1] << 16) | (io24rep.Bytes[2] << 8) | io24rep.Bytes[3]) >> (8-oss);
UP = (iow56rep.Bytes[1] << 8) | iow56rep.Bytes[2] ;




IowKitCloseDevice(ioHandle);
system ("PAUSE");
return 0;
}


Bin leider absoluter Neuling mit dem Warrior....
Vielen Dank.
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: IOW56 und Bosch BMP085

Post by Guido Körber »

Haben Sie denn mal SimpleI2C verwendet um zu überprüfen ob der Sensor richtig antwortet? Damit ließe sich erst mal ausschließen, dass die Hardware ein Problem hat.
Thoene
Posts: 33
Joined: Sat Aug 29, 2009 8:13 pm

Re: IOW56 und Bosch BMP085

Post by Thoene »

Hallo mal probieren:
vor dem Lesen muss mit rep ID 03 noch mal geschrieben werden
Programm ausschnitt in Basic:

Code: Select all

'-------------------------- IOW56 I2C-Modus anwählen ------------------------------------------
     Daten(0) = 1 'I2C anwählen
     Daten(1) = 1 'I2C aktivieren
     Daten(2) = 1 'I2C Takt 400 KHz
     Daten(3)=0:Daten(4)=0:Daten(5)=0:Daten(6)=0:Daten(7)=0:Daten(8)=0
     Res = IowKitWrite(iowHandles(0), 1, Daten(0), 64)'
' ------------------------------------ Mess Start ----------------------------------------------
     Daten(0) = 2    '0000 0010  2  ReportID IIC write request
     Daten(1) = 194  '1100 0010  C2 2 bytes with IIC Start and Stop
     Daten(2) = adresse  '1101 0000  D0 Adress byte Schreiben voreingestellt
     Daten(3) = config  '1000 1100  8C Config byte  voreingestellt
     Res = IowKitWrite(iowHandles(0), 1, Daten(0), 64)'Nach IOW schreiben
     Res = IowKitRead(iowHandles(0), 1, Daten(0), 64)
' ------------------------------------- Daten Lesen --------------------------------------------
     Daten(0) = 3    '0000 0011  3  ReportID IIC write request
     Daten(1) = 196  '1100 0100  C4 4 bytes with IIC Start and Stop
     Daten(2) = adresse+1  '1101 0001  D1 Adress byte Lesen
     Daten(3) = config'1000 1100 8C Config byte voreingestellt: Gain=1, Wandlung=18Bit, Einzelmessung)
     Res = IowKitWrite(iowHandles(0), 1, Daten(0), 64)'Nach IOW schreiben
     Res = IowKitRead(iowHandles(0), 1, Daten(0), 64)
friend-of-rq
Posts: 389
Joined: Sun Feb 13, 2005 1:22 pm
Location: Gerblingerode / Duderstadt
Contact:

Re: IOW56 und Bosch BMP085

Post by friend-of-rq »

@Thoene
Ich möchte mit meinem IOW56 über I2C den Drucksensor Bosch BMP085 (http://www.bosch-sensortec.com/content/ ... 000-05.pdf) auslesen.
ich kann mich nur Herrn Guido Körber anschließen ...

schon mal das Test-Tool ALL-in-ONE verwendet ?

Gruss Ralf
fstfrs11
Posts: 23
Joined: Mon Sep 27, 2010 11:31 am

Re: IOW56 und Bosch BMP085

Post by fstfrs11 »

Mit SimpleI2C wird weder der Warrior noch der Sensor erkannt. Bei ALL-In-ONE schon. Ich habe dann folgendes geschrieben: AAh. Das ist die Register Adresse wo die Kalibrierdaten hinterlegt sind.
Ich habe dann auch Werte zurückbekommen. Aber wie würde ich mit diesem Tool denn z.B. den Wert 2E nach F4 schicken?

Grüße
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: IOW56 und Bosch BMP085

Post by Christoph Jung »

Das Simple I2C ist glaub ich nocht nicht für den IOW56 ausgelegt. Es war eigentlich nur für unsere Dongles als kleines "Starttool" geplant.
Das steht dann jetzt auf der Roadmap für die Anpassung. Leider wird das nichts vor dem 15.11. wegen der electronica.

Ansonsten kann ich auch nur das "All-In-One"-Tool empfehlen. Das ist zum Testen und auslesen gut geeignet, da schön einfach und verständlich.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Guido Körber
Site Admin
Posts: 2856
Joined: Tue Nov 25, 2003 10:25 pm
Location: Germany/Berlin
Contact:

Re: IOW56 und Bosch BMP085

Post by Guido Körber »

Zumal wir ja ein Dongle mit dem 56er zumindest im Labor schon haben...
fstfrs11
Posts: 23
Joined: Mon Sep 27, 2010 11:31 am

Re: IOW56 und Bosch BMP085

Post by fstfrs11 »

So, ich hab nun nochmal angefangen und nur mal versucht, 2 Byte aus dem EEPROM des Sensors zu lesen. Es passiert aber leider nichts. Ich weiß nicht was ich noch anders machen sollte.
Der Sensor hat die Device Address EE (write) und EF (read). Die Kalibrierdaten im EEPROM haben die Register Address AA, AB...
Folgendes hab ich nun geschrieben: Bereits den Tip von Guido Körber zwecks Repeated Start berücksichtigt: (ZUR INFO: ich habe den IO-Warrior 56)

#include "stdafx.h"
#include "windows.h"
#include "iowkit.h"



int _tmain(int argc, _TCHAR* argv[])
{

IOWKIT_HANDLE iowHandle;
iowHandle = IowKitOpenDevice();

if (iowHandle != NULL)
{
printf("Device Open Successful\n"); //OPEN DEVICE
}
else
{
printf("Device Open Failed\n");
}

IOWKIT56_SPECIAL_REPORT report;

memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x01; // Choose IIC-Mode
report.Bytes[0] = 0x01; // Enable IIC-Mode
report.Bytes[1] = 0x02; // IIC Speed 50kHz
IowKitWrite(iowHandle,IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT56_SPECIAL_REPORT_SIZE);


memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x02; // Write-Mode
report.Bytes[0] = 0x82; // Start OHNE Stop = 1, 2 Bytes will be sent
report.Bytes[1] = 0xEE; // Device-Address of bmp085 write
report.Bytes[2] = 0xAA; // calibrationdata register AAh
IowKitWrite(iowHandle,IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT56_SPECIAL_REPORT_SIZE);


memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
report.ReportID = 0x03; // Read-Mode
report.Bytes[0] = 0xC2; // Start & Stopbit = 1, 2 Bytes will be read //REPEATED START, da bei ReportID 2 das Stopbit nicht gesetzt.
report.Bytes[1] = 0xEF; // Device-Address of BMP085 read
IowKitWrite(iowHandle,IOW_PIPE_SPECIAL_MODE, (char *) &report, IOWKIT56_SPECIAL_REPORT_SIZE);
IowKitRead(iowHandle, IOW_PIPE_SPECIAL_MODE, (char*) &report, IOWKIT56_SPECIAL_REPORT_SIZE);

short AC1, AC2, AC3;

AC1 = ( report.Bytes[1] << 8 ) | report.Bytes[2];


IowKitCloseDevice(iowHandle);

return 0;
}

Das ist das Programm, aber leider bleibt report.Bytes[1.....] alles 0 :-(
Was mache ich falsch?

Viele Grüße
Post Reply