- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 15 von 15

Thema: Probot 128 probleme mit multithreading

  1. #11
    Neuer Benutzer Öfters hier
    Registriert seit
    29.10.2010
    Beiträge
    29
    Anzeige

    Praxistest und DIY Projekte
    hi!

    wenn du blut geleckt hast bringe ich dich gerne mal auf meinen stand =)

    also wenn du multithreading benutzt dann musst du im IDE unter projekt->optionen auf multithreading gehen und den Thread 1 und 2 aktivieren... stack ist die größe die diese threads nutzen dürfen und cycles sind die ablaufzeiten... also die befehle die er abwartet bis er zum nächsten thread wechselt.
    thread 0 ist das main programm... somit ist punkt eins auch erklärt.

    nun fängt meine vorlesung an... deswegen erkläre ich den rest... ähm später weiter....

  2. #12
    Benutzer Stammmitglied
    Registriert seit
    15.11.2010
    Ort
    Oberbayern
    Alter
    38
    Beiträge
    38
    Zitat Zitat von sebroos
    hi!

    wenn du blut geleckt hast bringe ich dich gerne mal auf meinen stand =)

    also wenn du multithreading benutzt dann musst du im IDE unter projekt->optionen auf multithreading gehen und den Thread 1 und 2 aktivieren... stack ist die größe die diese threads nutzen dürfen und cycles sind die ablaufzeiten... also die befehle die er abwartet bis er zum nächsten thread wechselt.
    thread 0 ist das main programm... somit ist punkt eins auch erklärt.

    nun fängt meine vorlesung an... deswegen erkläre ich den rest... ähm später weiter....
    Die Multithreading-Optionen sind mir bekannt. Mit "Punkt 1 geklärt" meinst Du, dass Dein Code so funktionieren müsste (bzgl. Threadabfolge)?

  3. #13
    Benutzer Stammmitglied
    Registriert seit
    15.11.2010
    Ort
    Oberbayern
    Alter
    38
    Beiträge
    38
    So, ich habe die Lösung. Nicht das Multithreading ist das Problem, sondern das Eigengeräusch des Antriebs. Es löst nämlich sofort wieder ein count++; aus, was zur Deaktivierung nach wenigen Millisekunden führt. Deshalb fährt der Antrieb nur wenige Millimeter.

    Lass in Thread 2 mal irgendetwas Geräuschloses ausführen bspw. wie in Thread 1 ein LED-Blinken. Dann funktioniert es wunderbar.

    Hier mein bereinigter Code, der beim ersten Mal Fingerschnippen die vorderen zwei LEDs blinken lässt (Thread 1), beim zweiten Mal Schnippen kommen die hinteren beiden LEDs hinzu (Thread 2). Das dritte Mal deaktiviert beendet beide Threads und man kann mit erneutem Schnippen von vorne beginnen.

    Code:
    word x;
    int count;
    
    void main(void)
    {
        PRO_BOT128_INIT();
        count = 0;
    
    
        while(1)
        {
            x = GetADC(3);
    
            if (x > 700)
            {
                count++;
                Msg_WriteInt(count);
                Msg_WriteChar(13);
    
                Thread_Delay(10);
    
                switch(count)
                {
                    case 1:
                        Thread_Start(1, Light);
                        break;
                    case 2:
                        Thread_Start(2, Fahr);
                        break;
                    case 3:
                        count = 0;
    
                        Thread_Kill(1);
                        Thread_Kill(2);
                        // DRIVE_OFF();
                        FLL_OFF();
                        FLR_OFF();
                        BLL_OFF();
                        BLR_OFF();
                        break;
                }
            }
        }
    
    }
    
    word GetADC(int adr)
    {
        ADC_Set(ADC_VREF_BG, adr);
        return ADC_Read();
    }
    
    void Light(void)
    {
        while(1)
        {
            Port_ToggleBit(FLL);
            Port_ToggleBit(FLR);
            Thread_Delay(50);
        }
    }
    
    void Fahr(void)
    {
        while(1)
        {
            Port_ToggleBit(BLL);
            Port_ToggleBit(BLR);
            Thread_Delay(50);
        }
    }

    Zudem siehst Du im Ausgabefenster den aktuellen Wert von count.

    Ich habe den switch-Baum in die if-Anweisung zur Mikroabfrage verfrachtet, dann kannst Du Dir nämlich die umständliche Zwischenerhöhung von count sparen, damit Dir nicht derselbe Thread mehrfach gestartet wird.
    So wird die switch-Verzweigung nur durchlaufen, wenn der Schallpegel am Mikro auch ausreicht. Ich denke 700 ist ein guter Wert. Mir war 600 etwas zu empfindlich.


    Um jetzt beim zweiten Schnippen doch den Antrieb laufen zu lassen, musst Du Dir was überlegen, damit das Mikro nicht versehentlich durch das Getriebegeräusch auslöst. Entweder noch ein bisschen mit dem x-Wert spielen oder den "Hörbereich" des Mikros mit einer Art Papiertrichter eingrenzen. Vielleicht funktioniert das.

    Vielen Dank, denn ich habe auch etwas über Multithreading bei der Sache gelernt.

  4. #14
    Neuer Benutzer Öfters hier
    Registriert seit
    29.10.2010
    Beiträge
    29
    hmm wenn ich mir das so überlege kann das durchaus sein...
    aber ich muss es mal versuchen...

    vielen dank... melde dich auch gerne bei mir wenn du ein problem mit dem pürobot hast... wenn ich weiß wie dann helf ich immer gerne =)

    ich melde mich nochmal wenn es mal ausprobiert habe.

    lg

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    29.10.2010
    Beiträge
    29
    sooo nun hab ich mal folgendes gemacht... ich habe die eingabe statt über das microphon über denn Taster SW2 (Boot) laufen lassen. und tatsächlich funktioniert das besser...
    allerdings fängt der mC auch oft nochmal das programm von ganz von vorne an wenn er motoren starten will.... also er springt nochmal ganz am anfang vom programm (also auch aus der while schleife raus) und steuert alle 4 LEDs wieder an.
    kann das sein das multithreading enorm auf die batterien geht, so das nach 5 minuten testen und neuprogrammieren die batterien leer sind? oder hat mein mC nen schuss?
    ich habe schon mehrmals die batterien getauscht... aber immer nach gefühlten 5 min fing der mC an das programm öffters neu zu starten... nach einem battwechsel gehts wieder.... 2-3 mal...
    ich kann mir das nur erklären das die spannung irgendwie zusammen bricht...

    danke für alles

Seite 2 von 2 ErsteErste 12

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad