Forum: Mikrocontroller und Digitale Elektronik ATtiny44 + Kompassmodul über I2C


von Henrik S. (Gast)


Lesenswert?

Hallo liebe Community,

Ich habe das Kompassmodul HDMM01 von Pollin, von dem ich gerne den 
Winkel (also wo Norden ist sozusagen) auslesen und dementsprechend LEDs 
zum leuchten bringen möchte. Den Code für die LEDs für den jeweiligen 
Gradbereich habe ich schon. Jetzt tue ich mich aber schwer, das Auslesen 
codetechnisch umzusetzen. Hier habe ich schon einen guten Ansatz 
gefunden: http://playground.arduino.cc/Code/USIi2c allerdings weiß ich 
nicht, wie ich das genau umsetze, da mich das Datenblatt eher verwirrt 
als aufgeklärt hat: http://www.pollin.de/shop/downloads/D810164D.PDF

Zum programmieren wird ein Arduino Uno als ISP benutzt.

Vielen Dank schonmal,

Henrik

von Henrik S. (Gast)


Lesenswert?

Also ich habe jetzt ersteinmal die TinyWireM Library für den ATtiny44 
zum Laufen gebracht. Jetzt versuche ich eben mir aus dem Datenblatt und 
dem beispielcode zur Libary was zusammenzubasteln.

Die Funktion, die die Gradzahl ermitteln soll, sieht soweit so aus:
1
void Get_Angle() {
2
  
3
  TinyWireM.beginTransmission(HDMM_ADDR);
4
  TinyWireM.send (00000001);
5
  TinyWireM.endTransmission();
6
  delay(20);
7
  TinyWireM.beginTransmission(HDMM_ADDR);
8
  TinyWireM.send ();
9
  TinyWireM.endTransmission();
10
  
11
12
}

Auf Seite 6 der Anleitung wird der ganze Vorgang durchgegangen, die 
Anleitung ist aber so formatiert, dass man den entsprechenden Teil da 
nicht heraus kopieren kann... Hier der Link: 
http://www.pollin.de/shop/downloads/D810164D.PDF

Das Nächste, was ich jetzt machen muss (wenn der Anfang überhaupt 
richtig ist) ist "Cycle Four", wo ich aber keine Ahnung habe, wie ich 
einen WRITE machen soll, ohne was zu schreiben...

Liebe Grüße,

Henrik

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ich versteh jetzt das Problem nicht ganz?


Zum Auslesen die Adresse des Moduls senden mit write bit, dann ein 
00000000 um ins einzige Register des Moduls zu schreiben und in dieses 
kommt eine 1 um die Messung zu starten.
Das ganze natürlich in i2c_start und stop verpackt.
würde in code so aussehen:
i2c_start(adresse+I2C_WRITE);
i2c_write(0);
i2c_write(1);
i2c_stop();

Jetzt mindestens 5ms warten.

Jetzt wieder ein i2c start und die Moduladresse senden wieder mit write 
bit.
Dann schreibste die adresse des register, dass du auslesen willst, sagen 
wir mal 00000000. Jetzt musst du den is2 restarten und kannst mit dem 
readbefehl die 5 register auslesen.
c code:
i2c_start(adresse+I2C_WRITE);
i2c_write(0);
i2c_rep_start(adresse+I2C_READ);
byte0 = i2c_readAck();
byte1 = i2c_readAck();
byte2 = i2c_readAck();
byte3 = i2c_readAck();
byte4 = i2c_readNak();
i2c_stop();

von Henrik S. (Gast)


Lesenswert?

Hallo Martin,

vielen Dank! Das hat schon sehr weitergeholfen. Ich verstehe aber nicht 
wie ich

i2c_start(adresse+I2C_WRITE);

mit der gegebenen Library umsetze. Hier: 
http://playground.arduino.cc/Code/USIi2c steht, was man an Befehlen zur 
Verfügung hat, allerdings gibt es dort kein WRITE per se, man kann 
irgendwie nur ETWAS schreiben aber nicht einfach SCHREIBEN :-)

Danke,

Henrik

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Bei dem Failduino Müll kann ich dir nicht helfen.

Hier ne Atmel Appnote zu I2C mit dme USI Modul:
http://www.atmel.com/Images/doc2561.pdf
Zur Not machste I2C eben komplett in Software.

von Henrik S. (Gast)


Lesenswert?

Also als "Fail" und "Müll" würde ich das jetzt nicht bezeichnen... Ist 
halt nicht wirklich das Optimum...

Jedenfalls wird mir dann wohl nur übrig bleiben, es "komplett in 
Software" zu machen. Wie soll ich da denn ansetzen?

Danke,

Henrik

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Für I2C in Software gibts fertige c libs ;)
-> 
http://extremeelectronics.co.in/avr-tutorials/software-i2c-library-for-avr-mcus/

Naja wenn ich alleine schon die Bezeichner bei deiner Failduino lib da 
lese bekomm ich das blanke kotzen ;)
bei I2C heist dast start und stop und NICHT request from oder so...

von Henrik S. (Gast)


Lesenswert?

Also das mit dem Programmieren anderer Controller über die Arduino IDE 
hab ich jetzt aufgegeben, allerdings habe ich diese Anleitung gefunden: 
http://pdp11.byethost12.com/AVR/ArduinoAsProgrammer.htm

Das heißt, ich müsste mir ja eigentlich keinen neuen ISP kaufen, ich 
könnte ja den Arduino mit dem entsprechenden Code zum ISP machen und 
dann mit Atmel Studio oder so den Code schreiben, als hex speichern und 
dann mit AVRdude auf den Controller flashen. Oder?

Meine Frage ist dann aber: Wozu brauche ich denn den Crystal?

Mit freundlichen Grüßen

Henrik

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.