- LiFePO4 Speicher Test         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 255

Thema: IR-bake

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi,

    mSleep() ist leider blockierend.
    Besser sind die Stopwatches, siehe Anleitung des RP6, 4.6.3. Delay Funktionen (...), Überschrift "Stopwatches". Da ist auch ein Beispiel mit 2 Stopwatches.

    Die Feldvariable, die als uint8_t ir_value[1] deklariert ist, enthält letztlich nur EINE Variable, die heißt ir_value[0].
    So muss man sie auch ansprechen.
    Die beiden Variablen ir_value und ir_value[0] sind nicht identisch.
    Gruß
    Dirk

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Hi Dirk,
    Zitat Zitat von Dirk Beitrag anzeigen
    Die Feldvariable, die als uint8_t ir_value[1] deklariert ist, enthält letztlich nur EINE Variable, die heißt ir_value[0].
    So muss man sie auch ansprechen.
    Die beiden Variablen ir_value und ir_value[0] sind nicht identisch.
    das muss ich erstmal verarbeiten (und verstehen)...

    in meinem programm (die basis war das "Example_06_I2CMaster") ist z.b:
    Code:
    // Read all registers function 
     
    uint8_t RP6data[32]; // This array will contain all register values of RP6  
                         // after you called readAllRegisters() 
                          
                         // It is better to keep such big arrays GLOBAL as  
                         // they otherwise fill up the stack in memory... 
     
    /** 
     * This function reads ALL registers available in the standard I2C Bus Slave 
     * Example program for the Robot Base and outputs their values on the serial interface.  
     * You will see a lot of zeros when the Motors are not running. The main values that are not 
     * zero are the two Light Sensors and the two free ADC Channels. 
     */ 
    void readAllRegisters(void) 
    { 
        I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 0); // Start with register 0... 
        I2CTWI_readBytes(I2C_RP6_BASE_ADR,RP6data, 30); // and read all 30 registers up to 
                                                        // register Number 29 ! 
     
        // Now we output the Data we have just read on the serial interface: 
        writeString_P("\nREADING ALL RP6 REGISTERS:"); 
        uint8_t i = 0; 
        for(i = 0; i < 30; i++) 
        { 
            if(i % 8 == 0)           // add some newline chars otherwise everything  
                writeChar('\n');  // is printed on ONE single line... 
            else 
                writeString_P(" | "); 
            writeChar('#'); 
            writeIntegerLength(i,DEC,2); 
            writeChar(':'); 
            writeIntegerLength(RP6data[i],DEC,3); 
        } 
        writeChar('\n'); 
    }
    die variable (array) "uint8_t RP6data[32]", die auch so definiert wird und dann in der zeile:

    I2CTWI_readBytes(I2C_RP6_BASE_ADR,RP6data, 30);

    auch als RP6data beschrieben/gefüllt wird...

    aber wie gesagt, das muss ich erstmal verstanden haben...

    ein kleiner erfolg auf dem weg zu einer funktionierenden bake:

    es ist mir gelungen mit der einstellung an den beiden potis des blinkers und an der mSleep-verzögerung im programm das so einzustellen, dass über einen längeren zeitraum einmal pro sekunde das IRsignal gesendet UND auch vom RP6 empfangen wird. Ohne aussetzer, das war bisher nicht der fall, war mehr oder weniger zufällig, wenns mal geklapt hat, zumindest nicht so regelmäßig..
    gruß inka

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,

    die variable (array) "uint8_t RP6data[32]", die auch so definiert wird und dann in der zeile:
    I2CTWI_readBytes(I2C_RP6_BASE_ADR,RP6data, 30);
    auch als RP6data beschrieben/gefüllt wird...
    aber wie gesagt, das muss ich erstmal verstanden haben...
    Das ist ja eine Funktion aus der RP6I2CmasterTWI-Library.
    Im Header der Lib ist die Funktion als Prototyp so deklariert:
    Code:
    void I2CTWI_readBytes(uint8_t targetAdr, uint8_t * messageBuffer, uint8_t numberOfBytes);
    Das heißt: Als 2. Parameter wird der messageBuffer als Adresse (im Speicher, also nicht als Wert) übergeben. In der Lib besteht der messageBuffer aus der Feldvariablen RP6data, so dass man die Funktion so aufrufen kann, wie du oben angeführt hast. Das geht so aber nur, wenn RP6data in der Parameterliste einer Funktion auftaucht.
    Grundsätzlich würde ich einer einzelnen Variablen nicht den Namen einer Feldvariable geben, dann bleibt's übersichtlich.

    Für dein Programm:
    Ich würde die read_IR_value() Funktion so ändern:
    Code:
    uint8_t read_IR_value(void)
    { uint8_t temp;
     I2CTWI_transmitByte(I2C_RP6_BASE_ADR, 30); // Start with register 30
     I2CTWI_readBytes(I2C_RP6_BASE_ADR, temp, 1);
     return temp;
    }
    Die Funktion hat dadurch einen Byte-Rückgabewert und wird so aufgerufen: Wert = read_IR_value();
    Wenn du diese Werte dann in eine Feldvariable übernehmen willst:
    Code:
     i = 0;
    
     // Schleife:
     ir_value[i] = read_IR_value();
     i++;
    Wenn du diese zwei Zeilen mehrfach aufrufst (z.B. in einer Schleife), wird dein Wert (IR-Empfang ja oder nein) nacheinander in die Feldvariable ir_value gepackt.
    Du must natürlich dafür sorgen, das sie ausreichend dimensioniert ist und i also nicht zu hoch wird.


    ein kleiner erfolg auf dem weg zu einer funktionierenden bake
    Klingt gut!
    Gruß
    Dirk

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hi,

    jetzt habe ich versucht die abfrageschleife mit dem mSleep(50) verzögerung durch eine mit stopwatches zu ersetzen:
    Code:
    while(true) //start endlosschleife
        startStopwatch1(); // start stopwatches
        {
            if(getStopwatch1() > 100) // messe IR empfang wenn 100ms abgelaufen sind
            {
            temp = read_IR_value(); //einlesen IR-empfang
    //        mSleep(50);
            if (temp == 0) //abfrage treffer/empfang
            {
            setMultiIOLED3(1); //LED an
            setMultiIOLED3(0); //LED aus
            setStopwatch1(0); //stopwatches auf null stellen
            }
            }
    
        /**************************/ 
        uint8_t key_1 = getMultiIOPressedButtonNumber(); //tastenabfrage
        key_1 = getMultiIOPressedButtonNumber();
        if(key_1 != 0) break;
    
        /**************************/
        }
    
        break;
    die signale der bake werden offensichtlich nicht empfangen, die LED reagiert nicht...

    muss ich die dauer der einzelnen funktionen in der whileschleife kennen, oder gibt es eine andere möglichkeit (außer try & error) herauszufinden warum der zeitpunkt der 100ms (aber auch bei 50ms geht es nicht) falsch ist?
    gruß inka

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi,
    Kommentare im Codeblock!
    Code:
    while(true) //start endlosschleife
        startStopwatch1(); // start stopwatches <== Das gehört VOR die while(true) Schleife
        {
            if(getStopwatch1() > 100) // messe IR empfang wenn 100ms abgelaufen sind
            {
            temp = read_IR_value(); //einlesen IR-empfang
    //        mSleep(50);
            if (temp == 0) //abfrage treffer/empfang
            {
            setMultiIOLED3(1); //LED an
            setMultiIOLED3(0); //LED aus
            setStopwatch1(0); //stopwatches auf null stellen <== Gehört ans Ende der if(getStopwatch1() > 100) Klammer, siehe <<<>>> !
            }
            // <<<>>>
            }
    
        /**************************/ 
        uint8_t key_1 = getMultiIOPressedButtonNumber(); //tastenabfrage
        key_1 = getMultiIOPressedButtonNumber();
        if(key_1 != 0) break;
    
        /**************************/
        }
    
        break;
    Gruß
    Dirk

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Hi Dirk,

    danke für die korrekturen, es funktioniert nun...

    Würde für mein verstzändnis der stopwatches bedeuten, dass man diese an einer beliebigen stelle im vorderen bereich des programmes startet (einmal) und dann im ersten durchlauf der while(true) schleife auf null stellt und dann im zweiten durchlauf den Ir-empfang prüft...

    zwei dinge haben sich jetzt herausgestellt:
    1) die probleme beim empfang der von der bake gesendeten signale gründeten nicht in der zu kleinen leistung der IR-LEDs, sondern in der schlechten koordination des senders mit dem empfänger. Ich habe jetzt die vorwiderstände der IR-dioden wieder auf 47 ohm erhöht, der empfang funktioniert nach wie vor über ca. 4 meter.
    Im gegenteil: Ich habe nun beim erkennen der richtung aus der die IR-strahlen kommen probleme mit reflektionen, auch über zwei "ecken"! Der bereich um die 5cm über dem boden ist quasi IR-verseucht...
    Da muss ich mir noch etwas einfallen lassen (bündeln des sendestrahls und einengen des empfangskorridors)...

    2) hat zwar mit der IR-bake nur am rande zu tun, ein problem ist es aber:

    das starten der vier teilprogramme über die 4 multiIO taster.

    zwischen diesem
    Code:
    ------------------------------------------
        clearLCD();
        pressedMultiIOButtonNumber = getMultiIOPressedButtonNumber();
    
        setCursorPosLCD(0, 0);
        writeStringLCD("1: test_einzelsignal");
        setCursorPosLCD(1, 0);
        writeStringLCD("2: test_feldvariable");
        setCursorPosLCD(2, 0);
        writeStringLCD("3: Suche der bake");
        setCursorPosLCD(3, 0);
        writeStringLCD("4: test_button_4");
        mSleep(1500);
    
        uint8_t key = getMultiIOPressedButtonNumber();
    ----------------------------------------------
    und diesem
    Code:
    -------------------------------------------------
        uint8_t key_1 = getMultiIOPressedButtonNumber(); //tastenabfrage
        key_1 = getMultiIOPressedButtonNumber();
        if(key_1 != 0) break;
    
    ---------------------------------------------
    liegen jeweils die vier programmteile. Die software reagiert sehr eigenartig auf das drücken der buttons: mal garnicht, mal mit kurzem start mit sofort erfolgtem break, mal richtig. Wie könnte ich da was verbessern? Verzögerungen in der tastenabfrage z.b.?

    ich habe hier wegen der besseren verständlichkeit meiner frage bzw. meines problems den code einer schablobe für die abfrage der vier tasten eingefügt (obwohl das problem hier kaum auftritt) - hängt das mit der dauer des programms, welches ausgeführt wird zusammen?
    btw: die korrekturwerte für die taster sind in der RP6Control_MultiIO.h eingetragen...

    Code:
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_MultiIOLib.h"
    #include "RP6Control_I2CMasterLib.h"
    
    #include "RP6ControlServoLib.h"
    #include "standard.h"
    
    #define I2C_RP6_BASE_ADR 10
    
    
    
    /*********************I2C-fehlermeldungen******************/
    /*
    void I2C_transmissionError(uint8_t errorState) //gibt I2C fehlermeldungen über LCD aus
    {
        clearLCD();
        writeStringLCD_P("I2C ERROR -->");
        setCursorPosLCD(1, 0);        // line 2
        writeStringLCD_P("TWI STATE: 0x");
        writeIntegerLCD(errorState, HEX);
    }
    */
    
    /*************** hauptprogramm ***********/
    
    int main(void)
    {
    
    
    initRP6Control();
    multiio_init();
    initLCD();
    //orientation_init();
    
    
    setLEDs(0b1111);
    mSleep(500);
    setLEDs(0b0000);
    
    I2CTWI_initMaster(100);
    I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); //aktiviert I2C fehlermeldungen
    
    showScreenLCD(" RP6Control M32", " schablone", " 4 taster " , " mit ruecksprung ");
    mSleep(2500);
    clearLCD();
    
    
    
    while(true)
    {
    
    /*****************anzeige gedrückter buttons****************/
    //        clearLCD();
    
    //    accuspannung();
    //    mSleep(500);
        clearLCD();
        pressedMultiIOButtonNumber = getMultiIOPressedButtonNumber();
    //    setCursorPosLCD(0, 0);
    //    writeStringLCD("Button: ");
    //    writeIntegerLCD(pressedMultiIOButtonNumber, DEC);
    
        setCursorPosLCD(0, 0);
        writeStringLCD("1 - button_1_test");
        setCursorPosLCD(1, 0);
        writeStringLCD("2 - button_2_test");
        setCursorPosLCD(2, 0);
        writeStringLCD("3 - button_3_test");
        setCursorPosLCD(3, 0);
        writeStringLCD("4 - button_4_test");
        mSleep(1500);
        uint8_t key = getMultiIOPressedButtonNumber();
    
    
    
    /********************funktion der buttons*********************/
        if(key)
        {
        switch(key)
        {
        case 1://
        setLEDs(0b0001);
    
        while(true)
        {
            uint8_t key_1 = getMultiIOPressedButtonNumber();
        clearLCD();
        setCursorPosLCD(0, 0);
        writeStringLCD("test button 1 ");
        mSleep(1500);
        clearLCD();
        writeStringLCD("test break all ");
        mSleep(1500);
        key_1 = getMultiIOPressedButtonNumber();
        if(key_1 != 0) break;
        }
    
        break;
    
        case 2://
        setLEDs(0b0010);
    
        while(true)
        {
            uint8_t key_1 = getMultiIOPressedButtonNumber();
        clearLCD();
        setCursorPosLCD(0, 0);
        writeStringLCD("test button 2 ");
        mSleep(1500);
        clearLCD();
        writeStringLCD("test break all ");
        mSleep(1500);
        key_1 = getMultiIOPressedButtonNumber();
        if(key_1 != 0) break;
        }
    
        break;
    
        case 3://
        setLEDs(0b0100);
    
        while(true)
        {
            uint8_t key_1 = getMultiIOPressedButtonNumber();
        clearLCD();
        setCursorPosLCD(0, 0);
        writeStringLCD("test button 3 ");
        mSleep(1500);
        clearLCD();
        writeStringLCD("test break all ");
        mSleep(1500);
        key_1 = getMultiIOPressedButtonNumber();
        if(key_1 != 0) break;
        }
    
        break;
    
        case 4://
        setLEDs(0b1000);
    
        while(true)
        {
            uint8_t key_1 = getMultiIOPressedButtonNumber();
        clearLCD();
        setCursorPosLCD(0, 0);
        writeStringLCD("test button 4 ");
        mSleep(1500);
        clearLCD();
        writeStringLCD("test break all ");
        mSleep(1500);
        key_1 = getMultiIOPressedButtonNumber();
        if(key_1 != 0) break;
        }
    
        break;
    
        }
        }
    
    
    }
    
    
        return 0;
    }
    Geändert von inka (21.01.2014 um 10:32 Uhr)
    gruß inka

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi,
    Würde für mein verstzändnis der stopwatches bedeuten, dass man diese an einer beliebigen stelle im vorderen bereich des programmes startet (einmal) und dann im ersten durchlauf der while(true) schleife auf null stellt und dann im zweiten durchlauf den Ir-empfang prüft...
    Ja... Das startStopwatchX(); brauchst du nur EINMAL am Programmanfang, d.h. später normalerweise nicht wieder.

    Die Benutzung geht dann so:
    if(getStopwatchX() > 100) // mach was alle 100ms
    {
    // Was alles zu tun ist ...
    setStopwatchX(0); // Stopwatch auf Null stellen
    }

    Die software reagiert sehr eigenartig auf das drücken der buttons: mal garnicht, mal mit kurzem start mit sofort erfolgtem break, mal richtig. Wie könnte ich da was verbessern? Verzögerungen in der tastenabfrage z.b.?
    Ich würde 2 Sachen ändern:
    1. In der SWITCH-CASE-Struktur sieh dir die while(true) Schleifen an: Alle Pausen (mSleep) dort und im Bereich "anzeige gedrückter buttons" müssen raus,- d.h.: Die Haupt-while(true)-Schleife muss ohne Unterbrechungen/Pausen ablaufen. Wenn man Texte länger lesen soll, müßte man das auch mit einer weiteren Stopwatch machen.
    2. Die Zeile uint8_t key_1 = getMultiIOPressedButtonNumber(); brauchst du nicht. Es reicht: uint8_t key_1; (Grund: Weiter unten wird die Taste ja wieder eingelesen: key_1 = getMultiIOPressedButtonNumber(); )
    Gruß
    Dirk

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Hi Dirk,
    Zitat Zitat von Dirk Beitrag anzeigen
    Die Benutzung geht dann so:
    if(getStopwatchX() > 100) // mach was alle 100ms
    {
    // Was alles zu tun ist ...
    setStopwatchX(0); // Stopwatch auf Null stellen
    }
    macht das programm wirklich ALLE 100ms etwas oder immer dann wenns mal größer als 100ms ist? Also 101/102/105 - wanns gerade abgefragt wird? Ich glaube, wenn die funktionen im ablauf länger/komplizierter werden klappt es mit der abfrage nicht mehr so genau?

    ich habe nun den zweiten abschnitt meines
    Code:
    case 2:
        setLEDs(0b0010);
        writeString_P("\n\n messung feldvariable\n\n");
        writeChar('\n');
        initRP6Control();
        initLCD();
    
        startStopwatch2();//neu
    
        while(true)
        {
        uint8_t i = 0;
        for(i = 0; i < 199; i++)
            {
            temp_IR[i] = read_IR_value();
            feld_IR[i] = temp_IR[i];
            if(getStopwatch2() > 50)//neu
            {
            writeIntegerLength(temp_IR[i],DEC,4);
            if(i % 12 == 0)
                {
                writeChar('\n');
                setStopwatch2(0);//neu
                }
            else
                {
                writeString_P(" | ");
                setStopwatch2(0);//neu
                }
    
    //        mSleep(50);//entfallen
            }
    
            }
    
            /**************************/
            uint8_t key_1;
            key_1 = getMultiIOPressedButtonNumber();
            if(key_1 != 0) break;
    
            /**************************/
        }
    
        break;
    durch die stopwatches ergänzt, es läuft im prinzip, aber eben nur im prinzip. Mit dem mSleep(50) war die ausgabe so:

    Code:
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004

    mit stopwatches ist sie so:

    Code:
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004 | 0004
    der code raegiert nun williger auf den druck auf die buttons, kann ich die ausgabe regelmäßiger machen?
    gruß inka

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Zitat Zitat von inka Beitrag anzeigen
    macht das programm wirklich ALLE 100ms etwas oder immer dann wenns mal größer als 100ms ist? Also 101/102/105 - wanns gerade abgefragt wird? Ich glaube, wenn die funktionen im ablauf länger/komplizierter werden klappt es mit der abfrage nicht mehr so genau?
    Genau SO ist es, so steht es ja auch im Code, nämlich >100. Versuche ruhig mal "=100", dann wird es noch schlimmer werden!
    Was in einem harten Zeitraster abgearbeitet bzw. getestet werden soll, muss
    - entweder schnell pollend, also häufiger als die Zeitzähleinheit angegangen werden
    - oder besser noch: als (hochpriorer) Interrupt implementiert werden.

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hallo Dirk,


    ich habe den code von vorhin mit kommentaren versehen, so wie sie mir zutreffend scheinen...

    der roboter steht zunächst im raum, ist eingeschaltet, weiss nicht wo er ist, weisst nicht wo die IR-bake ist.

    und das sollte er tun:

    - misst nach 50ms zuerst ob er IR empfang hat
    - hat er empfang, misst er weiter bis er 10x empfang hatte
    - dann prüft er, ob er diese 10 signale innerhalb von 520ms (tg) empfangen hat
    - ist tg<520 fährt er 100mm
    - ist tg>520 rotiert er um 1 grad
    - fängt wieder mit IR messung an


    Code:
    case 3://
                    setLEDs(0b0100);
    
                    writeString_P("suche der bake   \n");
                    writeChar('\n');
                    initRP6Control();
                    initLCD();
                    startStopwatch3();
                    t=0; //t, t1, t2, tg sind am programmanfang definiert (unint_8)
    
                    while(true) //schleife bis button gedrückt
                    {
    
    
                        while(true) //dauerschleife - wie komme ich da raus?
                        {
    
                            if(getStopwatch3() > 50) //wenn stopwatch3 > 50ms messe IR empfang
                            {
                                temp = read_IR_value(); //Ir empfang (PB2) messen
    
    
                                if (temp == 0) //wenn IR empfang dann schleifendurchlauf, sonst rotate
    
                                {
                                    t1 = getStopwatch3(); // stopwatch3 wert beim ersten "treffer"
                                    setMultiIOLED3(1);
                                    setMultiIOLED3(0);
                                    if (t<10) // schleife für 10 treffer
                                    {
                                    t++;
                                    setStopwatch3(0); // stopwatch nach treffern 1 - 9 auf 0
                                    if (t == 10) // wenn t=10 dann
                                    {
                                    t2 = getStopwatch3(); // stopwatch3 wert für den 10. treffer
                                    tg = t2-t1;
                                    if (tg<520) // wenn tg < 520 move
                                    {
                                    move(100, FWD, DIST_MM(100), false);
                                    setStopwatch3(0); //stopwatch3 na 10 treffern auf 0
                                    t=0;
                                    }
    
                                    }
    
                                    }
                                }
    
                                else
                                {
                                    setMultiIOLED1(1);
                                    setMultiIOLED1(0);
                                    rotate(80, RIGHT, 1, false); // drehe rechts um 1 grad, nicht blockierend
                                    setStopwatch3(0); //stopwatch3 nach rotate auf 0
                                }
    
                            }
                        }
                            /**************************/
                            uint8_t key_1;
                            key_1 = getMultiIOPressedButtonNumber();
                            if(key_1 != 0) break;
                            /**************************/
                    }
    
    
    
                        break;
    gruß inka

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. IR-Bake
    Von tornado im Forum Elektronik
    Antworten: 9
    Letzter Beitrag: 05.07.2007, 17:37
  2. IR-Bake
    Von Bernd-das-Brot im Forum Sensoren / Sensorik
    Antworten: 38
    Letzter Beitrag: 13.12.2005, 16:14
  3. ir-bake
    Von pebisoft im Forum Vorstellungen+Bilder von fertigen Projekten/Bots
    Antworten: 8
    Letzter Beitrag: 17.01.2005, 13:41
  4. ir-bake
    Von pebisoft im Forum Sensoren / Sensorik
    Antworten: 2
    Letzter Beitrag: 17.01.2005, 07:01
  5. Bake
    Von techboy im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 02.11.2004, 10:17

Berechtigungen

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

Labornetzteil AliExpress