Archiv verlassen und diese Seite im Standarddesign anzeigen : Kann das mal jemand ausprobieren ??
Hallo,
ich habe ein kleiens Programm für den Roboter zur C2 geschrieben. Da meine C2 nicht funktioniert wäre es nett, wenn das mal jemand bei sich ausprobiert.
Zusätzlich zum Modul muss noch das Modul "ccrp5" aus Gemeinsame module geladen sein
Das Programm soll den Roboter vorwärts fahren lassen. Sobald das ACS ein Hinderniss erkennt soll er das auf den Dioden ausgeben und anhalten.
Hier der Code
thread main
{
// Deklaration der Variablen
string s;
int VALUE;
int STATUS;
// Modul initialisieren
VALUE=ccrp5.init();
// Reset
ccrp5.clear();
// Alle LED´s aus
ccrp5.LEDSoff();
// Empfindlichkeit des ACS Systems auf höchste Sensitivität
ccrp5.setACSHI();
// Beginn der Schleife
loop
{
// Subsystem abfragen
STATUS=ccrp5.getCNSTAT();
// Wenn der rechter Sensor anspricht
if (STATUS and 0x01)==1
{
// .. dann LED 4 an
ccrp5.LEDon(4);
// .. dann Stopp
ccrp5.FWD(0,0);
}
// .. sonst
else
{
// .. LED 4 aus
ccrp5.LEDoff(4);
// .. vorwärts, Geschwindigkeit 150
ccrp5.FWD(150,150);
}
// Wenn der linke Sensor anspricht
if (STATUS and 0x02)==2
{
// .. dann LED 1 an
ccrp5.LEDon(1);
// .. dann Stopp
ccrp5.FWD(0,0);
}
// .. sonst
else
{
// .. LED 1 aus
ccrp5.LEDoff(1);
// .. vorwärts, Geschwindigkeit 150
ccrp5.FWD(150,150);
}
}
}
Danke im voraus
Gruß
Thomas
Programmzeilen bitte möglichst so posten, das diese mit dem CODE Befehl eingeschlossen werden. Einfach Programmzeilen markieren und dann CODE klicken. Dann ist das ganze viel übersichtlicher, ansonsten steigt man kaum durch wegen der fehlenden Strukturierung. Ich hab´s mal bei dir geändert.
Gruß Frank
Hallo Thomas ,
mach die beide (else) weg, und schreib eine neue if-Abfrage etwa so:
thread main
{
// Deklaration der Variablen
string s;
int VALUE;
int STATUS;
// Modul initialisieren
VALUE=ccrp5.init();
// Reset
ccrp5.clear();
// Alle LED´s aus
ccrp5.LEDSoff();
// Empfindlichkeit des ACS Systems auf höchste Sensitivität
ccrp5.setACSHI();
// Beginn der Schleife
loop
{
// Subsystem abfragen
STATUS=ccrp5.getCNSTAT();
if(STATUS and 0x01)==0{
ccrp5.FWD(150,150);
} // Wenn der rechter Sensor anspricht
if (STATUS and 0x01)==1
{
// .. dann LED 4 an
ccrp5.LEDon(4);
// .. dann Stopp
ccrp5.FWD(0,0);
}
// .. sonst
// Wenn der linke Sensor anspricht
if (STATUS and 0x02)==2
{
// .. dann LED 1 an
ccrp5.LEDon(1);
// .. dann Stopp
ccrp5.FWD(0,0);
}
}
}
dann funktioniert s
Gruß Maro
Hallo Maro,
meinst du das dann so, oder habe ich dich falsch verstanden ?? Wieso kann ich denn hier kein else benutzen ?
thread main
{
// Deklaration der Variablen
string s;
int VALUE;
int STATUS;
// Modul initialisieren
VALUE=ccrp5.init();
// Reset
ccrp5.clear();
// Alle LED´s aus
ccrp5.LEDSoff();
// Empfindlichkeit des ACS Systems auf höchste Sensitivität
ccrp5.setACSHI();
// Beginn der Schleife
loop
{
// Subsystem abfragen
STATUS=ccrp5.getCNSTAT();
// Wenn der rechter Sensor anspricht
if (STATUS and 0x01)==1
{
// .. dann LED 4 an
ccrp5.LEDon(4);
// .. dann Stopp
ccrp5.FWD(0,0);
}
// Wenn der rechter Sensor nicht anspricht
if (STATUS and 0x01)==0
{
// .. dann LED 4 aus
ccrp5.LEDoff(4);
// .. dann vorwärts, Geschwindigkeit 150
ccrp5.FWD(150,150);
}
// Wenn der linke Sensor anspricht
if (STATUS and 0x02)==2
{
// .. dann LED 1 an
ccrp5.LEDon(1);
// .. dann Stopp
ccrp5.FWD(0,0);
}
// Wenn der linke Sensor nicht anspricht
if (STATUS and 0x02)==0
{
// .. dann LED 1 aus
ccrp5.LEDoff(1);
// .. dann vorwärts, Geschwindigkeit 150
ccrp5.FWD(150,150);
}
}
}
Danke im voraus
Thomas
Hallo Thomas,
Dein Programm wird funktionieren, wenn du alle If-Abfragen so schreibst:
if(STATUS and 0x03) und nicht mal 0x03, mal 0x02 ....
die müssen alle 0x03 sein.
Die letzte if Abfrage if (STATUS and 0x02)==0 brauchst du nicht,denn du hast das schon biem ersten If abgefragt, aber wie gesagt das hier if (STATUS and 0x02)==0 ist sowieso falsch , es muss 0x03 und nicht 0x02 sein.
Thomas es ist ganz einfach , du bracuhst nur diese 4 Fälle zu beachten:
if (STATUS and 0x03)==0 // wenn garnichts erkant wird
if (STATUS and 0x03)==1 // wenn rechter sensor angesprochen wird
if (STATUS and 0x03)==2 // wenn linker sensor angesprochen wird
if (STATUS and 0x03)==3 // wenn beide sensoren angesprochen werdenGruß Maro
Hallo Maro,
erstma danke für deine Hilfe. das mit dem ansprechen ist allerdings nicht auf meinem "Mist" gewachsen, sondern das habe ich aus einem Beispielprogramm zur C2 abgeleitet. Das entsprechende Codefragment hänge ich hier mal. Den abgeänderten Code Poste ich dann morgen noch mal. Wäre Super wenn Du dann noch mal drüberschauen könntest
//-------------------------------------------------------
//--- ACS VISUALIZATION WITH LEDs ---
//-------------------------------------------------------
function showACS()
{
int STATUS;
ccrp5.LEDSoff();
ccrp5.setACSLO();
loop
{
sleep 10;
STATUS=ccrp5.getCNSTAT();
if (STATUS and 0x01)==1
{ccrp5.LEDon(4);}
else
{ccrp5.LEDoff(4);}
if (STATUS and 0x02)==2
{ccrp5.LEDon(1);}
else
{ccrp5.LEDoff(1);}
}
}
Gruß
Thomas
P.S.:
Hier der geänderte Code
thread main
{
// Deklaration der Variablen
string s;
int VALUE;
int STATUS;
// Modul initialisieren
VALUE=ccrp5.init();
// Reset
ccrp5.clear();
// Alle LED´s aus
ccrp5.LEDSoff();
// Empfindlichkeit des ACS Systems auf höchste Sensitivität
ccrp5.setACSHI();
// Beginn der Schleife
loop
{
// Subsystem abfragen
STATUS=ccrp5.getCNSTAT();
// Wenn der rechter Sensor anspricht
if (STATUS and 0x03)==1
{
// .. dann LED 4 an
ccrp5.LEDon(1);
// .. dann Stopp
ccrp5.FWD(0,0);
}
// Wenn der linke Sensor anspricht
if (STATUS and 0x03)==2
{
// .. dann LED 1 an
ccrp5.LEDon(4);
// .. dann Stopp
ccrp5.FWD(0,0);
}
// Wenn keiner der Sensoren anspricht
if (STATUS and 0x03)==0
{
// .. dann vorwärts, Geschwindigkeit 150
ccrp5.FWD(150,150);
}
}
}
Hallo Thomas,
Ich hab den geänderte Code nicht ausprobiert, aber ich würde sagen dass, er richtig ist. Hat es bei dir gut funktioniert????
Versuch das ganze nochmal aber ohne die (0x03) in der If-Abfrage, versuch es nur mit STATUS, und sag mir Bescheid ob es auch funktioniert.
Gruß
Maro
Hallo Maro,
würde ich gerne, kann es aber nicht ausprobieren, da meine C2 nicht will und sich daher heute auf dem Heim weg zu Conrad macht.
Kann st du mir vielleicht erklären, warum im Beispiel 0X02 verwandt wird ?
Gruß
Thomas
Hi Thomas,
Ich habe es vorher nicht gesehen, da steht 0x02 in Demo1. Aber ich hab immer mit Demo 2 gearbeitet, da steht 0x03 :-s .
Ich weiss es ehrlich nicht,vielleicht sollma die Experte fragen.
Aber es hat mit 0x02 nicht funktioniert gelll?????
Gruß Maro :-s
Hallo Rola und Maro,
kurze Erklärung für die 0x03 Geschichte:
In der Anleitung zur CC2 Seite 57 werden die Formate der Zahlentypen erklärt:
0x03 ist eine Hexadezimalzahl (dezimal: 3). Hinter dem x stehen die Zahlen 0..9 und die Buchstaben A..F (=Werte: 10..15). Der Dezimalwert 255 ist dann 0xFF.
Zahlen mit 0b01000001 (dezimal: 65) sind Binärzahlen, hinter dem b kommen also nur Nullen und Einsen (Bits).
Egal wie man das schreibt, kann man mit AND und OR sog. Maskierungen durchführen:
AND dient dabei zum Löschen von Bits:
WERT=WERT AND 0b00000011
... verknüpft WERT mit der Maske dezimal 3. Damit werden alle Bits von WERT auf 0 gesetzt, die in der Maske auch 0 sind. Das sind hier die Bits 2..7 (Zählung 0..7). Das ist genau das Beispiel im Programm mit:
WERT=WERT AND 0x03
Hier werden nur die Bits 0 und 1 "durchgelassen", d.h. sie behalten DEN Wert (0/1), den sie auch in WERT haben.
OR dient zum Setzen von Bits:
WERT=WERT OR 0x03
... verknüpft WERT mit der Maske dezimal 3. Damit werden alle Bits von WERT auf 1 gesetzt, die auch in der Maske 1 sind (hier Bits 0 und 1). Die anderen Bits bleiben so, wie sie in WERT waren.
Gruß Dirk
Hallo
@Maro
ich kann es ja leider nicht ausprobieren udnsomit funktioniet fast alles
@Dirk
Danke für die Erklärung, aber die Frage welches jetzt richtigt ist hat es mir leider nicht beantwortet. was ist denn nun richtig ???
Gruß
Thomas
Hallo Thomas,
... was ist denn nun richtig ???
Dir kommt es ja auf die Bits 0 und 1 von STATUS an. Das Maskieren geht dann so:
AND 0x01 --> wird <> 0, wenn Bit 0 = 1 ist (andere Bits egal!).
AND 0x02 --> wird <> 0, wenn Bit 1 = 1 ist (andere Bits egal!).
AND 0x03 --> wird <> 0, wenn Bit 0 oder Bit 1 oder beide Bits = 1 sind.
AND 0x03 ist identisch mit AND 0b00000011
Wie Du das dann in Deinem Programm umsetzt, ist Deine Sache. Da Du das ACS rechts/links auslesen willst, wären die Tests dazu:
if (STATUS and 0x01)<>0 --> links
if (STATUS and 0x02)<>0 --> rechts
if (STATUS and 0x03)<>0 --> links und/oder rechts
Gruß Dirk
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.