linuxer7
14.06.2012, 10:58
Hallo Leute.
Ich habe mir einen kleinen Roboter gebaut um etwas mit der Hardware und Software (Bascom) zu spielen.
Die Hardware besteht im wesentlichen aus 2 Conrad Gleichstrommotoren mit 1:50 Untersetzung und einem Atmega16 der mit 16Mhz getaktet wird.
Die Dreherkennung der Räder erfolgt über eine Gabellichtschranke und einem Lochrad auf der Achse der Räder.
Nachdem ich anfangs das ganze über eine Prozedur abgefragt hatte (Schleife) bin ich nun dazu übergegangen die Impulse der "Odometer" auf Int0 und Int1 zu legen und eine variable hoch zu zählen die dann aus dem ganzen Programm abgefragt werden kann.
Das ganze funktioniert auch soweit bis auf einen Kleinigkeit. Links wird doppelt gezählt aber nur dann wenn "beide" Motoren laufen.
Drehe ich die Motoren von Hand, oder steuere ich sie einzeln an dann funktioniert es ohne Probleme und beide zähler zeigen den gleichen Wert an.
Beide Motoren laufen auch synchron. Frage ich den rechten Zähler ab und stoppe die Motoren nach 16 Impulsen dann ist das genau eine Umdrehung mit beiden Motoren. Der rechte Zähler zeigt 16 an während der linke 32 anzeigt.
Die Auswertung des Interrupts der Ports erfolgt mit fallender Flanke.
Einen Verdrahtungsfehler am Port (Brücke) liegt nicht vor sonst würde der Zähler auch im Handbetrieb doppelt zählen Die Hardware funktioniert soweit.
Ein Oszi habe ich leider nicht um eventuelle Störungen im Signal zu verfolgen.
Ich habe absolut keine Ahnung woran das liegen kann das der Linke doppelt zählt.
Vielleicht findet jemand von euch den Fehler. Ich beschäftige mich zu ersten mal mit Interrupts und habe möglicherweise irgendwo einen Fehler gemacht.
In der "Sub Prog_test()" Routine befindet sich die Auswertung der Impulse.
Ich habe als Anhang das Testprogramm angehängt.
Das Testprogramm ist eine abgespeckte Version des Hauptprogrammes. Folglich liegen noch ein paar variablen herum die ich nicht entsorgt habe.
Und, ja ich weiss man kann es besser machen :)
Hoffende Grüße
Thomas
Ich habe mir einen kleinen Roboter gebaut um etwas mit der Hardware und Software (Bascom) zu spielen.
Die Hardware besteht im wesentlichen aus 2 Conrad Gleichstrommotoren mit 1:50 Untersetzung und einem Atmega16 der mit 16Mhz getaktet wird.
Die Dreherkennung der Räder erfolgt über eine Gabellichtschranke und einem Lochrad auf der Achse der Räder.
Nachdem ich anfangs das ganze über eine Prozedur abgefragt hatte (Schleife) bin ich nun dazu übergegangen die Impulse der "Odometer" auf Int0 und Int1 zu legen und eine variable hoch zu zählen die dann aus dem ganzen Programm abgefragt werden kann.
Das ganze funktioniert auch soweit bis auf einen Kleinigkeit. Links wird doppelt gezählt aber nur dann wenn "beide" Motoren laufen.
Drehe ich die Motoren von Hand, oder steuere ich sie einzeln an dann funktioniert es ohne Probleme und beide zähler zeigen den gleichen Wert an.
Beide Motoren laufen auch synchron. Frage ich den rechten Zähler ab und stoppe die Motoren nach 16 Impulsen dann ist das genau eine Umdrehung mit beiden Motoren. Der rechte Zähler zeigt 16 an während der linke 32 anzeigt.
Die Auswertung des Interrupts der Ports erfolgt mit fallender Flanke.
Einen Verdrahtungsfehler am Port (Brücke) liegt nicht vor sonst würde der Zähler auch im Handbetrieb doppelt zählen Die Hardware funktioniert soweit.
Ein Oszi habe ich leider nicht um eventuelle Störungen im Signal zu verfolgen.
Ich habe absolut keine Ahnung woran das liegen kann das der Linke doppelt zählt.
Vielleicht findet jemand von euch den Fehler. Ich beschäftige mich zu ersten mal mit Interrupts und habe möglicherweise irgendwo einen Fehler gemacht.
In der "Sub Prog_test()" Routine befindet sich die Auswertung der Impulse.
Ich habe als Anhang das Testprogramm angehängt.
Das Testprogramm ist eine abgespeckte Version des Hauptprogrammes. Folglich liegen noch ein paar variablen herum die ich nicht entsorgt habe.
Und, ja ich weiss man kann es besser machen :)
Hoffende Grüße
Thomas