- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Probot 128 probleme mit multithreading

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    29.10.2010
    Beiträge
    29

    Probot 128 probleme mit multithreading

    hi

    ich habe mal zum test ein programm geschrieben. Dabei soll der Roboter auf händeklatschen reagieren. beim ersten klatschen sollen zwei LEDs blinken und beim 2ten mal klatschen soll der bot sich hin und her drehen. damit er beim ausführen der aktionen auch weiterhin seinen MIC eingang beobachtet habe ich hierzu Multithreading angewendet.
    nun habe ich aber ein problem, da wenn ich 2 mal in die hände geklatscht habe dann bewegt sich der bot kaum von der stelle. und beim nächsten mal klatschen bewegt er sich wieder ein stück obwohl er dann komplett ewieder in ruhestellung fahren sollte. ich habe das gefühl das durch die akustische signalisierung der trtead erst wieder angestoßen wird... aber deim thread Licht klappt alle wunderbar.... könnt ihr mir helfen?

    im anhang habe ich den Quelltext....

    danke im vorraus..

    Code:
    //**************************************************************
    //
    //                      Wackeln
    //    Erstes Programm                   30.12.2010
    //  Probot lauscht:
    // beim ersten klatschen -> Blinken
    // zweitem klatschen -> Tanzen
    // dritten klatschen -> Ruhe
    //
    //**************************************************************
    
    #define LLF 16         
    #define RLF 17
    #define LLB 18
    #define RLB 19
    #define MIC 43
    
    word x;                // globale variablen erstellt
    int count;
    void main(void)
    {
    DRIVE_INIT();                    // Drive initalisieren siehe PRO-BOT128_Lib
    count=0;                         // setzte den KLatschzähler auf 0
    Port_DataDirBit(LLF,1);
    Port_DataDirBit(RLF,1);          // initaliesiere die LEDs
    Port_DataDirBit(LLB,1);
    Port_DataDirBit(RLB,1);
    Thread_Delay(100);          //Konfiguriere die ports als ausgänge und warte ne sekund
    
    Port_WriteBit(LLF,0);
    Port_WriteBit(RLF,0);
    Port_WriteBit(LLB,0);
    Port_WriteBit(RLB,0);
    
    Thread_Delay(50);
    Port_WriteBit(LLF,1);       //LEDs aufblinken lassen zum signalisieren das es jetzt los gehen kann
    Port_WriteBit(RLF,1);
    Port_WriteBit(LLB,1);
    Port_WriteBit(RLB,1);
    
    while(1==1)                 //endlosschleife
        {
        x=GetADC(3);            //schreibe den Wert vom MIC in x
    
        if (x>600)              //wenn x größer 600...
            {
            count++;            //...zähle hoch
            Thread_Delay(10);
            }
        switch(count)
            {
            case 0: break;                                 //counter = 0 nix
            case 1: Thread_Start(1,Light);count++;break;   //counter = 1mal geklatscht -> Thread Light starten. counter eins hoch zählen damit der thread nicht immer gestartet wird.
            case 2: break;
            case 3: Thread_Start(2,Fahr)/*Fahr()*/;count++;break;  //counter =3 -> 2mal geklatscht. Thread Fahr 
            case 4: break;
            default:
            count=0; 
            
            Thread_Kill(1);
            Thread_Kill(2);                                        //wenn counter größer als 4 oder undefiniert dann schliße 
            Port_WriteBit(15,0);                                   // beide threads und schalte alle LEDs aus
            Port_WriteBit(LLF,1);                                  //EN ausgang für motoren wird abgeschaltet
            Port_WriteBit(RLF,1);
            Port_WriteBit(LLB,1);
            Port_WriteBit(RLB,1);
            }
        }
    
    }
    
    word GetADC(int adr)                //ließt wert aus ADC eingang aus
    {
    ADC_Set(ADC_VREF_BG,adr);
    return ADC_Read();
    }
    
    void Light(void)                    //Light funzt... aber LEDs sind vertauscht.... ?! 
    {
    
    while(1)
        {
    //    Port_WriteBit(LLF,1);
    //    Port_WriteBit(RLF,1);
        Port_WriteBit(LLB,1);
        Port_WriteBit(RLB,1);
        Thread_Delay(250);
    //    Port_WriteBit(LLF,1);
    //    Port_WriteBit(RLF,1);
        Port_WriteBit(LLB,0);
        Port_WriteBit(RLB,0);
        Thread_Delay(250);
        }
    }
    
    void Fahr(void)                   //funktioniert nicht.... :(
    {
    
    Port_WriteBit(15,1);              //setzte EN eingang der Motoren
    while(1)                          //endlosschleife
        {
    
        DRIVE(1,255);                 //dreh dich 2,5s in eine richtung
        Thread_Delay(250);
        DRIVE(128,128);               //bleib stehen
        Thread_Delay(250);
        DRIVE(255,1);                 //fahr in die andere richtung
        Thread_Delay(250);
        DRIVE(128,128);               //bleib stehen
        Thread_Delay(250);
        }
    }

  2. #2
    shedepe
    Gast
    Nur eine Frage im vorraus: Machst du es dir mit Multithreading nicht unnötig kompliziert auf einem mC ? Wäre das ganze nicht mit Interrupts einfacher zu lösen ?

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    29.10.2010
    Beiträge
    29
    ja mit interrups wäre es wahrscheinlich auch gegangen =)

    aber mein programm ist ja nur ein vorreiter um den probot zu testen... später soll er mittels multithreading noch ganz andere aufgaben erledigen, die mit interrupts nicht zu realisieren wären.
    =)

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    29.10.2010
    Beiträge
    29
    hat keiner eine idee?

    wie würdest das mit interrups aussehen?

  5. #5
    shedepe
    Gast
    So, ich hab mir grad noch mal dein Programm angeschaut.
    Wie wäre es wenn du bei case 1: Einfach nur die LED anmachst anstatt einen neuen Thread zu starten und bei case 2: die Motoren anschaltest.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    29.10.2010
    Beiträge
    29
    ich ich möchte ja gerne multithreading verstehen... und das problem nicht einfach umgehen....

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    29.10.2010
    Beiträge
    29
    nungut ich hab folgendes jetzt festgestellt... wenn ich die Motoren abklemme funktioniert das programm einwandfrei... sobald ich einen motor anschließe funktioniert es leider nichtmehr... woran könnte das liegen?
    habe die akkus schon getauscht... alle kontakte nachgelötet...

  8. #8
    shedepe
    Gast
    Ich kenne dir Motorfunktion zwar nicht. Aber wenn die mit Encodern und Interrupts arbeitet könnte dein simuliertes Multithreading da Probleme bereiten.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    29.10.2010
    Beiträge
    29
    hmm das versteh ich jetzt nicht? welche interrups? encoder benutze ich nicht...

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    15.11.2010
    Ort
    Oberbayern
    Alter
    39
    Beiträge
    38
    Habe mir jetzt Deinen Code einmal angeschaut und habe dazu mehrere Sachen anzumerken:

    1. Wie gesagt, viel Erfahrung mit Threads habe ich nicht, aber eines ist mir aufgefallen. Du rufst Thread_Start() in deiner main-Routine auf, sorgst aber nicht dafür, dass aus den Threads auch wieder herausgesprungen wird. Wie soll main() denn mitbekommen, dass Du erneut geklatscht hast? Ich glaube, an dieser Stelle liegt der Hund begraben. Vielleicht kommst Du mit Thread_Start()/Thread_Wait() weiter? Wäre jetzt eine Idee, vielleicht liege ich aber auch mangels Erfahrung daneben.


    2. An einigen Stellen rufst Du Funktionen der Pro-Bot-Library auf, an anderen Stellen änderst Du direkt einzelne PortBits unter Benutzung der PortBit-Nummer oder eigens festgelegter #define-Bezeichnungen. Die meisten davon sind in der Pro-Bot-Library bereits definiert, wie etwa die LEDs oder die Funktionen zum Ein- und Auschalten des Antriebs (DRIVE_ON()/DRIVE_OFF()).
    Das ist teils sehr verwirrend und lenkt das Auge evtl. vom eigentlichen Problem ab. Vielleicht fällt Dir ja beim Bereinigen der ein oder andere dadurch entstehende Fehler im Programmablauf auf.

    Öffne mal die Datei C:\Programme\C-Control Pro\Libraries\PRO-BOT128_Lib.cbas und schau Dir an, was dort drinsteht. Das war für mich jedenfalls sehr aufschlussreich.


    3. Du hast sehr viele teils sehr lange Verzögerungen (~2,5 s) durch Thread_Delay() eingebaut. Das behindert das Mitverfolgen des Roboterablaufs. Den ein oder anderen Aufruf kannst Du entfernen, IMO muss man dem Mikroprozessor keine 1 s geben, um seine Ports zu stellen.


    Wenn ich demnächst Zeit habe, steppe ich vielleicht Deinen Code mal durch. Habe ihn bei mir in ein neues Projekt kopiert, ein wenig bereinigt und Blut geleckt.


    Hoffe, ich konnte ein wenig weiterhelfen.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen