- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 4 von 4

Thema: Kleines Programm mit Fehlern...

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    29.12.2006
    Ort
    Bayern
    Alter
    69
    Beiträge
    41

    Kleines Programm mit Fehlern...

    Anzeige

    Praxistest und DIY Projekte
    Hallo,

    ich habe ein kleines Programm – eigentlich ursprünglich als Funktion – geschrieben, welches mit dem Asuro kommunizieren soll. Leider kann man nur einmal unter den Punkten 1 bis 7 Daten eingeben. Wenn man z.B. dann wieder eine 2 für dMotGTol eingibt, dann kommt man nicht mehr zur Eingaberoutine, sondern das Menü läuft wieder durch. Irgend etwas ist falsch…
    Kann mir einer weiterhelfen?

    Grüße, Hans

    Code:
    #include "asuro.h" 
    
    int main(unsigned int *PCDaten)
    {
    
    	unsigned char cmd, cmd2;
    	unsigned int tmpDaten[8];
    	int i;
    	Init();	
    	for(i=0;i <= 6; i++)
    	{	StatusLED(RED);
    		Msleep (50);
    		StatusLED(GREEN);
    		Msleep (50);
    		tmpDaten[i] = PCDaten[i];
    	}
    
    	
    	cmd = cmd2 = 255;
    	while ((cmd != 'q') && (cmd != 's'))	// ************************************** !!!!!!!!!!!!!!!!!
    	{
    		SerWrite("\n\r       PC-Menue",17);
    		SerWrite("\n\r ====================== ",26);
    		SerWrite("\n\r SollMotGeschw.........1: ",28);	PrintInt(tmpDaten[0]);
    		SerWrite("\n\r dMotGTol..............2: ",28);	PrintInt(tmpDaten[1]);
    		SerWrite("\n\r MotGeschStep..........3: ",28);	PrintInt(tmpDaten[2]);
    		SerWrite("\n\r StartWeg..............4: ",28);	PrintInt(tmpDaten[3]);
    		SerWrite("\n\r dWegZul...............5: ",28);	PrintInt(tmpDaten[4]);
    		SerWrite("\n\r RegelintZeit..........6: ",28);	PrintInt(tmpDaten[5]);
    		SerWrite("\n\r ZuFahrendeStrecke.....7: ",28);	PrintInt(tmpDaten[6]);
    		SerWrite("\n\r Quit ohne speichern...q  ",28);	
    		SerWrite("\n\r Ende mit speichern....s  ",28);
    		SerWrite("\n\r             Eingabe ---> ",28);
    		cmd = 255;	
    		SerRead(&cmd,1,0);	// Daten einlesen
    		switch (cmd)
    		{
    			case '1':
    				while (cmd2 != 's')
    				{
    					SerWrite("\n\r SollMotGeschw (",18); PrintInt(tmpDaten[0]);
    					SerWrite(") --->: ",8); 
    					cmd2 = 255;	
    					SerRead(&cmd2,1,0);	// Daten einlesen
    					switch (cmd2)
    					{
    						case '8': 	tmpDaten[0] = tmpDaten[0] + 10;
    									break;
    						case '2': 	tmpDaten[0] = tmpDaten[0] - 10;
    									break;
    					}
    				}
    				break;
    			case '2':
    				while (cmd2 != 's')
    				{
    					SerWrite("\n\r dMotGTol (",13); PrintInt(tmpDaten[1]);
    					SerWrite(") --->: ",8);
    					SerRead(&cmd2,1,0);	// Daten einlesen
    					switch (cmd2)
    					{
    						case '8': 	tmpDaten[1]++;
    									break;
    						case '2': 	tmpDaten[1]--;
    									break;
    					}
    				}
    				break;
    			case '3': 
    				while (cmd2 != 's')
    				{
    					SerWrite("\n\r MotGeschStep (",16); PrintInt(tmpDaten[2]);
    					SerWrite(") --->: ",8);
    					SerRead(&cmd2,1,0);	// Daten einlesen
    					switch (cmd2)
    					{
    						case '8': 	tmpDaten[2]++;
    									break;
    						case '2': 	tmpDaten[2]--;
    									break;
    					}
    				}
    				break;
    			case '4': 
    				while (cmd2 != 's')
    				{
    					SerWrite("\n\r StartWeg (",13); PrintInt(tmpDaten[3]);
    					SerWrite(") --->: ",8);
    					SerRead(&cmd2,1,0);	// Daten einlesen
    					switch (cmd2)
    					{
    						case '8': 	tmpDaten[3]++;
    									break;
    						case '2': 	tmpDaten[3]--;
    									break;
    					}
    				}
    				break;
    			case '5': 
    				while (cmd2 != 's')
    				{
    					SerWrite("\n\r dWegZul (",12); PrintInt(tmpDaten[4]);
    					SerWrite(") --->: ",8);
    					SerRead(&cmd2,1,0);	// Daten einlesen
    					switch (cmd2)
    					{
    						case '8': 	tmpDaten[4]++;
    									break;
    						case '2': 	tmpDaten[4]--;
    									break;
    					}
    				}
    				break;
    			case '6': 
    				while (cmd2 != 's')
    				{
    					SerWrite("\n\r RegelintZeit (",17); PrintInt(tmpDaten[5]);
    					SerWrite(") --->: ",8);
    					SerRead(&cmd2,1,0);	// Daten einlesen
    					switch (cmd2)
    					{
    						case '8': 	tmpDaten[5] = tmpDaten[5] + 10;
    									break;
    						case '2': 	tmpDaten[5] = tmpDaten[5] - 10;
    									break;
    					}
    				}
    				break;
    			case '7': 
    				while (cmd2 != 's')
    				{
    					SerWrite("\n\r ZuFahrendeStrecke (",22); PrintInt(tmpDaten[6]);
    					SerWrite(") --->: ",8);
    					SerRead(&cmd2,1,0);	// Daten einlesen
    					switch (cmd2)
    					{
    						case '8': 	tmpDaten[6] = tmpDaten[6] +100;
    									break;
    						case '2': 	tmpDaten[6] = tmpDaten[6] -100;
    									break;
    					}
    				}
    				break;
    			//default: SerWrite("\n\r Eingabe unzulaessig.",24);;
    		}	// End SWITCH
    		
    	}	// End WHILE
    	
    	if (cmd == 's')		// Werte speichern
    	{	SerWrite("\n\r Asuro speichert die Daten...",31);
    		for(i=0;i <= 6; i++)
    		{
    		   	PCDaten[i] = tmpDaten[i];
    			StatusLED(GREEN);
    			Msleep (100);
    			StatusLED(OFF);
    			Msleep (100);
    		}
    		StatusLED(GREEN);
    	}
    	SerWrite("\n\r",2);
    	while(1);
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Beiträge
    2.731
    Hallo,

    Du solltest evtl. eine Schleife um das ganze Programm, bzw. um den Teil, der stetig ausgeführt werden soll, machen. Denn wenn das Programm einmal unten angekommen ist, beim while(1) ist es fertig, und macht nix mehr !

    Dann hast du bei main ein Argument angegeben, normalerwiese kann man da nur Daten aus der Kommandozeile übergeben (argc, argv), welche es beim AVR ja nicht gibt, also schreibt man dort void hin.
    Du musst mal die warnings anschauen, die beim compilieren ausgegeben werden.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    29.12.2006
    Ort
    Bayern
    Alter
    69
    Beiträge
    41
    Danke für den Hinweis,

    das Programm läuft bei mir normalerweise als Funktion. Die Warnhinweise kommen nur, wenn man es als main() compiliert. Ich habe die ursprüngliche Funktion nur der Einfachheit halber in eine main() gepresst, damit Ihr es leichter ausprobieren könnt.
    Das ändert aber nichts daran, dass mein Programm trotz der
    Code:
    SerRead(&cmd,1,0);   // Daten einlesen 
          switch (cmd)
    …..

    Schleife nicht mehr daran denkt, z.B. auf eine „3“ richtig zu reagieren und in die untergeordnete
    Code:
    case '3': 
                while (cmd2 != 's') 
                { 
                   SerWrite("\n\r MotGeschStep (",16); PrintInt(tmpDaten[2]); 
                   SerWrite(") --->: ",8); 
                   SerRead(&cmd2,1,0);   // Daten einlesen 
                   switch (cmd2)
    zu verzweigen.

    Das „while(1);“ habe ich nur darum geschrieben, weil es in einer main() notwendig ist, damit das Programm nicht evtl. den Code im Speicher des ATMEL weiter ausführt, der noch von früheren Programmen drin steht. Bei meiner Funktion steht das natürlich nicht.


    Gruß, Hans

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    23.05.2006
    Beiträge
    62
    Poste doch mal das komplette Programm. Mit deinen Programm-Fragmenten kann man so nichts anfangen!
    Gruß, Peter (Ronny10)

Berechtigungen

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

Labornetzteil AliExpress