https://www.adafruit.com/product/904
Hallo an alle, ich versuche dieses Modul per i2c anzusteuern, bin aber
gerade mit meinem Latein am Ende. Ich hatte hier..
Beitrag "Frage zu i2c NOT ACK bei ATMega328P"
..schon mal andiskutiert und dachte eigentlich alles verstanden zu
haben, aber ich bekomme kein ACK :-(
Jetzt habe ich ein ganz einfaches Testprogramm, Hardware ist ein Arduino
R3 Clone, per ISP angeschlossen. Was kann ich noch an systematischer
Fehlersuche tun / messen? Ich bekomme immer einen falschen Status
zurück:
Ausgabe:
1
i2c start
2
wert1=08
3
wert2=20
Mein auf das Problem reduzierte Testprogramm (Bascom, aber ich hoffe
einfach zu lesen):
Laut adafruit ist die 0x40 die 7 Bit Adresse. Dafehlt ja noch das R/W
Bit. Versuch mal ob du mit 0x80 eine Antwort bekommst wenn du due
Adresse 0x40 eingestellt hast.
Gruß JackFrost
Das habe ich nicht kapiert.. r/w ist doch das LSB, oder?? Oder warum 80?
Ich würde eigentlich nur erstmal gerne ein ACK auf meine Adresse
bekommen, sprich der Statuscode sollte 0x18 statt 0x20 sein..
Guck dir vielleicht erstmal dein Adressbyte in Ruhe an. Der Windoof
Taschenrechner hat einen "Programmierer" Modus, der dabei tatsächlich
ganz hilfreich sein kann.
Ich habe so den leisen Verdacht, dass dir ein paar wesentliche
Grundlagen in Sachen Hexadezimalsystem feheln... Ist ja keine Schande ;)
i2c twi schrieb:> ..schon mal andiskutiert und dachte eigentlich alles verstanden zu> haben, aber ich bekomme kein ACK :-(
Schaun wir mal...
> Jetzt habe ich ein ganz einfaches Testprogramm,...
Sehr gut!
> Ausgabe:>>
1
> i2c start
2
> wert1=08
3
> wert2=20
4
>
Ok, TWI wird Master und bekommt dann kein ACK vom Slave...
> Mein auf das Problem reduzierte Testprogramm (Bascom, aber ich hoffe> einfach zu lesen):
geht schon....
>
1
> Twdr = &H40 'datenbyte=Adresse
2
>
Da ist dein Fehler. Die Adresse von IC ist 0x40. Das TWI möchte aber
Adresse + R/W Bit....
7 Bit adresse | R/W
Bit 7..1 | Bit 0
Zusammen 8 Bit für TWDR.
Also 0x40 1 Bit nach links schieben = 0x80 und dann
1 addieren für Lesen oder 0 für Schreiben.
Das Ergebnis kommt dann ins TWDR.
i2c twi schrieb:> Das habe ich nicht kapiert.. r/w ist doch das LSB, oder?? Oder warum 80?
Das musst im Grunde du wissen - es geht darum was deine I2C Library
erwartet:
+ entweder eine 7Bit Adresse (wie du sie angegeben hast "Twdr = H40")
oder
+ eine 8Bit Adresse bei der die Library dann das LSB ignoriert /
selbstständig anpasst, dann hättest du eine falsche Adresse angegeben
Es werden die 7Bit der Adresse und dann das R/W Bit gesendet. Damit du
auf die vollen 8 Bit kommst schiebst du die Adresse um ein Bit nach
links und addierst das R/W Bit. Das LSB kommt als letztes. Schau dir das
mal im Datenblatt auf Seite 11 an.
Gruß JackFrost
Julian .. schrieb:> Also 0x40 1 Bit nach links schieben = 0x80 und dann> 1 addieren für Lesen oder 0 für Schreiben.> Das Ergebnis kommt dann ins TWDR.
Ahhh na da habe ich mich ja prima selbst hereingelegt.. daran wird's
liegen. ich dachte halt man muss die "1" addieren.. Aber im
Timing-Diagramm ganz genau hingeschaut sehe ich es jetzt auch!
Peter schrieb:> Das musst im Grunde du wissen - es geht darum was deine I2C Library> erwartet
Alles Hardware, nix Library.. :-)
Jobst M. schrieb:> Meeeeeensch, das kann doch nicht sein, dass Du das immer noch nicht> hinbekommen hast. Genügend Tips gab es doch ...
Halb so wild - ich hatte nur zwischendurch keine Zeit zum Basteln. Danke
auch für Deine viele Mühe mit dem Programm, aber die Zeile nach
"Auswertung:" macht mir Angst ;-)
i2c twi schrieb:> Halb so wild - ich hatte nur zwischendurch keine Zeit zum Basteln. Danke> auch für Deine viele Mühe mit dem Programm
Programm ist mehr als OK, er hat es so geschrieben, dass du auch
verstehen kannst, was da vorgeht.
> aber die Zeile nach "Auswertung:" macht mir Angst ;-)
Du brauchst keine Angst zu haben, das macht die Library auch.
Oder, um sicher zu gehen, so etwas reinschreiben:
i2c twi schrieb:> Julian .. schrieb:>> Also 0x40 1 Bit nach links schieben = 0x80 und dann>> 1 addieren für Lesen oder 0 für Schreiben.>> Das Ergebnis kommt dann ins TWDR.>> Ahhh na da habe ich mich ja prima selbst hereingelegt.. daran wird's> liegen. ich dachte halt man muss die "1" addieren.. Aber im
Ich glaube BASCOM schiebt die Adresse nach links, das solltest du
nicht machen.
Marc V. schrieb:> Ich glaube BASCOM schiebt die Adresse nach links, das solltest du> nicht machen.
Nur wenn er i2csend nimmt. I2cwbyte oder seine Variante über die
Register machen das natürlich nicht.
i2c twi schrieb:> aber die Zeile nach> "Auswertung:" macht mir Angst ;-)
Meine Güte, was glaubst Du denn, was passiert?
Weltuntergang?
Probier das doch einfach aus.
Ich habe langsam den Eindruck, dass Du gar keine Lösung haben möchtest.
Jeden zielführenden Vorschlag lehnst Du ab.
Natürlich kann auch etwas mal nicht funktionieren. Aber das wird man
nicht herausbekommen, wenn man es nicht ausprobiert.
Also: Probier das jetzt aus und WENN es Probleme gibt (wovon ich
zumindest an dieser Stelle nicht ausgehe) kann man darüber reden.
Ansonsten: Such Deinen Fehler selbst, ein Forum ist für Dich nicht
geeignet.
Gruß
Jobst
Wie schon vermutet - es lag wirklich nur an dem Adress-Missverständnis.
Jetzt bekomme ich ENDLICH ein ACK.. (0x18 bzw. 0x40 beim READ)
Danke an alle!
@Jobst - da steht doch ein Smilie in meiner Zeile = ist nicht so ernst
gemeint. Was dahinter steckt: Ich verwende generell kein Goto und würde
eher eine While-Schleife schreiben, aber das ist nur ein Detail.
Ich hab in deinem Programm mal die fehlenden Variablen u.a. gefixt.
Ausgabe:
i2c start
STA : STA gesendet 08
Adresse 08 : 20
STO :
Irgendwie wird das Bit nicht mehr gesetzt und er bleibt da beim goto
hängen.
Aber wie gesagt - ich hab den Fehler ja gefunden und komme erst mal
klar.
Ihr seid super!
i2c twi schrieb:> Ich verwende generell kein Goto
Ich verwende das, was mich am schnellsten zum Ziel bringt.
Und: Meine Güte, Du hast ein Softwareschnippsel zum ausprobieren
bekommen.
i2c twi schrieb:> Irgendwie wird das Bit nicht mehr gesetzt
Dann nimm die Auswertung für STO weg und warte kurz.
i2c twi schrieb:> Jetzt bekomme ich ENDLICH ein ACK.
Mein Gott, jetzt hat er's!
Dann ist ja gut ...
;-)
Gruß
Jobst
Eine eigene Frage?
Dieser Thread ist über 10 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.