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!