PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleines Programm mit Fehlern...



Hans Z
08.01.2007, 23:36
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


#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);
}

linux_80
09.01.2007, 00:21
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.

Hans Z
09.01.2007, 07:27
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

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


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

Ronny10
09.01.2007, 11:26
Poste doch mal das komplette Programm. Mit deinen Programm-Fragmenten kann man so nichts anfangen!
Gruß, Peter (Ronny10)