- 12V Akku mit 280 Ah bauen         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: asurOS, ein Pseudo-Asuro-Betriebssystem

  1. #1

    asurOS, ein Pseudo-Asuro-Betriebssystem

    Anzeige

    Praxistest und DIY Projekte
    hi!

    da ja alle meine Projekte an meiner mangelnden programmierfähigkeit bislang gescheitert sind, habe ich aus frust versucht etwas zu erstellen, was zwar aufwendig ist aber mich vom code her nicht überfordert..
    durch die ganzen threads in denen man das hyperterminal benutzt bin ich auf die idee gekommen, mit dem asuro wie mit einem alten dos-pc kommunizieren zu können. viel sinn machts nicht \/ aber es hat spass gemacht das zu probieren, und das ist auch das erste aufwendigere programm das bei mir entstanden ist

    leider ist auch das programm ziemlich unprofessionell programmiert, da bitte ich einfach etwas nachsicht zu haben..ich kann es eben noch nicht eleganter. und außerdem sprengt es den speicher vom asuro schon fast. ein paar zeilen mehr, und das flashtool will nicht mehr flashen. auch die strings haben den speicher überfordert, deswegen werden sie mit einer speziellen funktion (danke nochmal an izaseba!!) aus dem ram ferngehalten..

    hier ist schonmal der code, die formatierung is etwas seltsam, ich hatte ziemlich mit dem programmers notepad zu kämpfen, und komm eigentlich immernoch nich so damit klar..

    Code:
    /********************************************************************************
    
    
                        asurOS, ein Pseudo-ASURO-Betriebssystem
                        ***************************************
                                
                                
    ********************************************************************************/
    
                                
    #include "asuro.h"
    #include "avr/pgmspace.h"
    
    char data1[1], data2[1], data3[1], data4[1], data5[1], data6[1], data7[1];
    char count = 0;
    unsigned char ledColor, ledStatus, ledBackL, ledBackR, speed = 100;
    int battery, countDis = 0, countAngle = 0;
    
            
    void keyboardInput(void) {
              //Tastatureingabe abwarten, bis ENTER gedrueckt wird.
          
          SerRead(data1,1,0);
          if(data1[0] != 0x0d)  {
            SerRead(data2,1,0);
            if(data2[0] != 0x0d)    {
                SerRead(data3,1,0);
                if(data3[0] != 0x0d)    {
                    SerRead(data4,1,0);
                    if(data4[0] != 0x0d)    {
                        SerRead(data5,1,0);
                        if(data5[0] != 0x0d)    {
                            SerRead(data6,1,0);
                            if(data6[0] != 0x0d)    {
                                SerRead(data7,1,0);
                            }    
                        }
                    }
                }
            }
           } 
    }       
    
    //Haelt die Strings der Ausgaben im Flash, sonst wird es dem Asuro zu viel;) 
    //THX AN izaseba!!!
    void pushFlash(const char *string){
    char sign;
      while((sign = pgm_read_byte(string))) {
        UartPutc(sign);
        string++;
        }
    } 
    
    //Loescht die Eingabevariablen
    
    void clear(void)    {
        data1[0] = 0; data2[0] = 0; data3[0] = 0; data4[0] = 0; data5[0] = 0; data6[0] = 0; data7[0] = 0;
    }
    
    //Gibt Fehlermeldung aus, falls Befehl unbekannt ist, oder zu viele Uebertragungsfehler ankommen   
     
    void irError(void)  {
        pushFlash(PSTR("\r\nUnknown Command!\r\n"));
        count++;
        if (count >= 6)    {
            pushFlash(PSTR("\r\nIR connection error!\r\n\r\nCheck your IR tranceiver\r\n\r\n"));
            count = 0;
        }
    }    
    
    //Listet alle verfuegbaren Befehle auf    
    
    void commandList(void)  {
        pushFlash(PSTR("\r\n\r\nAwaible commands:\r\n\r\n"));
        pushFlash(PSTR("\r\ncount                                             Starts a countdown\r\n"));
        pushFlash(PSTR("\r\nhelp                                            List of all commands\r\n"));  
        pushFlash(PSTR("\r\nmove                         Change to move mode, for drive and turn\r\n"));
        pushFlash(PSTR("\r\nreset                                 resets all settings to default\r\n"));
        pushFlash(PSTR("\r\nset      Change to settings mode, access to LED and speed parameters\r\n"));
        pushFlash(PSTR("\r\nstatus                             Shows actual settings and mileage\r\n"));
        
    }    
    
    //Aendert die LED Farben mit Rueckgabewert
    void ledStatusChanger(unsigned char color, unsigned char status, unsigned char left, unsigned char right)  {
        StatusLED(color);
        FrontLED(status);
        BackLED(left, right);
        ledStatus = status;
        ledColor = color;
        ledBackL = left;
        ledBackR = right;
    }    
    
    //Aendert die LED Farben im Modus SET/LED
    void ledSetMode(void)   {
        unsigned char stat[4];
        pushFlash(PSTR("\r\nType new colors\r\n"));
        pushFlash(PSTR("\r\nStatus LED: 0 = OFF, 1 = green, 2 = red, 3 = yellow\r\nFront LED: 0 = OFF, 1 = ON\r\n"));
        pushFlash(PSTR("Back LEDs: 0 = OFF, 1 = left 2 = right 3 = both ON\r\n"));
        pushFlash(PSTR("\r\ntype all parameters at once, without *space*!\r\n\r\nASURO\\set\\led>"));
        SerRead(stat,4,0);
        if(stat[3] == 0x0d) {
            if(stat[0] == '0')  {
                StatusLED(OFF);
                ledColor = OFF;
            }
            else if(stat[0] == '1') {
                StatusLED(GREEN);
                ledColor = GREEN;
            }
            else if(stat[0] == '2') {
                StatusLED(RED);
                ledColor = RED;
            }
            else if(stat[0] == '3') {
                StatusLED(YELLOW);
                ledColor = YELLOW;
            }
            else    {
               irError();
               ledSetMode();
            }
            if(stat[1] == '0')  {
                FrontLED(OFF);
                ledStatus = OFF;
            }
            else if(stat[1] == '1') {
                FrontLED(ON);
                ledStatus = ON;
            }
            else    {
              irError();
              ledSetMode();
            }
            if(stat[2] == '0')  {
                BackLED(OFF,OFF);
                ledBackL = OFF;
                ledBackR = OFF;
            }
            else if(stat[2] == '1') {
                BackLED(ON,OFF);
                ledBackL = ON;
                ledBackR = OFF;
            }
            else if(stat[2] == '2') {
                BackLED(OFF, ON);
                ledBackL = OFF;
                ledBackR = ON;
            }
            else if(stat[2] == '3') {
                BackLED(ON,ON);
                ledBackL = ON;
                ledBackR = ON;
            }
        }
        else    {
           irError();
           ledSetMode();
        }
        pushFlash(PSTR("\r\nSettings changed!\r\nExiting set mode\r\n\r\n"));
    }   
    
    //Aendert die Geschwindigkeit im Modus SET/SPEED 
    void speedSetMode(void) {
        pushFlash(PSTR("\r\nCurrent speed value is "));
        PrintInt(speed);
        pushFlash(PSTR(".\r\nType new speed value (000 - 255)\r\nASURO\\set\\speed>"));
        keyboardInput();    
        speed = ((data1[0] - 48) * 100) + ((data2[0] - 48) * 10) + (data3[0] - 48);               
        pushFlash(PSTR("\r\nSettings changed!\r\nExiting set mode\r\n\r\n"));
    }
    
    //Gibt die Farben der LEDs zurueck
    void ledCheck(void)    {    
        pushFlash(PSTR("\r\n\r\bLED status:\r\n"));
        
        if(ledColor == YELLOW)   {
            pushFlash(PSTR("Status LED is yellow\r\n"));
        }
        else if(ledColor == OFF)    {
            pushFlash(PSTR("Status LED is off\r\n"));
        }
        else if(ledColor == GREEN)  {
            pushFlash(PSTR("Status LED is green\r\n"));
        }
        else if(ledColor == RED)  {
            pushFlash(PSTR("Status LED is red\r\n"));
        }
        if(ledStatus == ON) {
            pushFlash(PSTR("Front LED is on\r\n"));
        }
        else {
            pushFlash(PSTR("Front LED is off\r\n"));
        }
        if(ledBackL == ON)  {
            pushFlash(PSTR("Left back LED is on\r\n"));
        }
        else {
            pushFlash(PSTR("Left back LED is off\r\n"));
        }
        if(ledBackR == ON)  {
            pushFlash(PSTR("Right back LED is on\r\n"));
        }
        else    {
            pushFlash(PSTR("Right back LED is off\r\n"));
        }    
    }    
    
    //Gibt den Status der Batterie zurueck
    void batteryCheck(void) {
        battery = Battery() * 0.0055;
        pushFlash(PSTR("\r\nBattery status: "));
        PrintInt(battery);
        pushFlash(PSTR(" Volt\r\n"));
    } 
    
    //Gibt die Laufzeit zurueck   
    void timeCheck(void)    {
        pushFlash(PSTR("\r\nSystem time: "));
        PrintInt(Gettime());
        pushFlash(PSTR(" ms\r\n"));
    }    
    
    //Gibt die aktuell gesetzte Geschwindigkeit zurueck
    void speedCheck(void)   {
        pushFlash(PSTR("\r\nSpeed value: "));
        PrintInt(speed);
        pushFlash(PSTR("\r\n"));
    }    
    
    //Gibt die gefahrene Strecke zurueck
    void disCheck(void) {
        pushFlash(PSTR("\r\nMileage: "));
        PrintInt(countDis);
        pushFlash(PSTR(" mm\r\nTurned: "));
        PrintInt(countAngle);
        pushFlash(PSTR(" degrees\r\n\r\n"));
    }    
    
    //Wechselt in den SET-Modus    
    void setMode(void)  {
         
         pushFlash(PSTR("\r\nEntering Set mode\r\nType led to change LED colors or speed to change the speed value\r\nASURO\\set>"));
         keyboardInput();
         //LED farbe aendern
         if(data1[0] == 'l' && data2[0] == 'e' && data3[0] == 'd' && data4[0] == 0x0d)   {
            ledSetMode();     
         }
         else if(data1[0] == 's' && data2[0] == 'p'&& data3[0] == 'e' && data4[0] == 'e' && data5[0] == 'd')    {        
            speedSetMode();
         }   
         else   {
            irError();
         }   
    }        
    
    //Wechselt in den MOVE-Modus    
    void moveMode(void) {
        int distance = 0;
        int angle = 0;
        pushFlash(PSTR("\r\nEntering move mode\r\n"));  
        pushFlash(PSTR("\r\nType path for path mode or turn for turning mode\r\n"));
        pushFlash(PSTR("ASURO\\move>"));
        keyboardInput();
        
        //Teilstueck fuer Distanz
        if(data1[0] == 'p' && data2[0] == 'a' && data3[0] == 't' && data4[0] == 'h' && data5[0] == 0x0d) {
            pushFlash(PSTR("\r\nEntering path mode\r\n"));
            pushFlash(PSTR("Type distance in mm between 0 and 1000. Negative value to drive backward.\r\nExample: -0100 for 100mm backward\r\n"));
            pushFlash(PSTR("ASURO\\move\\path>"));
            keyboardInput();
            if(data1[0] != 0x2d) {
                distance = (((data1[0] - 48) * 1000) + ((data2[0] - 48) * 100) + ((data3[0] - 48) * 10) + (data4[0] - 48));
                countDis += distance;
            }
            else if(data1[0] == 0x2d)   {
                distance = (((data2[0] - 48) * 1000) + ((data3[0] - 48) * 100) + ((data4[0] - 48) * 10) + (data5[0] - 48));
                countDis += distance;
                distance = -distance;
            }
            else    {
                irError();
                moveMode();
            }    
           pushFlash(PSTR("\r\n\r\nAsuro will move ")); 
           PrintInt(distance);
           pushFlash(PSTR(" mm.\r\n\r\nProceed? (Y/N)"));
           clear();
           SerRead(data1,1,0);
           if(data1[0] == 'y')  {      
              EncoderInit();
              Go(distance,speed);
              pushFlash(PSTR("\r\n"));
           }
           else if(data1[0] == 'n') {
               if(distance >= 0)    {
                    countDis -= distance;
                }
                else    {
                    countDis += distance;
                }
                pushFlash(PSTR("\r\n"));
           }
           else {
                pushFlash(PSTR("\r\n"));
                irError();
                moveMode();
           }           
           
        }
        
        //Teilstueck fuer Winkel
        else if(data1[0] == 't' && data2[0] == 'u' && data3[0] == 'r' && data4[0] == 'n' && data5[0] == 0x0d)    {
            pushFlash(PSTR("\r\nEntering turning mode\r\n"));
            pushFlash(PSTR("\r\nType angle in degrees between 0 and 360. Negative value to turn left.\r\nExample: -090 for left\r\n"));
            pushFlash(PSTR("ASURO\\move\\turn>"));
            keyboardInput();
            if(data1[0] != 0x2d)    {
                angle = (((data1[0] - 48) * 100) + ((data2[0] - 48) * 10) + (data3[0] - 48));
                countAngle += angle;
            }
            else if(data1[0] == 0x2d)   {
                angle = (((data2[0] - 48) * 100) + ((data3[0] - 48) * 10) + (data4[0] - 48));
                countAngle += angle;
                angle = -angle;
            }
            else    {
                irError();
                moveMode();
            }
            pushFlash(PSTR("\r\n\r\nAsuro will turn "));
            PrintInt(angle);
            pushFlash(PSTR(" degrees.\r\n\r\nProceed? (Y/N)"));
            clear();
            SerRead(data1,1,0);
            if(data1[0] == 'y')  {         
              EncoderInit();
              Turn(angle,speed);
              pushFlash(PSTR("\r\n"));
            }
            else if(data1[0] == 'n') {
                if(angle >= 0)  {
                    countAngle -= angle;
                }
                else    {
                    countAngle += angle;
                }
                pushFlash(PSTR("\r\n"));
            }
            else {
                pushFlash(PSTR("\r\n"));
                irError();
                moveMode();
            }         
        }
        else    {
         irError();
         moveMode();
        }
    }        
    
    //Setzt alle Einstellungen zurueck 
    void reset(void)    {
    
        pushFlash(PSTR("\r\nReset all settings? (Y/N)"));
        SerRead(data1,1,0);
        if(data1[0] == 'y') {
            ledStatusChanger(GREEN, OFF, OFF, OFF);
            speed = 100;
            countDis = 0;
            countAngle = 0;
            pushFlash(PSTR("\r\n"));
        }
        else if(data1[0] == 'n')    {
            pushFlash(PSTR("\r\n"));
        }
        else    {
            irError();
        }
    }    
    
    //Zaehlt einen Countdown herunter
    void countDown()    {
        unsigned int time = 0;
        
        pushFlash(PSTR("\r\nType countdown duration. 1 to 65535 seconds. Example: 00008 for 8 seconds\r\nASURO\\countdown>"));
        keyboardInput();
        time = (((data1[0] - 48) * 10000) + ((data2[0] - 48) * 1000) + ((data3[0] - 48) * 100) + (data4[0] - 48) * 10) + (data5[0] - 48);
        while(time > 0)   {
            pushFlash(PSTR("\r\n"));
            PrintInt(time);
            Msleep(1000);
            time--;
        }   
        pushFlash(PSTR("\r\n0\r\n"));    
    }    
    
    /*************************************************************************************************
                                    HAUPTPROGRAMM
                                    *************
    *************************************************************************************************/                               
    
    int main(void)  {  
       
       Init();  
       ledStatusChanger(GREEN, OFF, OFF, OFF);
       pushFlash(PSTR("\r\nasurOS System verion 1.0.1\r\n\r\nASURO is ready\r\nAwaiting command\r\n\r\n"));
       
       do   {   
        
          pushFlash(PSTR("ASURO>"));  
          keyboardInput();
          //Abfrage der Befehle und Starten der entsprechenden Funktion  
          //Modus "move"
          if(data1[0] == 'm' && data2[0] == 'o' && data3[0] == 'v' && data4[0] == 'e' && data5[0] == 0x0d)  {        
            moveMode();        
            clear();
            
          } 
          //Modus "help"
          else if(data1[0] == 'h' && data2[0] == 'e' && data3[0] == 'l' && data4[0] == 'p' && data5[0] == 0x0d) {    
           commandList();
           clear();        
         
          }  
          //Modus "status"
          else if(data1[0] == 's' && data2[0] == 't' && data3[0] == 'a' && data4[0] == 't' && data5[0] == 'u' && data6[0] == 's'              && data7[0] == 0x0d)    {
            ledCheck();
            batteryCheck();
            speedCheck();
            timeCheck();
            disCheck();
            clear();
            
          }  
          //Modus "set"
          else if(data1[0] == 's' && data2[0] == 'e' && data3[0] == 't' && data4[0] == 0x0d)    {
           setMode();
           clear();
           } 
          //Modus "reset" 
          else if(data1[0] == 'r' && data2[0] == 'e' && data3[0] == 's' && data4[0] == 'e' && data5[0] == 't' && data6[0] ==        0x0d)   {
            reset();
            clear();
          }
          //Modus "Countdown"
          else if(data1[0] == 'c' && data2[0] == 'o' && data3[0] == 'u' && data4[0] == 'n' && data5[0] == 't' && data6[0] == 0x0d)  {
            countDown();
            clear();
          }  
          //Wenn man was anderes eingibt, Fehlermeldung
          else    {
            irError();
            clear();
          
          }    
       }
       while(1);
       return 0;   
    }
    die bedienung ist auch ganz einfach: flasht das programm, startet in windows hyperterminal, dann startet asuro. für eine übersicht aller befehle, tippt help ein, der rest ist selbsterklärend.

    wünsche euch schonmal viel spass beim ausprobieren

    julian
    Angehängte Dateien Angehängte Dateien

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    schöne idee. wenn du dieses programm noch etwas einkürzt, und dann wieder erweiterst, könnte man dieses programm auch dazu gebrauchen, um einzelne funktionen des asuro zu testen, beispielsweise aktuelle odo-werte auszugeben oder ähnliches.

    schöne idee!
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Hallo ElTransistor,
    klasse gemacht, dafür dass du meinst mit "mangelnden programmierfähigkeit" zu scheitern.

    Dein Programm erinnert mich ein bisschen an robo.fr's ASURO programmieren mit AB++.
    Nur hast du ja einen total eigenen Ansatz für deine Lösung gewählt.
    Wenn das so mit dir weitergeht, dann ist ja noch großes zu erwarten.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  4. #4
    hi, danke erstmal

    soviel lob hätte ich jetz nun auch nich erwartet. vom code her ist das ja eigentlich nix besonderes, ich hab ja nur schon vorhandene sachen verwendet. woran ich immer scheitere sind irgendwelche algorithmen sei es zum geradeausfahren oder so. und bitverschiebungen hab ich auch noch nicht verstanden... das hier sind ja bloß ein paar schleifen und viel text

    um ehrlich zu sein habe ich mit dem asuro nicht mehr viel vor, ich möchte mir einen fahrbaren untersatz bauen der die unzulänglichkeiten des asuros nicht hat (bessere tasten bessere geradeausfahrfähigkeit). dass man das alles mit geschicktem programmieren erreichen kann ist mir klar, darum schätze ich mich ja auch als unfähig ein

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    hrhr
    versuch doch mal dein wissen zu erweitern... man kann viel machen mit dem asuro!
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Da schließe ich mich damaltor auf alle Fälle an.
    Es ist ja nicht falsch, oder frevelhaft, wenn du Code benutzt der schon da ist. Was anderes machst du ja auch nicht, wenn du die Funktionen aus der LIB benutzt.
    Es kommt ja als erstes mal darauf an, dass man mit dem was man kennt, bzw. zu dem es eine Doku gibt, irgendeine Aufgabe zu lösen.
    Das meinte ich mit meinem Lob.
    Du hast dich mit Hilfe von izaseba unheimlich schlau gemacht um die Texte im Flash unterzubringen. So viel Ehrgeiz hat schon lange nicht jeder. Deine Lösung zum warten auf ein [Enter] ist zwar tatsächlich extravagant, aber funktionsfähig. Die hast du selber entwickelt.
    Bleib bloß am Ball. Mit dem Asuro hast du ein sehr überschaubares System vor dir, zu dem es hier (und auch in anderen Foren) sehr viel kompetente Unterstützung gibt. Das findest du nicht so schnell, wenn du einen Eigenbau startest. Und zum Üben, um C zu lernen ist hier alles vorhanden.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  7. #7
    hi, danke danke Also wenn ich sehe was die anderen hier vollbringen, ist trotzdem meine leistung nicht ganz so riesig. aber da die sache mit meiner eigenkonstruktion noch etwas auf sich warten lassen wird, bleibe ich euch auch erhalten und nerve euch mit blöden fragen wenn etwas beim asuro nich klappt (die zeit der innovativen ideen scheint beim asuro ja langsam abzulaufen da schon sogut wie alles mit ihm gemacht wurde)

  8. #8
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Milda
    Alter
    37
    Beiträge
    4.063
    ooh da täusch dich mal nicht, die möglichkeiten sind sicher noch nicht ausgeschöpft...

    und fragen kannst du immer, dafür ist das forum ja da =)
    Read... or die.
    ff.mud.de:7600
    Bild hier  

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    29.05.2005
    Beiträge
    1.018
    Zitat Zitat von ElTransistor
    ... da schon sogut wie alles mit ihm gemacht wurde)
    Wie damaltor schon schreibt: Das kann nicht sein, da es ja an dir liegt, ob es noch weiteres gibt.

    Das letzte Highlight kam gerade von M1.R rein. So ganz unerwartet in einem Thread, der eigentlich nur Neues brachte, aber dann gab es noch mehr Neues darin. Um hier nur deine Neugierde zu wecken, nichts dazu was ich eigentlich meine. Weiteres solltest du unter Was will uns der ASURO eigentlich sagen ? selber erkunden.

    Also schön am Ball bleiben bitte.
    Zitat Zitat von damaltor
    und fragen kannst du immer, dafür ist das forum ja da
    Und Antworten wird es auf alle Fälle geben.

    Gruß Sternthaler
    Lieber Asuro programieren als arbeiten gehen.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    24.10.2007
    Ort
    San Jose
    Beiträge
    43
    Ich habe es mir auch draufgeflasht.
    Doch ein Problem:bei der lezten Page von euerm fertigrn Das Hexfile kommt v.v.v.v.v.v.v.v.v.v.
    Ich habe die Meldungen auch auf Deutsch übersetzt.Ich habe die Datei angehängt.
    Angehängte Dateien Angehängte Dateien
    • Dateityp: c os.c (14,8 KB, 7x aufgerufen)

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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

LiFePO4 Speicher Test