- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Kann das mal jemand ausprobieren ??

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.08.2004
    Beiträge
    6

    Kann das mal jemand ausprobieren ??

    Anzeige

    Praxistest und DIY Projekte
    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

    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

  2. #2
    Administrator Robotik Visionär Avatar von Frank
    Registriert seit
    30.10.2003
    Beiträge
    5.116
    Blog-Einträge
    1
    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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    30.07.2004
    Beiträge
    35
    Hallo Thomas ,
    mach die beide (else) weg, und schreib eine neue if-Abfrage etwa so:
    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();
                   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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    11.08.2004
    Beiträge
    6
    Hallo Maro,

    meinst du das dann so, oder habe ich dich falsch verstanden ?? Wieso kann ich denn hier kein else benutzen ?

    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); 
                   } 
                   // 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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    30.07.2004
    Beiträge
    35
    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:
    Code:
    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 werden
    Gruß Maro

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    11.08.2004
    Beiträge
    6
    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

    Code:
    //-------------------------------------------------------
    //---         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

    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); 
                   } 
               } 
    }

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    30.07.2004
    Beiträge
    35
    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

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    11.08.2004
    Beiträge
    6
    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

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    30.07.2004
    Beiträge
    35
    Hi Thomas,
    Ich habe es vorher nicht gesehen, da steht 0x02 in Demo1. Aber ich hab immer mit Demo 2 gearbeitet, da steht 0x03 .
    Ich weiss es ehrlich nicht,vielleicht sollma die Experte fragen.
    Aber es hat mit 0x02 nicht funktioniert gelll?????
    Gruß Maro

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803

    Masken

    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus