Hallo alle,
puhhhh. Na ja, ich bekomme wenigstens Daten heraus.
Chip verdrahtet nach Bau- und Bedienungsanleitung 91521 von ELV, Bild 7. I2C-Bibliothek von PFleury und das "Programmschnippsel für die Neugierigen" von Sternthaler. Sternthalers Programmschnippsel an die Wortwahl (Befehle) von PF anpassen. Irgendwann wirds dann fehlerfrei compiliert. Flashen. Einschalten.
Code:
// =================================================================================
void DAA_lcd(void) // Daten lesen und Ausgabe aufs LCD-Modul
{ //
char zahlwort[5];
lcd_init(LCD_DISP_ON); // Initialisiere Display, Cursor aus
lcd_clrscr(); // loesche LCDisplay, Cursor 1 Zeile, 1 Spalte
lcd_puts ("L168-10x31, 17Okt10 1730");
waitms ( 10); //
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - Es folgt die Datenerfassung, vergleiche dazu Sternthaler in
// https://www.roboternetz.de/phpBB2/ze...=507498#507498
//
// ----------------------------------------------------------------------------
// Defines: Adresse vom BMA020-3D-Beschleunigungssensor
//
#define I2C_BMA_W 0x70
#define I2C_BMA_R 0x71
//
unsigned char ACK, NAK;
int16_t x, y, z;
uint8_t ret;
uint16_t wloop;
wloop = 0;
//
// ----------------------------------------------------------------------------
// Die Werte aufs LCD schreiben
lcd_clrscr(); // loesche LCDisplay, Cursor 1 Zeile, 1 Spalte
// 012345678901234567890123
lcd_puts ("Wertx Werty Wertz ");
// ----------------------------------------------------------------------------
// Lesen von 6 Registern ab Register 0x02. X, Y, Z-Koordinate
// Ab hier Befehle ähnlich Sternthaler, aber aus der Fleury-Lib
//
while (1) //
{ //
wloop++; // Loop hochzählen
//
i2c_init(); //
//
ret = i2c_start (I2C_BMA_W);
ret = i2c_write (0x02);
i2c_stop ();
//
ret = i2c_start (I2C_BMA_R);
ret = i2c_read (ACK); x = (int16_t)ret;
ret = i2c_read (ACK); x = x | ((int16_t)ret << 8); x /= 64;
ret = i2c_read (ACK); y = (int16_t)ret;
ret = i2c_read (ACK); y = y | ((int16_t)ret << 8); y /= 64;
ret = i2c_read (ACK); z = (int16_t)ret;
ret = i2c_read (NAK); z = z | ((int16_t)ret << 8); z /= 64;
i2c_stop ();
//
// Die Werte für X, Y, Z-Koordinate sind gelesen
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
// Die Werte aufs LCD schreiben
//
utoa(x, zahlwort, 10); //
lcd_gotoxy( 1, 1); // Spalte 2 {0, 23} in Zeile 2 {0, 1}
lcd_puts(zahlwort); //
waitms( 1); //
//
utoa(y, zahlwort, 10); //
lcd_gotoxy( 9, 1); // Spalte 19 in Zeile 1
lcd_puts(zahlwort); //
waitms( 1); //
//
utoa(z, zahlwort, 10); //
lcd_gotoxy(18, 1); // Spalte 19 in Zeile 1
lcd_puts(zahlwort); //
waitms( 10); //
if (wloop == 1000) //
break; //
} // Ende von while (1)
//
waitms( 5000); //
lcd_gotoxy(0, 1); // Cursor auf Anfang untere Zeile
// 012345678901234567890123
lcd_puts (" Datenausgabe Ende "); // Text ausgeben
return;
}
Schön, es gibt sogar eine Ausgabe am LCD - nachdem ich den UPULLUP (auch) auf +5V gelegt hatte. Aber die Ausgabe war nicht so richtig akzeptabel: die x-Werte schwanken um drei Digits, der Rest ist stabil. Wenn ich die Versorgung - Vcc und GND - von der Sensorplatine abklemme, dann wird nur der Text, nicht aber die Zahlenwerte angezeigt (Controller bleibt hängen), auch die "Ende Messung"-Meldung bleibt aus.
Code:
//012345678901234567890123 - - Die folgenden 2 Zeilen symbolisieren das LCD 2x24
| Wertx Werty Wertz |
| 65533 0 65532 |
4
5
Ahhhh - da war doch diese Geschichte mit den 10k von SCL und SDA nach Vcc. Ok, das ist schnell gemacht. Aber es ändert sich nix. Da die Gravitation nach Lage des Sensors gerade in Z-Richtung groß ist (ich habs ja nicht am Kniebrett und teste es in Formel1-Kurvenfahrt) - habe ich offenbar etwas falsch gemacht. Weiß jemand was? Danke im Voraus.
Lesezeichen