Forum: Mikrocontroller und Digitale Elektronik Kompass über I2C auslesen


von Quadrox (Gast)


Lesenswert?

Hallo Freunde des anspruchsvollen Programmierens,

ich habe folgendes Problem:

Ich habe einen Kompass, genauer gesagt den LSM303DLM, und möchte mit dem 
ATMEGA88PA über ein I2C-Interface die Werte des Kompasses auslesen.
Jedoch habe ich absolut keinen Plan, wie ich den Kompass ansprechen 
soll.
Die grundlegenden I2C-Befehle habe ich zwar bereits schon gefunden, aber 
mehr auch schon nicht mehr.

Ich hoffe, dass sich schon mal jemand mit diesem Problem 
auseinandergesetzt hat oder dass irgendjemand mir bei diesem Programm 
behilflich sein kann.


Mit freundlichen Grüßen,
Quadrox

von Dirk J. (dirk-cebu)


Lesenswert?


von Quadrox (Gast)


Lesenswert?

Mit solchen guten Tipps muss bei dir ja jedes Programm auf Anhieb 
funktionieren.

Spaß beiseite (Lockere Handbewegung zur Seite)

Gibt es vielleicht jemanden, der auch konstruktive Vorschläge zu bieten 
hat?

von Timmo H. (masterfx)


Lesenswert?

Hier gibts doch ne Arduino Lib. Kannst dir ja leicht "übersetzen"
http://www.pololu.com/catalog/product/1273/resources
Als Grundlage für die I2C Kommunikation würde ich die i2c lib von Peter 
Fleury nehmen: http://jump.to/fleury
Was es für Register gibt steht ja ansonsten auch im Datenblatt des 
Kompass-Moduls

von Quadrox (Gast)


Lesenswert?

Danke für deine Antwort, Du hast mir schon mal sehr viel weiter 
geholfen!

Die Libraries vom Peter Fleury hab ich bereits gefunden auch die 
Register meines Kompasses habe ich schon ausfindig gemacht gehabt.

Jedoch weiß ich überhaupt nicht, wie ich aus dem Arduino Code nützliche 
Informationen beziehen kann.

Ich habe auch schon ein weiteres Programm gefunden, mit dem man von 
einem bestimmen Temperatur Chip (DS1621) die Temperatur auslesen kann. 
Dieses hab ich schon an den LSM303DLM angepasst und schaut nun so aus:
1
 
2
#include <avr/io.h>
3
#include <util/delay.h>
4
#include "i2cmaster.h"
5
#include "twimaster.c"
6
 
7
#ifndef F_CPU
8
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
9
#define F_CPU 4000000L
10
#endif 
11
#define BAUD 9600L    
12
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
13
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
14
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
15
#define Dev24C02  0xA2      // device address of EEPROM 24C02, see datasheet
16
 
17
#define DS1621_Write  0x9E
18
#define DS1621_Read   0x9F
19
 
20
void warte()
21
{
22
                 int i;
23
                 for (i=0;i<10;i++)
24
                   _delay_ms(20);
25
}
26
 
27
 
28
int main(void)
29
{
30
    unsigned char ret, KompH, KompL, data, test;
31
    int i;
32
 
33
    DDRB  = 0xff;                              // use all pins on port B for output
34
    PORTB = 0xff;                              // (active low LED's )
35
    UBRR0H = UBRR_VAL >> 8;      /* Baudrate einstellen */
36
    UBRR0L = UBRR_VAL & 0xFF;  /* Baudrate einstellen */
37
                 UCSR0B |= (1<<TXEN0);                       /* UART TX einschalten */
38
                 test = 'x';
39
 
40
    i2c_init();                                // init I2C interface
41
                
42
                 test = i2c_start(DS1621_Write);
43
                 // test kann bei Bedarf  ausgewertet werden
44
                 test = i2c_write(0xEE);
45
                 // test kann bei Bedarf  ausgewertet werden
46
                 i2c_stop();
47
                
48
                 i2c_start(DS1621_Write);
49
                 i2c_write(0xAA);
50
                 i2c_stop();
51
                 warte();
52
                 while (1)
53
                 {
54
                 i2c_start(DS1621_Read);
55
                 data = i2c_readAck();
56
                 KompH = data;
57
                 data = i2c_readNak();
58
                 KompL = data;
59
                 i2c_stop();
60
 
61
                 while (!(UCSR0A & (1<<UDRE0))) 
62
                                  {                                                                  /* warten bis Senden moeglich */
63
                                  }
64
 
65
                 UDR0 = KompH;
66
                
67
                 for (i=0;i<10;i++)
68
                 _delay_ms(100);
69
                 warte();
70
                 }
71
}

Wie man sieht, sind in diesem Programm auch die Libraries vom Fleury 
drin.
Könnte die Auslesung des Kompasses mit diesem Code funktionieren?

MfG,
Quadrox

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.