Guten Tag die Herren,
freut mich das ich nicht der einzige bin der hier Probleme hat oder hatte 
ALSO 
Zunächst ich programmiere mit C und steuere den Sensor über einen LPC 900 an, bzw LPC 935. . . . .....
Das macht es für mich nicht so einfach die Codes hier zu lesen und zu verstehen, aber denoch vill kann mir hier einen weiterhelfen.
Probiere seit längerem diesen Sensor auszulesen, wenn ich ihn über das ELV USB-I2C Interface Gerät auslese und einen Makro anwerfe dann passen die Werte 1a.
So bald ich mein selbst geschriebenes Programm komplett durch fahren lasse, dann kommen Werte die nicht stimmen bzw auch sehr stark schwanken!
ABER wenn ich dann im Singel Step mein Programm durch fahre, dann passen die Werte auch... denke es liegt dann an einer Delay Zeit die ich nicht einhalte!?!?!??
Weiß langsam nicht mehr so richtig weiter, vielleicht hat ja einer noch einer eine sinnvolle Idee hier scheinen mir genug kompetene Menschen zu sein.
Hat einer schon Erfahrung gemacht mit Interrupt??
Gruß
Code:
#include <REG935.H>
//--------------- Konstante für BMA020(werden aber nicht benutzt...)
const bma20_W = 0x70;
const bma20_R = 0x71;
//----------Programm....
void main ()
{
char xLSB02,xMSB03,xLSB04,xMSB05,xLSB06,xMSB07;
long int x,i;
char u = '-' ;
P1M1=0xFF; // Port Konfiguration
P1M2= 0x00;
P1M1 |= 0x0C; // SDA und SCL als Open-Drain
P1M2 |= 0x0C;
//EI2C = 1; // I2C Interrupt freigeben
//EA = 1; // allgemeine Interruptsperre aufheben
I2SCLH = 19; // 100khz
I2SCLL = 19;
// Auslesen des Beschleunigungssensors
do{
//
I2CON = 0x64; // Start, I²C Hardware wird aktiviert und als Master gesetzt
while (I2STAT != 0x08); // Warten auf Startbedingung
I2DAT = 0x70; // Schreibadresse wird dem Register I2Dat zugewiesen
I2CON = 0x44; //I2C Hardware aktiviert, ACK
while (I2STAT != 0x18); // SLA+ Wwurde gesendet, ACK wurde empfangen
I2DAT = 0x02; // Adresse von Register 02 wird I2Dat zugewiesen
I2CON = 0x44; //I2C Hardware aktiviert, ACK
while (I2STAT != 0x28); //Datenbyte wurde gesendet, ACK wurde empfangen
I2CON = 0x54; // Beenden
//--------------------Auslesen der Register 02-07
for (i=0; i<= 100 ; i++); // Delay Zeit wurde generiert...
I2CON = 0x64; //Start
while (!(I2STAT == 0x08 || I2STAT == 0x10));
I2DAT = 0x71; // Read Adresse...
I2CON = 0x44; //I2C Hardware aktiviert, ACK
while (I2STAT != 0x40); // SLA+R wurde gesendet, ACK wurde empfangen
I2CON = 0x44; //I2C Hardware aktiviert, ACK
while (I2STAT != 0x50); //Datenbyte wurde empfangen, mit ACk wurde geantwortet
xLSB02 = I2DAT;
I2CON = 0x44;
while (I2STAT != 0x50);
xMSB03 = I2DAT;
I2CON = 0x44;
while (I2STAT != 0x50);
xLSB04 = I2DAT;
I2CON = 0x44;
while (I2STAT != 0x50);
xMSB05= I2DAT;
I2CON = 0x44;
while (I2STAT != 0x50);
xLSB06 = I2DAT;
I2CON = 0x44;
while (I2STAT != 0x50);
xMSB07 = I2DAT;
I2CON = 0x54; // Beenden
for (i=0; i<= 100 ; i++); // Delay Zeit
//-----------------Algo für Umrechnen der Werte
x &= xLSB06;
x =x+ (xMSB07 << 2);
x = x& 0x03FF;
if ( x > 0x01FF)
{
x= x^= 0x03FF;
x= x*4;
}
}while(1);
}
EDIT:
Möchte hinzufügen. Das wenn ich das Programm komplett durch fahren lassen das dann Register06 und 07 gleich sind .... obwohl ich eine Schleife drin habe die als delay dienen soll...
Lesezeichen