mikrocontroller.net

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


Autor: Torsten M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: MO (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Achim (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Torsten M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
...
    // read value from eeprom address 0x10
    
    data = i2c_start(Dev24C02+I2C_WRITE);       // set device address and write mode
    if ( data )
    {
      // failed to issue start condition, possibly no device found
      i2c_stop();
      lcd_gotoxy(0,1);
      lcd_puts("Wert: failed");
    }
    else
    {  i2c_start(Dev24C02+I2C_WRITE);      // set device address and write mode
      i2c_write(0x10);            // write address = 0x10
      i2c_rep_start(Dev24C02+I2C_READ);    // set device address and read mode
      data = i2c_readNak();          // read one byte
      i2c_stop();
      
      lcd_gotoxy(0,1);
      lcd_puts("Wert: ");
      itoa(data, buffer, 10);
      lcd_puts(buffer);
      _delay_ms(1000);
    }
...

"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 ...

Autor: Torsten M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Torsten M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: XXX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Torsten M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: matzunami (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Abdul K. (ehydra) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: espritle (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist das Thema ausgegangen? Was war der Fehler?

Vielen Dank
espritle

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.