Sry, habe ich übersehen... Jetzt passt es!
Danke!
Druckbare Version
Sry, habe ich übersehen... Jetzt passt es!
Danke!
Hallo an alle,
ich habe noch mal mein Programm umgeschrieben bzgl. des g-Wertes.
Aber irgendwie ändert er sich nie bei mir was mache ich falsch?
Über eine kleine Hilfe von Euch wäre ich sehr dankbar.
Gruß
TJ
Code:void g_Werte(void)
{
word adresse_g;
byte data;
adresse_g=0x14;
I2C_Start();
I2C_Write(0x70);
I2C_Write(adresse_g);
I2C_Stop();
I2C_Start();
I2C_Write(0x71);
data=I2C_Read_NACK();
I2C_Write(data & 00000000 ); //hier werden jetzt 2g eingestellt
I2C_Stop();
}
Hallo!
Ich kann bei meinem Beschleunigungssensor die Daten mit Bascom und einem atmega88 auslesen. Jedoch bin ich noch Anfänger bei uc und bascom und habe folgendes Problem/Frage:
Ist es irgendwie möglich die Daten tabellarisch im Editor oder Excel abzuspeichern? Würde mit den Daten später gerne eine FFT machen?
Gruß
Kati
Hi Kati,
willkommen im Forum und viel Erfolg bei Deinen Projekten.
Umfangreichere Messdaten hatte ich (z.B. bei meinem MiniD0) im Controller in Feldern wie mess03[100] notiert und am Ende der Messsequenz über die UART/RS232 ausgegeben. Die Messsequenz ist durch die Größe des SRAM begrenzt, daher hatte ich für umfangreichere Messungen statt eines sonst ausreichenden mega168 einen m328 genommen. Natürlich könnte man die Daten auch ins EEPROM schreiben. Diese Variante hatte ich nicht genutzt, weil Schreiben ins EEPROM deutlich langsamer geht als Daten im SRAM zu halten. Das ebenfalls langsame Lesen aus dem EEPROM würde bei der Datenausgabe über die serielle Schnittstelle kein Nachteil sein. Ich hatte deswegen Platzprobleme, da meine Daten größer als 1 Byte waren und bei 2-Byte-Feldern ist eben der Platz schneller alle. Wie Du mit Deinem m88 auskommst, siehst Du ja (ähhh - nun weiß ich nicht wie Du programmierst - bei mir, in C, im AVRStudio) im Build-Protokoll nach dem Kompilieren. Da steht dann so etwas wie "Data: 712 bytes (69.5% Full)". Um den nachlässigen Programmierer zu verwirren, gibts auch einen Data-Verbrauchs-Anzeige über 100 % - dann läuft manches nicht mehr (und ich hatte mal ewig lange gesucht, bis ich meine Dämlichkeit merkte).Zitat:
Zitat von kaddi1989
So eine Ausgabe sieht am Terminal etwa so aus (klick hier). Mit paste© habe ich die Daten entweder direkt ins Excel kopiert oder in eine ASCII-Datei abgespeichert. Danach eine Excelorgie je nach Bedarf und Geschmack. So ist dieses Diagramm entstanden (klick) und ähnliche, mit mehreren Messwerten zu je hundert Messpunkten. Direkt ins Excel gehts wohl auch, wenn Du einen "Terminal"-Ersatz hast, der das kann. Meine Lösung reichte mir und benötigte keine Sonderheiten. Ein Trick beim Einfügen von ASCII-Daten ist Excel-usern bekannt: Daten, die mit TAB getrennt sind, werden in benachbarte Zellen geschrieben, Daten die mit CR/LF getrennt sind, in darunter liegende Zellen usf.
Klingt hausbacken, ich weiß (ich bin eben einfach gestrickt). Viel Erfolg
Hallo, ich benutze auch den BMA020 mit dem Modul von ELV. Bin ziemlich begeistert von dem Gerät. Auslesen funktioniert soweit auch ganz gut (mit Hilfe einiger Code-Schnipsel aus diesem Forum).
Jetzt möchte ich den Sensor aber im Interrupt-Betrieb betreiben. Habe mir das Datenblatt dazu mehrmals durchgelesen (ist ja im Grunde recht gut beschrieben). Leider funktioniert das ganze nicht wie es soll.
Der Sensor soll einen Interrupt schicken sobal er bewegt wird. Dazu dachte ich, dass ich eigentlich nur das any_motion Bit setzen muss.
Wäre euch dankbar wenn ihr mir sagen könntet welche Bits ich dazu alle setzen muss (und welche nicht).
Gruß
Jens
Ok, ich hab das Problem selber gefunden. Hatte das enable_adv_INT Bit falsch gesetzt. Jetzt klappts.
Edit
-----------------------
Ich habe da noch ein paar Fragen.
@mausi_mick:
Wie bist du vorgegangen um den Vektor zu normalisieren und um den Nullpunkt zu verschieben? Wie bist du auf die Werte gekommen??
Mit der Formel sqrt(x² + y² + z²) sollte ja das Ergebnis bei Ruhelage immer gleich bleiben. Egal auf welcher Seite der Sensor steht, solange er in Ruhelage ist. Aber ich erhalte unterschiedliche Werte je nach Lage und Ausrichtung.
Warum sprecht ihr eigentlich immer von einem Wertebereich zwischen +-256?? Bei 10 Bit habe ich doch eher einen Wertebereich zwischen +-512??
Gruß Jens
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ß
EDIT: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);
}
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...
Hi,
ich versuch schon seit Stunden den Sensor auszulesen, aber bekomme einfach keine Antwort.
Vielleicht übersehe ich die ganze Zeit den Fehler, vielleicht ist der Sensor aber einfach defekt.
Hier der Code:
Die Ausgabe erfolgt über I2C an den Slave der das LCD ansteuert. Um sicher zu sein dass es hier keinen Fehler gibt, lese ich zusätzlich den Kompass aus (auch über I2C) und zeige auch dessen Wert am LCD an.Code:void Sensortest()
{
unsigned char xl,xm,yl,ym,zl,zm;
xl=0;xm=0;yl=0;ym=0;zl=0;zm=0;x=0;
while(1)
{
if(!(i2c_start(0x70))) // start I2C bus
{
i2c_write(2); // register
i2c_rep_start(0x70+I2C_READ); // restart
xl = i2c_readAck();
xm = i2c_readAck();
yl = i2c_readAck();
ym = i2c_readAck();
zl = i2c_readAck();
zm = i2c_readNak();
i2c_stop();
}
Kompass();// TEST
_delay_ms(1);
// Ausgabe am LCD
while (TWI_bereit()!=0)
_delay_ms(1);
i2c_start(0xb0);
i2c_write(1); // (ab) register 1
i2c_write(8); // Modus Sensortest
i2c_write(xl);
i2c_write(xm);
i2c_write(yl);
i2c_write(ym);
i2c_write(zl);
i2c_write(zm);
i2c_write(kompass_akt); // TEST
i2c_stop();
i2c_start(0xb0); // Register 200 auf 1 setzen = neue Werte
i2c_write(200);
i2c_write(1);
i2c_stop();
LED_rot_aus;
_delay_ms(300);
LED_rot_ein;
}
}
Die Kompasswerte sehe ich auch, aber vom Sensor nichts. Bzw wenn ich die Abfrage von if(!(i2c_start(0x70))) auf i2c_start_wait(0x70); abändere habe ich 6x den Wert 113, dh h70+1.
LG!
Hi damfino,
schau Dir mal Sternthalers Code an (dieser Thread, 21 Jun 2010, 0:56). Der Codezauberer Sternthaler hat dort für die x, y und z-Werte int16_t genommen. Das lässt doch nachdenklich werden ! ? Und genauso funktioniert das bei mir (auch - ich hab nämlich seinen Code geklaut). Ob das mit Deinen Low- und Highbytes klappt - na ich weiß (leider wirklich) nicht.
Hi,
an den Variablen kann es kaum liegen, ich bin derzeit nur am testen der ganzen I2C Verbindungen und lese daher nur die einzelnen Bytes aus. Da hat Sternthaler mit uint8_t die gleichen wie ich mit unsigned char. Der Zusammanbau von 2x8Bit auf 10Bit kommt erst wenn das mal funktioniert.
Ach ja, ich verwende die Fleury lib für den Master.
LG!