Tag allerseits,
ich habe ein scheinbar unlösbares Problem mit meinem SRF02 und bin
mittlerweile einfach nur noch ratlos, ich hoffe mir kann hier noch einer
weiter helfen.
Also, erstmal vorweg:
Ich habe ein Board mit einem AT89C51CC03 drauf, der funktioniert
einwandfrei, auch seine Ports.
Des weiteren habe ich ein DogXL das an einem Port angeschlossen ist, das
betreibe ich mittels selbst implementiertem I2C (ist ja nicht sonderlich
schwer), dieses Display benutze ich um mir (zwischen)werte anzuschauen,
also nicht wundern woher ich die habe.
Nun zu meinem Problem, ich habe mir 2 SRF02 bestellt um sie an besagtem
Mikrocontroller zu betreiben, der Verwendungszweck für die 2 Sensoren
sei mal so dahin gestellt.
Nach ein wenig rumprobieren, konnte ich die zwei Sensoren auch
ansprechen und mit eigenen Adressen versehen. Soweit so gut. Als
nächstes versuchte ich natürlich, wie zu erwarten war, Distanzen zu
ermitteln.
Also einen Timer genommen, und ihn alle 100 ms Rangen lassen (Beide
Sensoren abwechselnd damit sie sich nicht stören, falls das möglich
ist).
Anschließend hab ich mir die Werte dann aus Register 2 und 3 geholt, und
verrechnet (HighByte * 256 + LowByte).
Nun kommt das Problem, die Werte die ich zurück bekomme, sind zwar nicht
willkürlich und auch reproduzierbar, aber nicht korrekt.
Ich habe die Sache natürlich gründlich untersucht, und auch zum Test mal
die Software Revision aus Register 0 ausgelesen.
Was mir dabei nun auffiel, war das scheinbar das MSB tut was es will:
Ich habe eine Distanz von 150 cm gemesen, und auch diesen Wert bekommen,
dann bin ich langsam mit dem Sensor näher an das Objekt herran und auch
die Zahl ist linear und realistisch nach unten gesunken, bis zu 128, ab
da macht die Zahl einen Sprung zu 255.
Meine Vermutung also: bei 128cm ist das MSB high, also passt es noch,
bei 127 jedoch ist es Low und die nachfolgenden Bits alle High, wenn nun
aber, obwohl das MSB Low sein sollte, umkippt, komm ich auf besagte 255.
Auch die Software Revision gibt mir 133 als Wert zurück, anstatt 5 wie
man oft im Internet liest.
Wenn man mal kurz drüber nach denkt, ist es logisch: Denn wenn bei der 5
das MSB kippt, bekomme ich 133 zurück.
Ich habe meinen Code mittlerweile immer und immer wieder auf Fehler
untersucht / untersucht lassen, habe aber keinen Fehler gefunden, ich
habe es mit den internen Pullups für SDA und SCK ausprobiert, mit
externen (4,7k) an P0 (dieser hat ja keinen internen) und beides
zusammen.
Ich habe sogar schon getestet ob ein stärkeres Stromkabel in der nähe
bits um wirft, ich finde den Fehler einfach nicht, ich hab auch schon
Stunden lang gegoogelt - erfolglos.
Es ist auch bei beiden SRF02 das selbe, und auch ein anderer 89C51
bringt die selben Ergebnisse, defekte Hardware schließe ich hiermit
eigentlich aus.
Wie dem auch sei, mehr weiß ich leider nicht mehr, und mit meinem Latein
bin ich am Ende. :(
Nachfolgend ist noch mein C-Code der den SRF02 ansteuern soll.
Ich wäre sehr, sehr dankbar für jegliche Hilfe!
Mit freundlichen Grüßen, Max
Hallo,
ich hab deinen Code mal kurz überflogen, und mich wundert dass das
überhaupt funktioniert.
Du achtest zwar fein säuberlich auf die einzelnen Pegel (Clock /Data)
aber von "Timing" seh ich weit und breit nichts !!!
An ein eventuelles "clock-stretching" hast du nicht mal ansatzweise
gedacht.
> I2C (ist ja nicht sonderlich> schwer)
Viele ????????????????????
Ich geb zu es ist unsauber, aber Absicht.
Mein Display, für das ich die I2C Methoden programmiert habe kann mit
bis zu 4 Mhz arbeiten, mein µC hat nur 1 Mhz, also sah ich min dazu nich
gezwungen und der Code is minimal schneller.
Und das ack Bit, das ist immer der letzte clock in den Funktionen, hier
is ebenfalls das selbe mit 4 und 1 Mhz.
Ich habe es dann bei den Sensoren einfach so übernommen und es ging.
Also habe ich mich nicht weiter darum gekümmert.
Könnte das Problem darin liegen? Kanns mir irgendwie nicht ganz
vorstellen um ehrlich zu sein
Mfg, Max
Du weisst schon, dass I2C Geräte nur mit Geschwindigkeiten von
100kBit/s, 400kBit/s und 3,4MBit/s spezifiziert sind?
Also wenn im Datenblatt nicht explizit drin steht, welche Taktfrequenz
du nehmen kannst, dann solltest du erst mal klein anfangen. Viele I2C
Geräte sind heute noch bis maximal 400kBit/s spezifiziert.
In deinem Code verwendest du keinerlei Timing wodurch die tatsächliche
Geschwindigkeit völlig undefiniert ist. Um deinen Fehler zu finden wäre
es sinnvoll, den Sensor an einen Controller mit Hardware I2C
Schnittstelle anzuschließen. Dann kannst du schnell rausfinden, ob deine
Software-I2C Version das Problem ist oder nicht.
Alternativ kannst du mal auf der Seite www.c51.de unter [1] den Link
"Buch_PraxisTeil2_Kap11.ZIP" herunterladen. Dort ist ebenfalls eine
Software-I2C Implementierung für 8051er enthalten. Diese ist aber weit
aus ausgereifter als deine Version.
Ciao,
Rainer
[1] http://www.c51.de/c51.de/Dateien/c51_buecher.php
Okay danke erstmal, wie gesagt, ich ging davon dass es geht und es ging
ja scheinbar auch, ich werd mich um die Timings kümmern und hoffen dass
es dann funktioniert :/
Das mit dem Ack-Bit hab ich mittlerweile schon ausgebessert, darauf wird
nun gewartet.
Mfg, Max