- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 24

Thema: Asuroprojekt mit Odometrie und LCD-Display

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    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);
    }
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

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

  3. #3
    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.

  4. #4
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    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){} 
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  5. #5
    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)

  6. #6
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    62
    Beiträge
    5.799
    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 ;)
    Bild hier  
    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  7. #7
    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!!!!!!)

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    29.03.2011
    Beiträge
    9
    so
    tut mir echt leid für die verspätete antwort hatte letzen tage bissl stress^^
    das hier ist mein volles programm
    ich gehe mal von aus das ihr das dann versteht was o auf sich hat
    Code:
    #include "stdlib.h"
    #include "asuro.h"
    #include "lcd.h"
    #include "i2c.h"
    
    int speed = 100;
    int o = 1;
    
    void start(int speed)
    {
     int keys;
     int i = 1;
     int zaehler = 0 ;
     while(i >0)
    	  {
     	   keys = PollSwitchLCD();
       	   if (keys & LCD_KEY_YELLOW)		//schwarzer Taster
      	   {
    	   	while ( zaehler == 0)
    		{
    		 if(speed < 350)					//Geschwindigkeit erhöhen
    		 {
             speed = speed +10;
    		 ClearLCD(); 
    		 PrintSetLCD(0,0,"Geschwindigkeit");
    		 SetCursorLCD(0, 1);
    		 zaehler  = zaehler +1;
        	 PrintIntLCD(speed);
    		 }
             zaehler  = zaehler +1;
    		 }
      		 }
             else if (keys & LCD_KEY_RED )	//roter Taster
        	 {								//wechseln von der Geschwindigkeiseinstellung
             i = 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(0, 1);
    	     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--;
    
    	  
    
    }
    
    void berechnung(int zeit)
    {
     int keys;
     int reifen = 120; //Reifenumfang in mm
     int wegaenderung = 0;
     int inszeit = 0;
     int geschwindigkeit = 0;
     int durchschnitt = 0;
     int zaehler = 1 ;
    
    
      while(1)
      {	
      	
      	int odometrie =  encoder[0];
    
        wegaenderung = odometrie + reifen / 8 / 10;
    	inszeit = Gettime() /1000;
    	geschwindigkeit = wegaenderung / inszeit;
    	durchschnitt = wegaenderung / inszeit;
        keys = PollSwitchLCD();
          if(keys)				// für das ständige aktuallisieren der Daten
    	     {
    	     zaehler = 0;
             }
          if ((keys & LCD_KEY_YELLOW) || (zaehler == 1) ) // Geschwindigkeit
             {
    		 ClearLCD(); 
    		 PrintSetLCD(0,0,"CM pro S");
    		 SetCursorLCD(0, 1);
        	 PrintIntLCD(geschwindigkeit);
    		 zaehler = 1; 
    		 }
          else if ((keys & LCD_KEY_RED) || (zaehler == 2)) //Zurückgelegter Weg
             {
    		 ClearLCD(); 
    		 PrintSetLCD(0,0,"Weg in CM");
    		 SetCursorLCD(0, 1);
        	 PrintIntLCD(wegaenderung);
    		 zaehler = 2;  
             }
          else if ((keys & LCD_KEY_BLUE) || (zaehler == 3)) // Durchschnittsgeschwindigkeit
             {
    		 ClearLCD(); 
    		 PrintSetLCD(0,0,"CM pro S");
    		 SetCursorLCD(0, 1);
        	 PrintIntLCD(durchschnitt);
    		 zaehler = 3;
    		 }
    	
        Msleep(100);
      }
    }
     
     //Hauptprogramm 
    int main(void)
    {
    
        //Geschwindigkeit 
        //void int speed = 100;
       
    
    	
        Init();
    	InitI2C();
        InitLCD();
    	EncoderInit();
    	EncoderSet(780,790);
    	EncoderStart();
        GREEN_LED_ON;
    
    	while(o > 0)
    	{
        PrintSetLCD(0,0,"Geschwindigkeit");
    	SetCursorLCD(0, 1);
    	PrintIntLCD(speed);
    	start(speed);
    	}
    	MotorDir(FWD,FWD);
        MotorSpeed(speed,speed);
    	int zeit = Gettime() / 1000;	//zeit in Sekunden
    	ClearLCD(); 
    	PrintIntLCD(zeit);
    	berechnung(zeit);
    	
        
      	 
    }
    das einzigste problem ist einfach das speed mit start zwar verändert werden kann aber nicht weiter übernommen wird

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress