Kagee
01.12.2010, 19:18
Hallo.
Bei meinem Asuro ist die IR-Modifikation von waste drauf(siehe https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11114).
Nun dachte ich mir verwendeste mal die IR-Schnittstelle zur Hinderniserkennung und Umfahren von Objekten. Ich habe den Beispielcode aus dem Thread genommen und dies getestet, etwas vereinfacht und es funktionierte wunderbar:
#include "asuro.h"
#include <stdlib.h>
void InitIRDetect(void)
{
UCSRB = 0;
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFD; //Pulsbreite 2
}
int main(void)
{
Init();
InitIRDetect();
while (1)
{
UCSRB = 0;
if (PIND & (1 << PD0))
StatusLED(GREEN);
else
StatusLED(RED);
}
return 0;
}
Man sieht mit dem Programm sehr schön die Annäherung des Objektes. Die Schleifendurchläufe mit roter LED nehmen bei Annäherung immer mehr zu, bis die LED irgendwann ganz rot ist - so weit so gut (ich verwende immer den Wert ßxFD für die Pulsbreite).
Nun wollte ich natürlich, dass der Asuro dies auch während der Fahrt tut. Wenn ich nun aber nur die Anweisung den Motoren zu starten einfüge, geht die Hinderniserkennung gar nicht mehr PortD Pin0 ist dauerhaft low, die LED belibt grün.
#include "asuro.h"
#include <stdlib.h>
void InitIRDetect(void)
{
UCSRB = 0;
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFD; //Pulsbreite 2
}
int main(void)
{
Init();
InitIRDetect();
MotorSpeed(64,64); //Ohne diese Zeile gehts es wie gedacht
while (1)
{
UCSRB = 0;
if (PIND & (1 << PD0))
StatusLED(GREEN);
else
StatusLED(RED);
}
return 0;
}
Nun habe ich herausgefunden, dass die Funktion der IR-Erkennung davon abhängt, was durch MotorSpeed in die Register OCR1A und OCR1B reingeschrieben wird: Bei 64 funktioniert es noch gerade so (es werden sehr wenige Reflexionen erkannt, aber es werden noch welche erkannt), bei 100 wird nichts mehr erkannt. Bei 20 ist es quasi wie bei 0.
Das blöde dabei ist freilich, dass der Asuro sich bei 64 für OCR1A und OCR1B nicht bewegt. Folglich funktioniert die Erkennung nicht in der Bewegung. Da ich hier im Forum und an anderen Stellen des Internets niemanden mit demselben Problem fand, schließe ich auf einen Fehler meinerseits.
Hat ihn wer gefunden?
Bei meinem Asuro ist die IR-Modifikation von waste drauf(siehe https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=11114).
Nun dachte ich mir verwendeste mal die IR-Schnittstelle zur Hinderniserkennung und Umfahren von Objekten. Ich habe den Beispielcode aus dem Thread genommen und dies getestet, etwas vereinfacht und es funktionierte wunderbar:
#include "asuro.h"
#include <stdlib.h>
void InitIRDetect(void)
{
UCSRB = 0;
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFD; //Pulsbreite 2
}
int main(void)
{
Init();
InitIRDetect();
while (1)
{
UCSRB = 0;
if (PIND & (1 << PD0))
StatusLED(GREEN);
else
StatusLED(RED);
}
return 0;
}
Man sieht mit dem Programm sehr schön die Annäherung des Objektes. Die Schleifendurchläufe mit roter LED nehmen bei Annäherung immer mehr zu, bis die LED irgendwann ganz rot ist - so weit so gut (ich verwende immer den Wert ßxFD für die Pulsbreite).
Nun wollte ich natürlich, dass der Asuro dies auch während der Fahrt tut. Wenn ich nun aber nur die Anweisung den Motoren zu starten einfüge, geht die Hinderniserkennung gar nicht mehr PortD Pin0 ist dauerhaft low, die LED belibt grün.
#include "asuro.h"
#include <stdlib.h>
void InitIRDetect(void)
{
UCSRB = 0;
DDRD |= (1 << DDD1); // Port D1 als Ausgang
PORTD &= ~(1 << PD1); // PD1 auf LOW
OCR2 = 0xFD; //Pulsbreite 2
}
int main(void)
{
Init();
InitIRDetect();
MotorSpeed(64,64); //Ohne diese Zeile gehts es wie gedacht
while (1)
{
UCSRB = 0;
if (PIND & (1 << PD0))
StatusLED(GREEN);
else
StatusLED(RED);
}
return 0;
}
Nun habe ich herausgefunden, dass die Funktion der IR-Erkennung davon abhängt, was durch MotorSpeed in die Register OCR1A und OCR1B reingeschrieben wird: Bei 64 funktioniert es noch gerade so (es werden sehr wenige Reflexionen erkannt, aber es werden noch welche erkannt), bei 100 wird nichts mehr erkannt. Bei 20 ist es quasi wie bei 0.
Das blöde dabei ist freilich, dass der Asuro sich bei 64 für OCR1A und OCR1B nicht bewegt. Folglich funktioniert die Erkennung nicht in der Bewegung. Da ich hier im Forum und an anderen Stellen des Internets niemanden mit demselben Problem fand, schließe ich auf einen Fehler meinerseits.
Hat ihn wer gefunden?