Nochmal Hallo! Ein Problem gelöst, ein neues tritt auf: Ich möchte acht HCSR-04 Ultraschallsensoren mit Atmega328P auslesen. Prinzipiell funktioniert alles soweit. Es tritt jedoch ein schwerwiegender Effekt auf. Zu Testzwecken habe ich erstmal nur einen Sensor angeschlossen (wobei ich das Programm auch schon mit mehreren getestet habe und es auch läuft, bis eben der Effekt auftritt) Wenn ich das Programm starte läuft alles gut. Über das Blinken einer Led lasse ich mir quasi den Abstand angeben, siehe main() im Code. Nun passiert manchmal folgendes: der Sensor (oder Programm) scheint sich aufzuhängen und liefert nur noch die Blinkfrequenz für <=10cm. Mir scheintes vor allem dann zu passieren, wenn ich quasi auf den Sensor haue, also schnell die Entfernung bis fast null verkürze (allerdings nicht näher als 2cm). Das kuriose: ich kann den Sensor/Programm auch wieder aus dieser Aufhängung befreien, dann läuft alles wie vorher. Dies scheint mir vor allem dann zu passieren, wenn ich einen relativ großen Abstand messen lasse. Danach läuft das Programm wie es soll, wenn ich davor etwas wild rumfuchtel hängt es sich wieder auf und läßt sich wieder befreien. Hat irgendwer eine Idee? Ich vermute einen Fehler in der funktion getDistanceHCSR04(), kann ihn aber nicht finden. Der Effekt tritt nämlich mit verschiedenen Sensoren (habe insgesamt 8), Kabeln und Eingängen auf. Board, Schaltplan, Testcode oben. Die Sensoren sind je auf einer Extraplatine mit 10uf Buffer. Alles hängt an einem 5v-Netzteil (liefert 5,68V, max. 40A). Die Kabel sind (nach außen) geschirmt, jedoch nich die Trigger/Echo Leitungen gegeneinander. Sind gute 0,25mm Low-Noise-Kabel. Das längste Kabel ist 2,2m. Ansonsten hätte ich noch eine andere Frage: Würdet ihr bei den längen und Kabelqualität einen LC-Filter (am Trigger-Eingang der Sensoren bzw. Echo-Eingang des Atmega einbauen? Hätte 10nf-Drosseln rumzuliegen, dachte aber, das wäre nicht nötig. Das jetzige Problemkommt daher vermutlich nicht. Kurz noch zum Code: jeder Sensor hat einen Trigger- sowie EchoPin. Über PCI wird die Laufzeit gemessen. Der Code ist etwas unschön, viele #defines und switch-cases, aber mehr bekomm ich als Anfängerin noch nicht hin. Und bis auf diesen komischen Effekt läufts gut und schnell. Wenns fertig ist sollen da zwei WS2812b-Strips angeschlossen werden und alles so instaliert werden, dass einen über eine länge von 5m ein Lichtspot verfolgt. Danke fürs Durchlesen und schönen Feierabend!
Nachtrag: also, weiteres rumspielen ergab: den gleichen komischen Effekt habe ich, wenn ich das Anschlusskabel offen lasse. Das würde auf ein Kabelproblem hindeuten. Allerdings: ohne irgendwas zu berühren kann ich den Effekt ja wieder abstellen. Außerdem: ich kann den Effekt auch manchmal, so bei jedem 5. Mal, hervorrufen, wenn ich den an USB angeschlossenen Programmer anlege. Ein Reset hilft manchmal, sehr oft, aber nicht immer. Bin ratlos. Würde mich freuen, wenn sich wer mal das Platinenlayout anschaut und ne Meinung dazu abgibt, liegt vielleicht doch nicht am Code, aber mir fehlt grad der Abstand um auf irgendwas kluges zu kommen...
Ohne alles in Gänze gelesen zu haben: Kann es sein, dass ein externer Interrupt ununterbrochen auf Burst Signale reagiert und deswegen das Programm unerwartete Dinge tut?
@gerd: ich versteh deinen Kommentar nicht ganz. Externe Interrupts benutze ich nicht, die PCIs schalte ich nur zur Zeitmessung an und direkt danach wieder aus... Und das Programm läuft auch lange gut, dann irgendwann nicht mehr. Einmal Reset gedrückt, und alles läuft wieder. @alle: Wie gesagt, manchmal passiert es, wenn ich den Programmer auf meine ISP-Buchse stecke. Mit gestecktem Stecker machen Programme ja öfter komische Sachen. Warum denn eigentlich? Vielleicht löse ich über meinen Aufbau oder Software ja das gleiche Problem aus...
Wenn dein Programm immer mal hängt, scheint es ja noch ein Problem im Programm zu sein. Das würde ich erst lösen. Evtl. wird ein Spezialfall nicht abgefangen, den man unter Umständen durch die Verkabelung auslösen kann oä. Mach am besten an keiner Stelle Annahmen wie (hier ganz Allgmeine ohne Bezug auf deinen Code): Die Variable muss ja sowieso > 0 sein; das hier kann niemals überlaufen; Die Variable ist ja initialisiert; die while Schleife wird ganz sicher irgendwann mal aufhören; usw.
mein tip wäre: gewöhne dir an, datenblätter zu lesen! ich hatte mal dasselbe problem, schaute ins datenblatt, fand dort, nicht versteckt, den satz: "we suggest to use over 60ms measurement cycle, in order to prevent trigger signal to the echo signal". deine abfrage arbeitet unter bestimmten umständen im 50ms-zyklus. und dein problem passt verblüffend gut zu diesem hinweis, oder? dann änderte ich meinen abfrage-zyklus und alles lief perfekt! soll jetzt nicht arrogant klingen. ich hab auch bestimmt ein jahr gebraucht, bis ich den nutzen von diesen datenblättern so richtig zu schätzen wußte. und fand vorher die leute hier im forum, die oft als erstes antworten: "schau erstmal ins datenblatt" nervig. aber die wissen schon, was sie sagen! viel erfolg beim rest!
Danke Sonic, würde wirklich einiges, eigentlich alles, erklären. Ich probiers nachher aus, gehe aber stark davon aus, dass das die Lösung ist! Zu meiner Ehrenrettung muß ich sagen: das Forum meines Vertrauens gibt dieses Datenblatt preis, da hatte ich auch reingeschaut: https://www.mikrocontroller.net/attachment/218122/HC-SR04_ultraschallmodul_beschreibung_3.pdf "Ein Messintervall hat eine Dauer von 20ms. Es können also 50 Messungen pro Sekunde durchgeführt werden" Da kamen mir meine 50ms mehr als doppelt sicher vor... Aber da hab ich vielleicht einen der billigeren Klone erwischt... In vielen anderen Datenblättern im Netz steht dein zitierter Hinweis. Danke, ich geb später mal Bescheid... Hätte ich auch selbst mal drauf kommen können, ist ja schnell ausprobiert... Jetzt versteh ich Gerd auch viel besser... Dank euch beiden!
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.