Forum: Mikrocontroller und Digitale Elektronik Auslesen eines HH10D (Software-I2C)


von Torsten M. (Gast)


Lesenswert?

Hi!

Zuerst: Ich habe gesucht (mittlerweile seit Tagen, nicht nur hier), aber 
leider hat mich nix davon weiter gebracht.

Ich versuche verzweifelt die Daten aus einem HH10D von Pollin 
auszulesen. Aber da kommt nix, mein ATmega32 scheint sich jedes mal 
aufzuhängen.

Die Frequenzmessung war kein Problem und funktioniert auch (ca 6800 Hz), 
aber mit dem EEPROM komme ich nicht klar. Ist aber auch mein erster 
Kontakt mit dem I2C-Bus.

Wenn also jemand einen funktionierenden Code-Schnippsel online stellen 
könnte wäre das super. Vielleicht finde ich damit ja meinen Fehler.

Ach ja: Hardware-TWI kann ich leider nicht nutzen, da die Ports schon 
belegt sind. Es muss also leider Software-I2C sein ...

von MO (Gast)


Lesenswert?

hi

was ist denn an dem hardware-i2c dran und hat es die gleiche adresse wie 
das hh10d?

wenn nicht dann kann man die üder die adresse ab/anwählen!!!

i2c ist ein wie du schon schriebst ein bus der mehrere teilnehmer haben 
kann.

mfg

von Achim (Gast)


Lesenswert?

Du solltest eher deinen Code zeigen und nicht erwarten das jmd. anderes 
was fertiges für dich in der Schublade hat. Vor allem da du noch nicht 
einmal erwähnst welche Sprache du nutzt. Ein paar weitere Details wären 
auch nicht schlecht. Benutzt du deine eigene Software I2C 
Implementierung oder etwas schon vorhandenes? Wie kommst du darauf das 
sich der ATmega32 aufhängt?

von Torsten M. (Gast)


Lesenswert?

Hallo nochmal!

Okay, dann mal zum Setup:

ATmega32 auf Evaluation-Board (ähnlich Pollin-Board)
AVR-Studio + avrgcc - also C

Ich habe es mit der Bibliothek von Peter Fleury (i2cmaster) probiert. 
Erstmal wollte ich zum Testen nur den sens-Wert auslesen (also Adresse 
0x10) und auf dem LCD-Display ausgeben. Hier mal ein Ausschnitt:
1
...
2
    // read value from eeprom address 0x10
3
    
4
    data = i2c_start(Dev24C02+I2C_WRITE);       // set device address and write mode
5
    if ( data )
6
    {
7
      // failed to issue start condition, possibly no device found
8
      i2c_stop();
9
      lcd_gotoxy(0,1);
10
      lcd_puts("Wert: failed");
11
    }
12
    else
13
    {  i2c_start(Dev24C02+I2C_WRITE);      // set device address and write mode
14
      i2c_write(0x10);            // write address = 0x10
15
      i2c_rep_start(Dev24C02+I2C_READ);    // set device address and read mode
16
      data = i2c_readNak();          // read one byte
17
      i2c_stop();
18
      
19
      lcd_gotoxy(0,1);
20
      lcd_puts("Wert: ");
21
      itoa(data, buffer, 10);
22
      lcd_puts(buffer);
23
      _delay_ms(1000);
24
    }
25
...

"Dev24C02" ist mit 0xA2 definiert. Sollte ja stimmen ...

Jedenfalls bleibt er bei "data = i2c_start(Dev24C02+I2C_WRITE)" 
scheinbar stehen, da keine der Anweisungen im if/else-Zweig ausgeführt 
werden.

Und genau mit diesem Problem kämpfe ich seit einigen Tagen ...

von Torsten M. (Gast)


Lesenswert?

Ach ja, das ganze ist Teil eines Projekt für die Schule.
An den Hardware-TWI soll was anderes ran, aber wir wissen noch nicht 
was. Bisher sollen wir den nur freihalten und auch nicht für einen 
I2C-Bus nehmen. Ich vermute mal dass da irgendwas galvanisch getrennt 
werden soll oder so ähnlich, aber genau kann ich es nicht sagen.

von Torsten M. (Gast)


Lesenswert?

So, heute habe ich erfahren, dass an Port C ein Display fest verdrahtet 
ist. Hardware-TWI scheidet also definitiv aus.

Hat vielleicht jemand eine Idee wo der Fehler im Code oben liegen 
könnte?

von XXX (Gast)


Lesenswert?

Hallo

Ist die Adresse 0xA2 korrekt??

Ich kenne I2C-ICs nur von Boards für die ich Testprogramme
auf einem Incircuit-Tester mache.

I2C-Testprogramme sind fast immer die ersten die funktionieren.
Falls nicht, ist fast immer die Adresse falsch.

Gruß
Joachim

von Torsten M. (Gast)


Lesenswert?

Im Datenblatt von Pollin stand auch 0x01 als Leseadresse drin, aber das 
kann doch eigentlich nicht sein ...

Ich habe es trotzdem ausprobiert, aber wie erwartet ohne Erfolg.

von matzunami (Gast)


Lesenswert?

Hi,
das beste wäre sich mit einem Oszi die Datenleitung anzuschauen. 
Kontrolliere ob deine Bits richtig rausgeschoben werden und ob die ACKs 
vom Slave ordnungsgemäß gesetzt werden.

Gruß
matzunami

von Abdul K. (ehydra) Benutzerseite


Lesenswert?

Wenn die Adresse vielleicht nicht stimmt, ist es am einfachsten wenn du 
einen Bus-Scan über alle Adressen machst. Irgendwann meldet sich der 
Slave mit ACK. Dann hast du ihn.
Wenn er sich nicht meldet, hast du einen Hardware-Fehler oder deine 
Software ist Mist.
Beachte auch, das der Slave eventuell im falschen Busstate hängt und den 
Master nicht mehr hört. Wäre aber auch der Fall Software ist Mist.

von espritle (Gast)


Lesenswert?

Wie ist das Thema ausgegangen? Was war der Fehler?

Vielen Dank
espritle

von Mark (Gast)


Lesenswert?

Hallo zusammen und noch ein gesundes Neues,

an der Stelle möchte ich mich einhängen, habe schon etliche Stunden dem 
Korrekturwert geopfert. Ich hoffe dass jemand von euch den Sensor HH10D 
kennt.

Zum Grundverständnis: Wenn ich die Unterlagen richtig verstanden habe, 
wird der Korrekturwert bei der Herstellung des Modules eingespeichert. 
Das würde heißen, dass er sich nicht ändert. Warum hat man ihn nicht 
einfach auf die Platine gelasert/gedruckt, warum dieser I2C-Zinober?

Und da bin ich schon beim Thema. Ich habe einige Jahre mit 
Linear-Elektronik der unterschiedlichsten Bereiche gearbeitet. Die 
µC-Welt kenne ich noch nicht sehr lange, ebensowenig die dazu 
erforderliche Software. Zum Programmieren benutze ich Pony-Prog und 
Bascom, da ich aus C64-Zeiten noch einige Basic Grundregeln beherrsche. 
Als µC kommt ein Attiny2313 zum Einsatz, SCL und SDA an den 
entsprechenden Pins mit 10k-Pullup. Aber ich konnte den Wert noch nicht 
auslesen, offensichtlich scheitert es hier an den Software-Kenntnissen. 
Mein Programm sieht im interessanten Teil wiefolgt aus:

i2cstart -> Businitialisierung
i2cwbyte &B10100011 -> Adresse des EProms für den Lese-Modus
i2cwbyte &B1100 -> Adresse 12, um an das erste Byte des Korrekturfaktor 
zu kommen
i2crbyte B1 , nak -> Auslesen des Bytes, speichern als B1
i2cstop -> Ende

Als Wert für B1 erhalte ich "255", egal ob ich nun als Adresse die 10, 
11, 12 oder 13 nehme. Wo könnte mein Fehler liegen?

Vielen Dank schon mal!

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.