PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ASURO - Odometrie funktioniert nicht richtig



luma
06.08.2005, 21:55
Hio. Also ich habe nur Probleme mit den Odometriezähler von Asuro. Als nach einiger Zeit immer noch jedes Programm das mit den Odometriezähler gearbeitet hat, hab ich mal einen kleinen Test durchgeführt und bekamm bizarre Ergebnisse.
Ich hab den Programmcode im Anhang drin. (Falls sich jemand wundert: Das ist die erweiterte Bibliothek von Weja. Ich hab noch ein bisschen dran gebastelt und alles Kommentiert.). Wenn man jetzt unter Windows HyperTerminal startet und auf Empfang geht, wird man sich schnell wundern. Der Asuro dreht sich ganz langsam und gibt die aktuellen Odometriwerte auf der Konsole aus. Allerdings gibt's da manchmal extreme Sprünge (also von 18 auf 250). Woran liegt das? Selbst wenn ich das Ding anschalte und es dann festhalte (es sich also nicht bewegt) gibt Asuro schon einen Wert > 0 zurück!?! Hää!? Kann mir da vielleicht jemand helfen. Ich wäre ihm sehr dankbar!
Im Anhang ist der Code. Ich habe noch ein paar Fragen dazu:
Linie 63: Wiese wird toggle nicht erst initialisiert? Wieso ist toggle static und was bedeutet static? Wiso wird der AD-Wandler so ausgelesen? Da sind doch immer 2 Schritte nötig (x = ADCL; und x += (ADCH<<8);)?!?
Linie 70 & 75: Wiso werden da nur so kleine Werte getestet? Ich dachte die liegen zw. 0 und 1023?
Was ist ADLAR und was bewirkt es?

Danke für eure Hilfe. Lutz

waste
07.08.2005, 00:59
Hallo luma

static bedeutet dass die Variable ihren Wert auch nach Verlassen der Routine behält. Das muss so sein, sonst wäre toggle nach jedem neuen Aufruf 0.
In der Routine wird der AD-Wandler linksbündig ausgelesen (ADLAR = 1). Dann reicht es, wenn man nur die 8 höchstwertigen Bits ausliest und auf die 2 niederwertigsten verzichtet. Deshalb wird auch nur auf 128 getestet. Für eine detailierte Erklärung, such im Datenblatt nach ADLAR.

Zu deinem eigentlichen Problem kann ich nichts sagen, hab dein Programm nicht getestet.

Waste

luma
07.08.2005, 14:53
Teste es bitte...

waste
07.08.2005, 18:07
Bei mir sind auch schon Anfangswerte zu sehen. Probier mal meine angehängte hex-Datei. Die sollte funktionieren. Wenn sie bei dir auch funktioniert, dann kommen wir der Ursache hoffentlich bald näher.

Waste

luma
07.08.2005, 22:10
Hio waste. Das Programm funktioniert wunderbar! Hast du mir vielleicht den Code dazu? Hab noch ne kleine Abdeckung in Form von 2 Tesastreifen über die Lichtschrankenbauteile geklebt und die dann geschwärtzt so das von Außen kein/wenig Licht den Fototransistor erreicht.
Also, schick mir doch bitte den Code.

Lutz

waste
07.08.2005, 22:54
Ich hab dein Programm genommen und auf die Funktionen der originalen asuro.c zurück geändert (siehe Code) und dann mit den ursprünglichen asuro.c und asuro.h compiliert.

Irgendwo hast du bei deinen Änderungen in asuro.c oder asuro.h einen Bug eingebaut.

Waste

#include "asuro.h"

int main(void)
{
Init();
Encoder_Init();

StartSwitch();
MotorDir(FWD, BREAK);
MotorSpeed(101, 0);
do
{
PrintInt(encoder[0]);
PrintInt(encoder[1]);
}
while(!switched);
MotorSpeed(0, 0);

return 0;
}

luma
08.08.2005, 17:16
Hio. Ich hatte einfach ne zu kleine Zahl bei der if-Abfrage in der ADC-... IRS (normal 160, ich 128). Wär wohl besser wenn man den ganzen Wert aus dem AD-Wandler auslesen würde und nicht nur einen Teil. Wie macht man denn das?

waste
08.08.2005, 18:05
Wär wohl besser wenn man den ganzen Wert aus dem AD-Wandler auslesen würde und nicht nur einen Teil. Wie macht man denn das?
Indem ADLAR nicht auf 1 gesetzt wird und der ADC folgendermassen ausgelesen wird:

data = ADCL + (ADCH << 8);
Siehe auch die Funktion OdometrieData, da wird es so gemacht.

Ich würde auch noch eine Hysterese einbauen und den unteren Wert auf < 550 und den oberen Wert auf > 650 abfragen.

Waste

luma
11.08.2005, 13:52
data = ADCL + (ADCH << 8);

Das hatte ich schon probiert.



Ich würde auch noch eine Hysterese einbauen und den unteren Wert auf < 550 und den oberen Wert auf > 650 abfragen.

Weil ich das machen wollte.

Hatte aber nicht funktioniert weil ich das nicht hatte:


Indem ADLAR nicht auf 1 gesetzt wird


;)