-         

Seite 1 von 5 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 43

Thema: strukturen, ein- und ausstieg

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344

    strukturen, ein- und ausstieg

    Anzeige

    ich versuche mir eine teststruktur für software-varianten aufzubauen:

    Code:
    #include "RP6ControlLib.h"
    #include "RP6I2CmasterTWI.h"
    #include "RP6Control_MultiIOLib.h"
    #include "RP6Control_I2CMasterLib.h"
    #include "RP6Control_MultiIO.h"
    #include "RP6ControlServoLib.h"
    
    #define I2C_RP6_BASE_ADR 10
    
    
    uint16_t servopos;
    uint8_t i;
    uint8_t taste;
    
    /*********************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();
    
    
    setLEDs(0b1111);
    mSleep(500);
    setLEDs(0b0000);
    
    I2CTWI_initMaster(100);
    I2CTWI_setTransmissionErrorHandler(I2C_transmissionError); //aktiviert I2C fehlermeldungen
    
    showScreenLCD(" RP6Control M32", " servo_test");
    mSleep(1500);
    clearLCD();
    
    
    setServoPower(0);
    while(true)
    {
    
    /*****************anzeige gedrückter buttons****************/
    
    
        clearLCD();
        pressedMultiIOButtonNumber = getMultiIOPressedButtonNumber();
        setCursorPosLCD(0, 0);
        writeStringLCD("Button: ");
        writeIntegerLCD(pressedMultiIOButtonNumber, DEC);
        mSleep(500);
    
        uint8_t key = getMultiIOPressedButtonNumber();
    
    
    /********************funktion der buttons*********************/
        if(key)
        {
        switch(key)
        {
            case 1://
            setLEDs(0b0001);
            multiio_init();
    
    
            servopos = SERVO1_LT;
            while(true)
            {
            setServoPower(1);
            initSERVO(SERVO1 | SERVO2 | SERVO3 );
    
            setLEDs(0b0001);
            setServo(1, servopos);
            mSleep(50);
            servopos += 5;
            if (servopos > SERVO1_MP) servopos = SERVO1_LT;
            mSleep(100);
    
            setLEDs(0b0001);
            setServo(2, servopos);
            mSleep(50);
            servopos += 5;
            if (servopos > SERVO1_MP) servopos = SERVO1_LT;
            mSleep(100);
            task_SERVO();
    
            setCursorPosLCD(0, 0);
            writeStringLCD_P("Servopos.: ");
            writeIntegerLCD(servopos, DEC);
            writeStringLCD_P("   ");
            mSleep(50);
            setServoPower(0);
            }
    
        break;
    //main();
    
            case 2://
            setLEDs(0b0010);
            taste=2;
            multiio_init();
            setServoPower(1);
            initSERVO(SERVO1 | SERVO2 | SERVO3);
    
            while(true)
    
            {
            clearLCD();
            setCursorPosLCD(0, 0);
            writeStringLCD("Funktion: ");
            writeIntegerLCD(taste, DEC);
    
            setServo(3, SERVO_75);
            mSleep(500);
            setServo(3, SERVO1_MP);
            mSleep(500);
            setServo(3,SERVO_105);
            mSleep(500);
    
    /*
    do
    if (pressedMultiIOButtonNumber == 4)
        main();
    while (pressedMultiIOButtonNumber);
    */
    
                do
                    {
    //                    mSleep(50);
                        releasedMultiIOButtonNumber = checkMultiIOReleasedButtonEvent();
                        task_I2CTWI();
                        if (releasedMultiIOButtonNumber == 2)
                        main();
                    }
                while (releasedMultiIOButtonNumber);
    
    
    
            task_SERVO();
    
            }
    
    main();
        break;
    //    main();
    //    setServoPower(0);
    
            case 3://
    
            setLEDs(0b0100);
            multiio_init();
            setServoPower(1);
            initSERVO(SERVO1 | SERVO2 | SERVO3 );
    
    
            for (i=1; 5;i++);
            {
            setServo(3, SERVO_75);
            mSleep(500);
            setServo(3, SERVO1_MP);
            mSleep(500);
            setServo(3,SERVO_105);
    //        mSleep(5000);
    
            task_SERVO();
            }
        break;
        setServoPower(0);
    
        case 4://
            setLEDs(0b1000);
    
        break;
    
        }
    //    setServoPower(0);
    //main();
        }
    
    }
    
        return 0;
    }

    in dem code ist bei case2 folgender code in der while schleife eingefügt:

    Code:
    do
                    {
    //                    mSleep(50);
                        releasedMultiIOButtonNumber = checkMultiIOReleasedButtonEvent();
                        task_I2CTWI();
                        if (releasedMultiIOButtonNumber == 2)
                        main();
                    }
                while (releasedMultiIOButtonNumber);
    1) das programm reagiert aber recht träge auf das drücken, bzw. hier loslassen der taste. ist das normal?

    2) gibt es alternativen zum manuellen beenden einer unterschleife und der rückkehr ins hauptprogramm als die, die ich hier anwende?
    gruß inka

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    Hi,
    was verstehst Du denn unter träge ? Natürlich muss erst einmal z.B. case 1 abgearbeitet sein bevor er auf z.B. auf case 2 reagieren kann. Wenn alles steht sollte aber auf Tastendruck die Servos loslegen.
    Benutze doch mal die Taster der M32, hast Du da das gleiche Gefühl ? Ich bin nämlich meinen MIO Tastern nicht so zufrieden, ich will schon seit x-Wochen die Werte in der Lib anpassen. Ich hatte das schon mal gemacht, danach war ich dann zufrieden. Aber mit irgendeinem Update, oder rumkopiererei war die Version dann weg.
    Ich habe bei meinen Test Programm die Tastenabfrage als Funktion geschrieben (ich weiß garnicht ob man das so nennt ) und rufe diese dann aus der Main While Schleife aus. Auch habe ich keine Pausen wie Du in den einzelnen Servoschritten. Auch das ständige zu und abschalten der Servospannung habe ich nicht weil meine Servos mit der Last umfallen wenn die Spannung weg ist. Ich kann nicht sagen das da was träge reagiert. Wenn es dich interessiert kann ich ja mal das Programm mit der alten Servolib raussuchen. Bin z.Zt aber im Krankenhaus bis vorraussichtlich Donnerstag.
    Gruß TrainMen

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344
    jetzt zu allererst gute besserung...

    Zitat Zitat von TrainMen Beitrag anzeigen
    was verstehst Du denn unter träge ? Natürlich muss erst einmal z.B. case 1 abgearbeitet sein bevor er auf z.B. auf case 2 reagieren kann. Wenn alles steht sollte aber auf Tastendruck die Servos loslegen.
    mit "träge" meine ich, dass das programm auf den taster, der die servobewegung beenden soll, erst nach dem zweiten/dritten bewegungsablauf reagieren...

    dass man direkt von case1 zu case2 wechseln könnte wäre mir neu? das geht doch erst nach dem neustart des programms, oder? Deshalb Suche ich ja nach einer routine/funktion, die es mir möglich macht den programmablauf z.b. in case2 zu unterbrechen, ohne das ganze programm zu stoppen. Das was ich mi dem code

    Code:
                do
                    {
    //                    mSleep(50);
                        releasedMultiIOButtonNumber = checkMultiIOReleasedButtonEvent();
                        task_I2CTWI();
                        if (releasedMultiIOButtonNumber == 2)
                        main();
                    }
                while (releasedMultiIOButtonNumber);
    erreiche ist ja auch nur das stoppen des programms und neustart...

    Zitat Zitat von TrainMen Beitrag anzeigen
    Benutze doch mal die Taster der M32, hast Du da das gleiche Gefühl ?
    die taster habe ich seit ich die IO habe noch nicht benutzt, sie sitzen auch recht ungünstig...

    Zitat Zitat von TrainMen Beitrag anzeigen
    Ich bin nämlich meinen MIO Tastern nicht so zufrieden, ich will schon seit x-Wochen die Werte in der Lib anpassen. Ich hatte das schon mal gemacht, danach war ich dann zufrieden. Aber mit irgendeinem Update, oder rumkopiererei war die Version dann weg.
    an dieser änderung hätte ich auch interesse...

    Zitat Zitat von TrainMen Beitrag anzeigen
    Ich habe bei meinen Test Programm die Tastenabfrage als Funktion geschrieben (ich weiß garnicht ob man das so nennt ) und rufe diese dann aus der Main While Schleife aus.
    wie hast du diese funktion geschrieben?

    Zitat Zitat von TrainMen Beitrag anzeigen
    Auch habe ich keine Pausen wie Du in den einzelnen Servoschritten.
    die habe ich nur deshalb, weil die Servos sonst (zumindest zum testen) zu schnell sind...

    Zitat Zitat von TrainMen Beitrag anzeigen
    Auch das ständige zu und abschalten der Servospannung habe ich nicht weil meine Servos mit der Last umfallen wenn die Spannung weg ist. Ich kann nicht sagen das da was träge reagiert. Wenn es dich interessiert kann ich ja mal das Programm mit der alten Servolib raussuchen. Bin z.Zt aber im Krankenhaus bis vorraussichtlich Donnerstag.
    wäre net...
    gruß inka

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.11.2010
    Beiträge
    755
    Hi!
    Ich weiß, die Taster sind mir nicht wirklich gelungen... Das hätte man auch anders machen können, um vor allem auch mehrere Taster gleichzeitig zu detektieren.
    Sorry dafür! Wenn es eine V2 gibt, wird das natürlich geändert...
    Eine Variante, die man aber versuchen könnte, wäre, eine passende Widerstandskaskade mit Tastern (beliebig vielen) auf einer Lochrasterplatine selbst aufbauen und dann mit drei Litzen (5V, GND und ADC) an die MultiIO anzustecken - den Stecker dafür habe ich ja bereits vorbereitet.

    Lg

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    Hi,
    @fabqu
    also an der miesen Lösung mit den Tastern haben wir ja auch ein Anteil, die Platine und ihre Möglichkeiten haben wir den ja hier besprochen. Keiner hat eine bessere Lösung gedacht.
    Der Hinweis mit dem vorbereiteten Stecker bringt ja nichts, denn auch hier ist ja nur eine Abfrage wie mit den 4 Tastern der MIO oder der 5 Taster der M32 möglich. Ich habe da manchmal eine 4x4 Matrix Tastatur dran, aber der ständige Wechsel der Lib nervt dann.
    Wenn dann eine Matrix wie beim Asuro, aber da braucht man dann freie 2 Ports. Ich glaube Mic wollte da mal was machen.

    @inka
    Ja Danke für die Genesungs Wünsche, irgendwann habe ich die Scheiss Dinger besiegt.
    Ich muss mich gleich mal endschuldigen, ich komme hier mit dem Touchpad nicht klar und habe auch nur eine Hand wirklich frei, Antworte also mal ohne zu zitieren.
    Ja ich kann mich erinnern Du hast Deine Platinen gegenüber, schon klar dann kommst du nicht an die Taster der M32.
    Die Änderung der Taster Abfrage musst Du alleine machen, es wär ja möglich dass Du andere Werte hast. Messe einfach mal am ADC Port nach und passe die Werte an.
    Abgefragt wird ja in etwa so: if(keys <100)
    return 1;
    if(keys < 700)
    return 2; u.s.w
    ich bilde mir ein besseres Ergebnis gehabt zu habe wenn ich das Eingrenze. Also >90 und < wie 105 zum Beispiel. Aber bin mir nicht wirklich sicher.
    Ich verstehe nicht warum Du da ein Stop in Deinem Programm brauchst.
    Ein Programm läuft doch ständig durch. Das Programm startet und "guckt" ob Du eine Taste gedrückt hast. Ja Du hast Button 1 gedrückt. Der Servo fährt also in der genannten Position. Fertig und schon ist das Programm wieder an der Tastaturabfrage und Du hast Button 2 gedrückt der Servo fährt zurück oder eine LED geht an oder was weiss ich und Du weisst was jetzt kommt, Dein Programm steht wieder an der Tastaturabfrage........
    Ich versteh nicht wirklich Dein Problem, aber ich bin selber noch Azubi in diesen Dingen. Vielleicht kann dir unser Guru - Hallo Dirk - das besser erklären.
    So jetzt gibts Abendbrot, haha ans Bett gebracht, schönen Abend noch.
    Gruß TrainMen

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    @TrainMen:
    Vielleicht kann dir unser Guru - Hallo Dirk - das besser erklären.
    Guru??? GURU???
    Sei froh, dass du krank bist,- sonst würde ich ...

    Nein, besser hätte ich das auch nicht erklären können.

    Gute Besserung!
    Gruß
    Dirk

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.05.2009
    Ort
    Berlin
    Beiträge
    450
    Hi inka,
    wie versprochen hier das Programm zur Tasterabfrage der M32.
    Du musst das natürlich anpassen, ich habe es nur schnell überflogen und überflüssiges gelöscht. So das es deutlich wird was ich in meinte.
    Angehängte Dateien Angehängte Dateien
    Gruß TrainMen

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344
    danke TrainMen,

    die nächste frage:

    die abfrage taucht mehrmals in meinem programm auf, kann ich diese abfrage zu einer funktion "void abbruch (void)" machen, oder wird es wegen der schleife und der if abfrage nicht funktionieren?

    Code:
    do
    {
      pressedMultiIOButtonNumber = checkMultiIOPressedButtonEvent();
      task_I2CTWI();
      if (pressedMultiIOButtonNumber == 4)
      main();
     }
    while (pressedMultiIOButtonNumbe
    gruß inka

  9. #9
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    @inka:
    Der Aufruf der main() und auch noch ohne Abbruch der do-while Struktur ist keine gute Idee!
    Das dürfte irgendwann zu einem Stacküberlauf und zum Programmende führen.
    Das sind dann schwer zu findende Fehler!

    Was du ja wohl machen willst ist eine Art "Menüstruktur". Du drückst eine Taste und ein Programmteil startet. Dann beendet man das wieder durch einen Tastendruck und kommt zurück ins Auswahlmenü.
    Das braucht etwas mehr Aufwand, als per brute-force in die main zurückzuspringen.
    Du kannst aber z.B. im RP6Base_SELFTEST.c sehen, wie man ein solches Menü bauen kann.
    Gruß
    Dirk

  10. #10
    Erfahrener Benutzer Roboter Genie Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    70
    Beiträge
    1.344
    Zitat Zitat von Dirk Beitrag anzeigen
    Was du ja wohl machen willst ist eine Art "Menüstruktur". Du drückst eine Taste und ein Programmteil startet. Dann beendet man das wieder durch einen Tastendruck und kommt zurück ins Auswahlmenü.
    Der Aufruf der main() und auch noch ohne Abbruch der do-while Struktur ist keine gute Idee!
    genau. und wenn es mit "brutaler kraft" sein muss - ich hatte keine idee und dachte eher an das gute alte "goto" aus basic-zeiten. Würde das ein eingesetztes break abmildern, oder ist die ganze idee für die katz?


    Zitat Zitat von Dirk Beitrag anzeigen
    Das braucht etwas mehr Aufwand, als per brute-force in die main zurückzuspringen.
    Du kannst aber z.B. im RP6Base_SELFTEST.c sehen, wie man ein solches Menü bauen kann.
    meinst Du das hier?
    Code:
    test = receiveBuffer[0] - 48; 
             
            if(receiveBuffer[0] == 's') 
            { 
                speed_control(); 
            } 
            else if(receiveBuffer[0] == 'd') 
            { 
                testMoveDistance(); 
            } 
            else if(receiveBuffer[0] == 'c') 
            { 
                testEncoderDutyCycle(); 
            } 
            else if(test > 8) 
            { 
                writeString_P("You need to enter a single number from 0 to 8, s, d or c!"); 
                continue; 
            } 
            else 
            {
    
    switch(test) 
                { 
                    case 0:  
                        testPowerOn(); 
                        testLEDs(); 
                        testVoltageSensor();  
                        testBumpers();  
                        testLightSensors();  
                        testACS();  
                        testRC5();  
                        testMotorsAndEncoders(); 
                    break;      
                    case 1: testPowerOn();                 break;  
                    case 2: testLEDs();                 break;  
                    case 3: testVoltageSensor();        break;          
                    case 4: testBumpers();                 break;     
                    case 5: testLightSensors();         break; 
                    case 6: testACS();                      break; 
                    case 7: testRC5();                       break; 
                    case 8: testMotorsAndEncoders();     break;     
                }
    }
    ich erkenne hier eher eine einstufige abfragesituation und innerhalb der einzelnen cases oder if-abfragen läuft hier keine while-schleife...
    gruß inka

Seite 1 von 5 123 ... LetzteLetzte

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 23.03.2012, 23:36
  2. Probleme feine Strukturen zu drucken für Platine
    Von Hellmut im Forum Konstruktion/CAD/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 12
    Letzter Beitrag: 20.12.2010, 14:35
  3. Antworten: 11
    Letzter Beitrag: 07.09.2008, 17:56
  4. Probleme bei Strukturen (Projekt Funkuhr)
    Von Wasserkäfer im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 19.07.2008, 16:10
  5. Ein Quarz für ein ATMEGA8 und ein ATMEGA16
    Von boeseTURBO-CT im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 14.06.2004, 17:07

Berechtigungen

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