also habs jetzt erstmal so gemacht und er zeigt folgendes an:
CKCKCKCK...
63
63
63
63
.
.
.
63
ja das hab ich schon verstanden
ich meinte eigentlich das, was man in der asuro.c ändern muss, wenn man nicht die lib 2.8 verwendet?
also habs jetzt erstmal so gemacht und er zeigt folgendes an:
CKCKCKCK...
63
63
63
63
.
.
.
63
Hallo Sir,
das sieht ja nicht wirklich gut aus. Ich setzte mal voraus, dass der asuro bei der Messfahrt wirklich die 1 bis 1,5 m mit etwa 20 cm/sec zurückgefahren ist. Da der hexfile mit der zutreffenden lib compiliert wurde (bei mir ist dieser file ein Standardtest, wenn mal was zur Abstandsmessung nicht geht) müsste auch alles stimmen - WENN die hardware korrekt läuft. Die IR-Datenübertragung zum Flashen und für Daten läuft aber - wie wir sehen. Da weiß ich im Moment leider auch nicht weiter.
Ciao sagt der JoeamBerg
Also reagiert bei jeder Pulsbreite auf die gleich distanz, ca 1-3cm vor den tastern
Hm, irgendwie geht es jetzt wieder. Sehr sehr komisch. aber ich habe einen neuen Fehler. hab den folgenden code:
while(1)
{
ir=PIND & (1 << PD0);
if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK
{
FrontLED(OFF);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
//MotorSpeed(speed,speed);
}
else // HINDERNIS!!!!!!!!!!!!!!
{
BackLED(ON,ON);
FrontLED(ON);
.
.
.
nun gehen sowohl die BackLED's, als auch die FrontLED in diesem Fall nur an, falls in unmittelbarer nähe ein Hindernis auftaucht. Wenn ich MotorSpeed nun aber wieder als Befehl nehme, sprich die Motoren anschmeiße, dann leuchten die LED's permanent. Es wird also immerzu ein Hindernis erkannt, auch wenn weit und breit keins in seiner Richtung ist
Was ist die förmel fur ir1, ir2, ir3 und ir4? Oder welcher wert bekommen sie am anfang? Bitte poste das ganzen program. Wir können die If regel nicht entscheiden ohne diese hinweis.
also der code von radbruch ist ja folgender:
der funktioniert bei mir ausgezeichnetCode:#include "asuro.h" #include <stdlib.h> int main(void) { unsigned char sw, speed; unsigned char ir,ir1,ir2; Init(); DDRD |= (1 << DDD1); // Port D1 als Ausgang PORTD &= ~(1 << PD1); // PD1 auf LOW OCR2 = 0xFC; speed=140; ir = 0; ir1 = 0; ir2 = 0; ir3 = 0; ir4 = 0; while(1) { ir=PIND & (1 << PD0); if (ir || ir1){ BackLED(OFF,OFF); MotorDir(FWD,FWD); MotorSpeed(speed,speed); } else { BackLED(ON,ON); MotorDir(RWD,RWD); MotorSpeed(speed,speed); if (speed > 0) Msleep(500); MotorDir(BREAK,RWD); MotorSpeed(0,speed); if (speed > 0) Msleep(500); } ir2=ir1; ir1=ir; sw = PollSwitch(); /* if (sw & 0x01) OCR2 = 0xFE; if (sw & 0x02) OCR2 = 0xFD; */ if (sw & 0x04) OCR2 = 0xFC; if (sw & 0x08) OCR2 = 0xFB; /* if (sw & 0x10) OCR2 = 0xFA; if (sw & 0x20) OCR2 = 0xF9; */ } return 0; }
jetzt hab ich wie gesagt versucht, den etwas auszubauen, bzw abzuwandeln(sind sicher auch noch einige andere fehler drin)
ich hab erstmal den rest vom else-teil auskommentiert, um den fehlerbereich einzugrenzenCode:#include "asuro.h" #include <stdlib.h> int Abbiegtest(); int main(void) { unsigned char speed,Abbiegen; unsigned char ir,ir1,ir2,ir3,ir4; Init(); DDRD |= (1 << DDD1); // Port D1 als Ausgang PORTD &= ~(1 << PD1); // PD1 auf LOW OCR2 = 0xFE; speed=100; while(1) { ir=PIND & (1 << PD0); if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK { FrontLED(OFF); BackLED(OFF,OFF); MotorDir(FWD,FWD); MotorSpeed(speed,speed); } else // HINDERNIS!!!!!!!!!!!!!! { BackLED(ON,ON); FrontLED(ON); /*Abbiegen = 1 & rand(); if(Abbiegen == 0) // nach links lenken { MotorSpeed(110,130); Msleep(300); if (Abbiegtest() == 0) //wenn in die linke Richtung ein Hindernis kommt... { MotorSpeed(230,100); //...eine Sekunde nach rechts lenken Msleep(800); } else continue; } else { MotorSpeed(speed,130); Msleep(300); if (Abbiegtest() == 0) //wenn in die linke Richtung ein Hindernis kommt... { MotorSpeed(100,230); //...eine Sekunde nach rechts lenken Msleep(800); } else continue; }*/ } ir4 = ir3; ir3 = ir2; ir2 = ir1; ir1 = ir; } return 0; } int Abbiegtest () { unsigned char i,infr,infr1,infr2; OCR2 = 0xDE; infr = PIND & (1 << PD0); for(i=1;i<=50;i++) { if (infr||infr1) continue; else return 0; // Hindernis in der Richtung } infr2 = infr1; infr1 = infr; return 1; // kein Hindernis, Richtung kann weiterbehalten werden }
fakt ist, lass ich in dem teilden MotorSpeed an, springt er jedes mal nach dem Anschalten in den else-teilCode:if (ir || ir1 || ir2 || ir3 || ir4) // ALLES OK { FrontLED(OFF); BackLED(OFF,OFF); MotorDir(FWD,FWD); MotorSpeed(speed,speed); }
Kommentier ich es aus, Fangen die LEDs erst an zu leuchten, wenn ich zb mit der Hand vor meiner IR-Abteilung rumwinke
ich verzweifel hier langsam echt mit diesem tollen gefährt...
Ich hab jetzt folgende eine Zeile, die Radbruch auch drinne hatte, mitreingenommen, und plötzlich funktioniert es: sw = PollSwitch(); !!!! Kann mir das einer erklären?
also lediglich der Variablen "sw" den Wert der Taster zugewiesen mit "sw = PollSwitch();"Code:while(1) { sw = PollSwitch(); // <-------------------------------- HIER ir=PIND & (1 << PD0); if (ir || ir1) // ALLES OK { FrontLED(OFF); BackLED(OFF,OFF); MotorDir(FWD,FWD); MotorSpeed(speed,speed); } else // HINDERNIS!!!!!!!!!!!!!! { BackLED(ON,ON); FrontLED(ON); MotorSpeed(150,0); Msleep(1000); }
Hallo
Ich glaube nicht, dass PollSwitch() selbst diesen Effekt auslöst. Vielmehr scheint mir eine fehlende Verzögerung in der Hauptschleife in Verbindung mit IR-Störungen durch Fremdlicht (Leuchtstoff, Halogen, LCDs, CRTs..) die Ursache zu sein. Wenn solch ein verirrtes IR-Teilchen den Empfänger irritiert und er seinen Ausgang auf Low setzt, werden die IRx quasi in einem Rutsch eingelesen. Mit PollSwitch() wird das Einlesen der IRx aber durch ein paar zusätzliche Sleep()s verzögert. (ein Sleep() ist ein Takt Trägerfrequenz, der TSOP benötigt ca. 6-10 Takte der Trägerfrequenz für die Erkennung)
Ersetze mal in deinem Progamm sw=PollSwitch(); durch ein schlichtes Sleep(20);
Die Funktion PollSwitch() aus der asuro-LibraryCode:/* function to read out switches */ unsigned char PollSwitch (void) { unsigned int i; int ec_bak=autoencode; autoencode=FALSE; DDRD |= SWITCHES; // Switches as Output SWITCH_ON; // Output HIGH for measurement ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor Sleep(10); ADCSRA |= (1 << ADSC); // Start conversion while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete ADCSRA |= (1 << ADIF); // clear ADCIF i = ADCL + (ADCH << 8); SWITCH_OFF; Sleep(5); autoencode=ec_bak; //return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5)); //return ((10240000L/(long)i-10000L)*61L+5000L)/10000; return ((10240000L/(long)i-10000L)*63L+5000L)/10000; } Und noch die switches-Defines aus asuro.h dazu: #define SWITCHES (1 << PD3) #define SWITCH_ON PORTD |= SWITCHES #define SWITCH_OFF PORTD &= ~SWITCHES
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Lesezeichen