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
Quadrox schrieb: > wie ich den Kompass ansprechen > soll Z.B. "Sehr geehrter Herr Kompass!" Ansonsten schau mal hier: https://www.google.com/search?q=LSM303DLM&hl=de&client=firefox-a&hs=bA3&rls=org.mozilla:de:official&prmd=imvns&source=lnms&tbm=isch&ei=NCZaT9i1HcLFmQWbpsHIDA&sa=X&oi=mode_link&ct=mode&cd=2&ved=0CA8Q_AUoAQ&biw=1024&bih=634 Alles über Deinen Kompass.
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.