-         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 24

Thema: Asuroprojekt mit Odometrie und LCD-Display

  1. #11
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Anzeige

    Praxistest und DIY Projekte
    Zitat Zitat von Hermann Wessel Beitrag anzeigen
    emm wie gesagt ich hab das ja mit dem lcd-display programmiert und dieser besitzt 3 taster
    und dann hab ich halt ne funktion geschrieben, die von der main aufgerufen wird, die dann bei tasterdrücken die vaiable speed 10 höher oder niedriger setzt
    aber der wert bleibt in der funktion und geht nich mit rüber ins hauptporgramm
    glasskügel?
    Einer Magische Glasskügel:



    Na ja, dass das LCD-display Taster hat ist mir schon bekannt. Aber in welcher Folge sind sie an geprellt.

  2. #12
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    57
    Beiträge
    5.796
    Blog-Einträge
    8
    Hallo

    Hier zuerst mal dein etwas umformatierter Code:
    PHP-Code:
    #include "stdlib.h"
    #include "asuro.h"
    #include "lcd.h"
    #include "i2c.h"


    int o 1;

    void start(int speed)
    {
        
    int keys;
        
    int i 1;
        
    int zaehler ;
        while(
    >0)
        {
            
    keys PollSwitchLCD();
            if (
    keys LCD_KEY_YELLOW)        //schwarzer Taster
            
    {
                while ( 
    zaehler == 0)
                {
                    if(
    speed 355)                    //Geschwindigkeit erhöhen
                    
    {
                        
    speed speed +10;
                        
    ClearLCD();
                        
    PrintSetLCD(0,0,"Geschwindigkeit");
                        
    SetCursorLCD(01);
                        
    zaehler  zaehler +1;
                        
    PrintIntLCD(speed);
                    }
                    
    zaehler  zaehler +1;
                }
            }
            else if (
    keys LCD_KEY_RED )    //roter Taster
                
    {                                //wechseln von der Geschwindigkeiseinstellung
                    
    0;                            //in den Messbetrieb
                
    }
                else if (
    keys LCD_KEY_BLUE )    //Blauer Taster
                    
    {
                        while ( 
    zaehler == 0)
                        {
                            if(
    speed >0)
                            {
                                
    speed speed -10;                //Geschwindigkeit vermindern
                                
    ClearLCD();
                                
    PrintSetLCD(0,0,"Geschwindigkeit");
                                
    SetCursorLCD(01);
                                
    PrintIntLCD(speed);
                                
    zaehler  zaehler +1;
                            }
                            
    zaehler  zaehler +1;
                        }
                    }

            if(!
    keys)                // für das einmalige hochzählen beim drücken eines knopfes
            
    {
                
    Msleep(100);
                
    zaehler 0;
            }
        }
        
    o--;
    }

    //Hauptprogramm
    int main(void)
    {
        
    //Geschwindigkeit
        //void int speed = 100;

        
    int speed 100;

        
    Init();
        
    InitI2C();
        
    InitLCD();
        
    GREEN_LED_ON;

        while(
    0)
        {
            
    PrintSetLCD(0,0,"Geschwindigkeit");
            
    SetCursorLCD(01);
            
    PrintIntLCD(speed);
            
    start(speed);
        }
        
    MotorDir(FWD,FWD);
        
    MotorSpeed(speed,speed);

    return 
    0;

    Was mir als Wichtigstes erscheint: Eigentlich dürftest du nur einmal eine Ausgabe von speed erhalten, denn nach dem ersten Aufruf von start() wird o (sehr schlechter Variablenname!) zu 0 und das Programm verläßt nach MotorSpeed(); den asuro (und verschwindet im Nirwana!):

    PHP-Code:
        while(0)
        {
    ...
            
    PrintIntLCD(speed);
            
    start(speed);
        }
        
    MotorDir(FWD,FWD);
        
    MotorSpeed(speed,speed);

    return 
    0;

    Zur besseren Übersichtlichkeit würde ich die if/else-Verschachtelungen in Start() durch switch/case ersetzen. Dann würde ich das Hauptprogramm in eine Endlosschleife packen und dann einen neuen Versuch starten.

    "Würde", denn ohne LCD mit seiner Lib und der I2C-Lib kann ich nun überhaupt nichts mehr selbst testen, ich kann's nun nicht mal mehr übersetzen. :(

    Aber egal, mach mal weiter.

    Gruß

    mic


    Edit: Anstelle von while(o > 0) ein while(1) wäre ein schneller Test für die start()-Funktion ohne Motorbewegung. ;)
    Geändert von radbruch (31.03.2011 um 19:56 Uhr)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  3. #13
    Neuer Benutzer Öfters hier
    Registriert seit
    29.03.2011
    Beiträge
    9
    hm ich glaube wir reden an einander vorbei
    in dem programm gebe ich ja die variable speed zur funktion start und dort kann ich das ja mithilfe der taster rauf oder runter setzen
    das problem ist lediglich das er den wert speed nicht wieder zur main gibt, sondern nur mit dem definierten wert 100 nimmt.
    im internet habe ich gelesen das (int &speed) helfen sollte funktioniert aber nicht.
    das ist garnicht das fertige programm doch das problem ist mir beim schreiben des programmes aufgefallen das das nich funktioniert.
    bei bedarf kann ich hier das fertige programm poste

    mfg
    Hermann

  4. #14
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    57
    Beiträge
    5.796
    Blog-Einträge
    8
    Upps, du hast recht, wir reden aneinander vorbei. Versuche es mal so:

    void start()
    {
    ....

    start() sollte dann die Variable speed von main() übenehmen. Wenn's dann immer noch nicht funzt:

    //Hauptprogramm

    int speed = 100;

    int main(void)
    {
    Init();
    ...

    So ist speed auf jeden Fall global

    Oder start() als Funktion mit Rückgabewert:

    int start(int speed)
    {
    ...
    }
    o--;
    return(speed);
    }

    und Aufruf mit Zuweisung:

    ...
    PrintIntLCD(speed);
    speed = start(speed);
    }

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #15
    Neuer Benutzer Öfters hier
    Registriert seit
    29.03.2011
    Beiträge
    9
    hmm hab alles ausprobiert.. der arbeitet aber trotzdem mit 100

  6. #16
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Sind deine änderungen in das .c datei gespeichert und dannach neu ubersetzt? Das speichern wird oft vergessen.

  7. #17
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    57
    Beiträge
    5.796
    Blog-Einträge
    8
    Oje, langsam wird's zäh. Versuche mal das:
    PHP-Code:
    #include "stdlib.h"
    #include "asuro.h"
    #include "lcd.h"
    #include "i2c.h"

    int o 1;

    //Geschwindigkeit
    int speed 100;

    void start(void)
    {
        
    int keys;
        
    int i 1;

        while(
    i)
        {
            
    keys PollSwitchLCD();
            if(!
    keys)
            {
                
    Msleep(100);
            }
            else
            {
                switch(
    keys)
                {
                   case 
    LCD_KEY_YELLOW:
                      if(
    speed 246speed speed +10;
                      break;
                   case 
    LCD_KEY_BLUE:
                       if(
    speed 9speed speed -10;
                       break;
                   case 
    LCD_KEY_RED:
                      
    0;
                      break;
                }
                
    ClearLCD();
                
    PrintSetLCD(0,0,"Geschwindigkeit");
                
    SetCursorLCD(01);
                
    PrintIntLCD(speed);
            }
        }
        
    o--;
    }

    //Hauptprogramm

    int main(void)
    {

        
    Init();
        
    InitI2C();
        
    InitLCD();
        
    GREEN_LED_ON;

        while(
    0)
        {
            
    PrintSetLCD(0,0,"Geschwindigkeit");
            
    SetCursorLCD(01);
            
    PrintIntLCD(speed);
            
    start();
        }
        
    MotorDir(FWD,FWD);
        
    MotorSpeed(speed,speed);

        while(
    1); // Das Programm darf nie beendet werden!
        
    return 0;

    Nicht getestet, aber mit diesen Dummy-Files fehlerfrei übersetzt:

    lcd.h:
    PHP-Code:
    #define LCD_KEY_YELLOW 1
    #define LCD_KEY_BLUE 2
    #define LCD_KEY_RED 4

    void InitLCD(void);
    int PollSwitchLCD(void);
    void ClearLCD(void);
    void SetCursorLCD(unsigned char columunsigned char line);
    void PrintIntLCD(int i);
    void PrintSetLCD(unsigned char columunsigned char linechar *data);

    void InitI2C(void); 
    lcd.c
    PHP-Code:
    #define LCD_KEY_YELLOW 1
    #define LCD_KEY_BLUE 2
    #define LCD_KEY_RED 4

    void InitLCD(void){}
    int PollSwitchLCD(void){return(0);}
    void ClearLCD(void){}
    void SetCursorLCD(unsigned char columunsigned char line){}
    void PrintIntLCD(int i){}
    void PrintSetLCD(unsigned char columunsigned char linechar *data){}

    void InitI2C(void){} 

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  8. #18
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Aber dan wird es immer noch das selbe Zeichen auf dem LCD. (Geschwindigkeit 100) Weil am ende der erste Durchlauf von start wird die globale Variable o auf 0 gesetzt. (ist am Anfang 1) Das verhindert den zweite Durchlauf von den while-schleife in das main Programm. Und geht dann (nach der Motor Kommandos) in dem Endlos--schleife von Radbruch. Was genau bedeutet diese Variable "o". Was ist ihre Funktion in dein (Hermann Wessel) Logik? Wieso wird sie am ende von den start Funktion decrementiert?
    Geändert von Valen (01.04.2011 um 14:58 Uhr)

  9. #19
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    57
    Beiträge
    5.796
    Blog-Einträge
    8
    Das Display wird auch in start() nach jedem Tastendruck aktualisiert. Sein Programm ist wohl ein Ausschnitt eines größeren Programms, vielleicht dient o dort zur Steuerung des Ablaufs? In meiner Version wird speed einmalig editiert und dann schwirrt der asuro davon ;)

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  10. #20
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    01.03.2008
    Ort
    Niederlanden
    Beiträge
    1.170
    Radbruch stimmt. Ohne Roten Taster wird es in dem Funktion start stecken bleiben und dem LCD aktualisieren.

    (Notiz an selb: NICHT 2 Quellcodes durcheinander liesen!!!!!!)

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Ähnliche Themen

  1. Odometrie
    Von HAWK-Matze im Forum Asuro
    Antworten: 33
    Letzter Beitrag: 05.03.2008, 09:40
  2. Odometrie die 10.000
    Von NebuK im Forum Asuro
    Antworten: 5
    Letzter Beitrag: 10.11.2006, 13:02
  3. odometrie
    Von Toschtosch im Forum Asuro
    Antworten: 9
    Letzter Beitrag: 03.11.2006, 19:52
  4. Navigation mit Odometrie
    Von Rosowitsch im Forum Asuro
    Antworten: 1
    Letzter Beitrag: 07.06.2006, 16:36
  5. Odometrie LED
    Von Rosowitsch im Forum Asuro
    Antworten: 2
    Letzter Beitrag: 30.05.2006, 20:29

Stichworte

Berechtigungen

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