- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 43

Thema: strukturen, ein- und ausstieg

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180

    strukturen, ein- und ausstieg

    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 Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    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
    773
    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.803
    @TrainMen:
    Vielleicht kann dir unser Guru - Hallo Dirk Bild hier   - 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 Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hallo,

    ich versuche nun bestimmte funktionen, die ich in unterschiedlichen programmen verwenden möchte in eine lib "standard" (c & h) auszulagern...

    mit solchen z.b. klappt es einwandfrei:

    void accuspannung(void)
    sobald der funktion als rückgabewert z.b. eine variable zugeordnet wird wie hier:

    void batteryVoltageLow(uint8_t isVoltageLow)
    - in der standard.h steht dann:

    void batteryVoltageLow(void)
    funktioniert es nicht, die fehlermeldunge lautet:
    ../../RP6Lib/standard/standard.h|37|note: previous declaration of ‘batteryVoltageLow’ was here|
    wobei der eintrag in der standard.h moniert wird. Muss dort bei der deklaration auch die variable rein? wenn ich es dann mache:

    void batteryVoltageLow(uint8_t isVoltageLow)
    wird eine klammer verlangt:

    ../../RP6Lib/standard/standard.h|38|error: expected ‘)’ before ‘isVoltageLow’|
    seltsammerweise funktioniert es hier:

    standard.c:
    void I2C_transmissionError(uint8_t errorState)
    standard.h: steht nichts, da die funktion in der "RP6Control_I2CMasterLib.h" deklariert wird, und zwar so:

    void I2C_transmissionError(uint8_t errorState);
    könnte bitte jemand versuchen mir das zu erklären?
    gruß inka

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Wenn es eine Funktion void batteryVoltageLow(uint8_t isVoltageLow) gibt, muss sie auch im Header (.h) so deklariert werden. Dabei reicht es auch, nur void batteryVoltageLow(uint8_t) anzugeben.
    Was man oft vergißt, ist auch, dass hinter den Funktionsdeklarationen im Header jeweils ein ; stehen muss.
    Gruß
    Dirk

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

    ich nutze jetzt mal diesen thread, auch wenn es mir diesmal um andere strukturen geht:

    nachdem das kompilieren mit code:blocks bei mir offensichtlich immer noch mit fehlern behaftet ist habe ich das, was ich momentan mache auf reines make umgestellt. So weit so gut, so ganz zufrieden bin ich nicht:

    1) die strukturen sind ganz flach. Ich kann sie natürlich mit hinzufügen von "/.." im jeweiligen makefile erweitern, das wahre ist das aber nicht...

    2) es stört mich z.b. das in jedem verzeichnis, welches für ein programm angelegt ist auch die dateien, wie z.b. die libs der multi_io sind. So habe ich - befürchte ich - in einigen wochen dutzende von z.b. "RP6Control_MultiIO.h" oder "RP6Control_Orientation.h", je nach dem wo ich gerade drann bin und etwas ändere. Gibt es hier, bei make, eine möglichkeit es zentral handzuhaben? Zum beispiel alle "RP6mio" oder "RP6servo" in einem verzeichnis zusammenzufassen und jeweils nur auf EINE dateiversion (in der man ändert, hinzufügt, auskommentiert...) zuzugreifen? kann man dazu z.b. den

    "RP6_LIB_PATH_OTHERS= $(RP6_LIB_PATH)/RP6control $(RP6_LIB_PATH)/RP6common"

    erweitern?

    das hier, z.b.


    SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c
    SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c


    hat schon mal mit "RP6_LIB_PATH_OTHERS"

    also so:

    SRC += $(RP6_LIB_PATH_OTHERS)/RP6ControlLib.c
    SRC += $(RP6_LIB_PATH_OTHERS)RP6uart.c

    irgendwie nicht funktioniert...


    wie handhabt ihr (die, die mit make arbeiten und drauf schwören) so etwas?
    gruß inka

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,
    wenn man mal die Struktur der RP6 Examples als Beispiel nimmt:
    1. Im makefile geht alles aus von DEM Ordner, in dem makefile steht bzw. make all ausgeführt wurde. Das ist der Ordner, in dem also dein Programm steht (Programmordner).

    2. RP6_LIB_PATH ist dann im makefile als ../../RP6Lib definiert, d.h. 2 Ebenen aufwärts im Verzeichnisbaum (RP6CONTROL_EXAMPLES -> RP6) und dort dann der Ordner RP6Lib.
    Die Struktur sieht also so aus:
    RP6 --- RP6CONTROL_EXAMPLES --- Programmordner
    RP6 --- RP6Lib
    RP6_LIB_PATH weist dann also auf den Ordner RP6Lib.

    3. Wenn es um die M32 geht, dann befinden sich die meisten Libs für die M32 im Ordner:
    RP6 --- RP6Lib --- RP6control
    Dahin tue ich auch alle Libs, die ich selbst für die M32 habe. Wenn du also für die MultiIO Libs eine zentrale Stelle haben willst, wäre dieser Ordner doch gut geeignet, oder?

    4. Im makefile müßtest du also alle MultiIO Libs, die du in den Ordner RP6control kopiert hast, so eintragen:
    SRC += $(RP6_LIB_PATH)/RP6control/RP6Control_MultiIOLib.c
    (Hier am Beispiel der MultiIO Haupt-Lib)

    5. Im Programm selbst müßten die include Befehle nicht verändert werden.

    Wenn du eine andere Ordner-Struktur nutzt, must du natürlich die Pfadangaben anpassen.
    Gruß
    Dirk

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 23.03.2012, 22:36
  2. Probleme feine Strukturen zu drucken für Platine
    Von Hellmut im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 12
    Letzter Beitrag: 20.12.2010, 13:35
  3. Antworten: 11
    Letzter Beitrag: 07.09.2008, 16:56
  4. Probleme bei Strukturen (Projekt Funkuhr)
    Von Wasserkäfer im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 19.07.2008, 15: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, 16:07

Berechtigungen

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

LiFePO4 Speicher Test