Erst einmal ein frohes Fest. Ich habe einen ATmega8 mit 16Mhz und möchte einen MAX127 (ADC) auslesen. Dieser wird mit I2C angesteuert. Als Pullp habe ich die internen des ATmega aktiviert. Die TWI Bibliothek, welche ich verwende, habe ich schon mehrfach bei anderen Projekten eingesetzt und da hat immer alles einwandfrei funktioniert. Das Problem diesmal ist, das ich zwar Daten an den MAX127 senden kann und auch jedes mal ein ACK erhalte, aber ich keine Datene auslesen kann. Also die START-Condition geht noch und beim auslesen geht der ATmega dann ins timeout. Die Beschaltung habe ich aus dem Datenblatt Seite 1 entnommen. Da der MAX127 2xVdd besitzt war ich ein wenig irretiert, habe aber nur eines auf +5V gelegt. Danke schon mal im voraus Das Projekt und das Datenblatt hänge ich an den Beitrag an.
1. Die beiden VDDs sollte man miteinander verbinden. 2. SDA und SCL verdienen vernünftige Abschlußwiderstände nach VDD (1,7 k ... 4,7 k). Die AVR-internen Pull-Ups sind ausschließlich dann sinnvoll, wenn unbenutzte Eingänge des AVR auf ein definiertes Potential gelegt werden sollen. Sind Abblockkondensatoren u.ä. sinnvoll angeordnet? Passen die Wartezeiten zwischen Anstoßen einer AD-Konversion und Abholen des Ergebnisses? Bernhard
Die Ablockkondensatoren sind natürlich direkt am ADC angeordnet. Die beiden Vdd werd ich auch noch mal verbinden, wobei ich meine das schon probiert zu haben. Mit der Wartezeit ist das so eine Sache. Laut Datenblatt ist die conversion time max. 10µs. Da ich in der TWI_read_ack bzw. TWI_read_nack ja den timeout von 250ms drin habe, sollte das schon passen. Das Schreiben des Konfigurationsregisters klappt ja auch. Deswegen scheint die Kommunikation grundsätzlich zu funktionieren. Aber ich werd auch mal richtige Pullups probieren.
Ich habs gerade ausprobiert, auch mit richtigen Pullups bekomme ich beim Auslesen ein timeout.
Ich habe meine TWI Bibliothek jetzt noch um die Statuscodes erweitert. Das Problem ist anscheinend, dass ich beim zweiten TWI_Start zum Lesen des ADC Wertes eine 0x48 (TWI_MasterRX_ADR_NACK) zurück erhalte. Es sollte aber eigentlich eine 0x40 (TWI_MasterRX_ADR_ACK) sein.
Das tun viele TWI-Slaves: Wenn sie intern beschäftigt sind, liefern sie auf ihre Adresse "NACK" zurück. Lösung: Auf dem NACK loopen, bis die interne Operation abgeschlossen ist und das Device wieder antwortet. Bernhard
Wenn ich das mache, bleibe ich in einer Endlosschleife hängen, da ständig die 0x48 zurückkommt.
Ich vermute du wartest vergeblich auf das ACK, weil beim TWIRead eine andere Zieladresse existiert als beim TWIwrite: . . . uint8_t tmp=0; error=TWI_start(>>>>>>>>>0b0101000<<<<<<<<<<<,TWIwrite); . . . . . . {error=TWI_start(>>>>>>>>>0b1001000<<<<<<<<<<<,TWIread);} if (error!=true) {error=TWI_read_ack(&vor);} . . . Der MAX127 reagiert nur auf die Adresse 0b0101xxx
hmmm..., ich möchte mir auch den Max127 anschaffen von Reichelt: http://such001.reichelt.de/?SID=11TV-mA38AAAIAAGleGrYb12e160e05d626dc32664c76d1dc43d2;ACTION=444 Ist der das da oben für ca 23 Euro? Der wird aber an SCK , MOSI, MISO angeschlossen. Gruss
hmmm, gebt bitte mal ein bei Reichelt : Max127 Irgendwie funktionier mein Link nicht dorthin. Gruss
Max127 und Max1270 ist schon ein Unterschied. Max127: I2C und 8ksps Max1270: SPI und 110ksps (daher auch die 23€) Der Rest ist beim groben Überfliegen des DB gleich
Wo kann man eigentlich den Max127 kaufen? Finde keine deutschen Händler. Wer kennt eine deutsche Adresse für das teil? Gruss
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.