PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Merkwürdiges verhalten von LineData



Pedd0r
13.01.2013, 11:13
Hallo,

ich bin am verzweifeln beim Asuro. Eigentlich schien alles zu funktionieren und der Selbsttest tat das, was er soll, aber jetzt versuche ich, den Asuro einer Linie folgen zu lassen. Ich hab mein Problem nach ewigen hin und herfummeln zumindest schon mal erkannt: Die LineData() Methode spukt nicht aus, was sie soll!
Dazu hab ich hier mal dieses Codeschnippsel gemacht, jetzt verhält sich das Ding folgendermaßen: Bei ersten durchlauf bekomme ich tatsächlich einen vernünftigen Wert für den linken Fototransistor geliefert, danach aber immer nur 0! Um zu sehen, ob meine Serielle Ausgabe falsch ist, hab ich auch noch das Status LED angesteuert, was so viel heißt, dass meine Werte wohl wirklich 0 ist! Das ist doch sehr komisch, zumal es ja bei allerersten Durchlauf nicht 0 ist, also muss der Foto-Transistor ja schon irgendwie funktionieren, oder?


unsigned int data[2];
while (1)
{ data[0] = 0;
data[1] = 0;
LineData(data);
SerWrite("Links ", 6);
warte(100);
writeUint(data[0]);
warte(100);
SerWrite("Rechts ", 7);
warte(100);
writeUint(data[1]);
warte(1000);
SerWrite("\n\r", 2);
if (data[1] > 500)
{ if (data[1] >1024)
StatusLED(GREEN);
else
StatusLED(YELLOW);

}
else
if (data[1] >1 || data[0] > 1)
StatusLED(RED);
else StatusLED(OFF);

while(PollSwitch() < 1)
warte(1);
}

radbruch
13.01.2013, 11:53
Hallo

Die Werte der Liniensensoren sind viel geringer, einstellig, wenn die FrontLED nicht eingeschaltet ist. Grundsätzlich funktioniert es mit den kleinen Werten auch ganz gut, aber man kann das auch steigern:

https://www.roboternetz.de/community/threads/26143-Vollausschlag-für-die-Fotosensoren

Gruß

mic

Pedd0r
13.01.2013, 12:21
okay, aber das hilft mir gerade in meinem Fall nicht weiter. Habs auch mal mit der FrontLED an versucht und es ändert nichts daran, dass LineData weiterhin 0 für beide ausgibt!

radbruch
13.01.2013, 12:51
Hallo

Zweiter Versuch:
Bei ersten Durchlauf bekomme ich tatsächlich einen vernünftigen Wert für den linken Fototransistor geliefert,Gibt es so immer noch einen "vernünftigen" Wert bei der ersten Lesung?
while (1)
{ data[0] = 0;
data[1] = 0;
LineData(data);
LineData(data);
SerWrite("Links ", 6);
warte(100);
writeUint(data[0]);
Hintergrund: Die erste Lesung nach dem Umschalten des ADC-Kanal (oder der Referenz) kann fehlerhaft sein. Wenn mit dieser Änderung für Links kein vernünftiger erster Wert gelesen werden kann, sind vielleicht die Liniensensoren T9 und T10 falschrum eingelötet. Die würden dann, unabhängig von der Beleuchtungsstärke, immer sperren und die Pegel an ADC2 und ADC2 wären durch die PullDowns R14 und R15 immer auf Null Volt.

Gruß

mic

Pedd0r
13.01.2013, 16:17
Hm, leider nein,

ich versteh es auch nicht, ich hab jetzt den Schaltplan nochmal durchgecheckt, die Widerstände 14 und 15 sind die richtigen, 20kOhm, und die Fototransistoren sind auch richtig rum drin. Mir ist das ganze ein Rätsel gerade.

radbruch
14.01.2013, 09:47
Hallo


if (data[1] > 500)
{ if (data[1] >1024)
StatusLED(GREEN);
else
StatusLED(YELLOW);

}
else
if (data[1] >1 || data[0] > 1)
StatusLED(RED);
else StatusLED(OFF);

Da die Linienwerte beim orginal bestückten asuro nie 500 erreichen, sollte der erste if-Zweig nie ausgeführt werden. Mehr als 1023 werden es sicher auch nie sein, denn die Funktion liefert nur einen 10-Bit-Wert. Also reduzieren wir mal aufs wesentliche:


unsigned int data[2];
while (1)
{
LineData(data);
data[0]=2; // Test der Funktionalität der Anzeige
if (data[1] >1 || data[0] > 1)
StatusLED(RED);
else {StatusLED(OFF); while(1);} // Programmende!

while(PollSwitch() < 1) warte(1);
}
Funktioniert die Anzeige mit der StatusLED wie erwartet, wenn man data[0] auf 2 setzt?

Gruß

mic