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 ...
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
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?
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 ...
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.
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?
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
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.
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
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.
Wie ist das Thema ausgegangen? Was war der Fehler? Vielen Dank espritle
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.