Forum: Compiler & IDEs while schleife


von Günter (Gast)


Lesenswert?

Hallo zusammen,

irgendwie steh ich auf dem schlauch (naja, der fitteste in C bin ich 
auch nicht).

Folgender Code:

unsigned int Paranum (uint8_t dx,uint8_t dy,uint8_t paramin,uint8_t 
paramax,unsigned int parawert)
{
unsigned int parareserve;
// Original Parameter Wert wegsichern
parareserve=parawert;

// Display Marker setzen auf aktuellen Parameter
lcd_gotoxy((dx-2),dy);
lcd_putc(0xbb);

  while (Taste!=0x02)
  {
    switch (Taste)
    {   // UP
      case 0x04 : if (parawert < paramax)
                {
                parawert ++;
                Dispzahl(dx,dy,parawert);
                }
            Taste=0xFF;
            break;
      //Down
      case 0x03 : if (parawert > paramin)
                {
                parawert --;
                Dispzahl(dx,dy,parawert);
                }

            Taste=0xFF;
            break;
      //ESC
      case 0x01:  parawert=parareserve;
            Taste=0x02;
            break;

    }
  }

return parawert;
}



Ziel des Codes ist, dass Tastatureingaben (mittels ISR wird 
Tastaturereignis erfragt und in Taste gespeichert), einen Wert 
verändern. Es sei denn ESC oder Enter wird gedrückt.

So, wenn ich die While schleife mal Testweise ändere zu (While parawert 
< 21) dann geht das Up und Down gut.
Aber in der obigen Form passiert nicht viel. Bei Up und Enter passiert 
gar nix. Bei Esc und Down fliegt er aus der While schleife raus.

Was mach ich denn falsch?

Bitte um Hilfe, auch wenn es wahrscheinlich mangelndes 
C-Programmiervermögen von meinerseite ist :-(

Gruss Günter

von Oliver (Gast)


Lesenswert?

Hallo Günter,
hast Du Taste als volatil deklariert?

Grüße
Oliver

von Günter (Gast)


Lesenswert?

Ja hab Taste als Volatile. Wie gesagt, funktioniert auch, wenn ich die 
While Schleife anders baue, also nicht Taste abfrage sondern was 
anderes.
Das Switch Construct funktioniert dann.

von Jens Gerdes (Gast)


Lesenswert?

Hallo,

in Deiner Funktion beschreibst Du die Variable Taste. Dieser neue Wert 
wird im Kopf der while - Schleife abgefragt. Inzwischen kann die 
Interrupt - Serviceroutine den Wert aber schon wieder verändert haben.
Gruss
Jens

von Günter (Gast)


Lesenswert?

Hallo Jens,

ja, das ist aber auch so gewollt.
Das Beschreiben der Variable Taste im "ESC" teil des switch soll das 
Abbruch kriterium setzen.
Interrupt kann zwar in der zwischenzeit kommen, wird aber nicht wirken, 
da tasten ja sowieso entprellt sind (Softwaretechnisch).
Ausserdem sollte die Funktion auch mittels "ENTER" abbgebrochen werden, 
weil genau dies ist der Wert 0x02 für Taste.
Und das passiert halt einfach nicht.

Steh immer noch vor einem Rätsel!

Gruss Günter

von Oliver (Gast)


Lesenswert?

Hallo Günter,

die Taste "Enter" hat Code 0x0D und NICHT 0x02. Die 0x02 ist dem Zeichen 
"STX" zugeornet.

Grüße
Oliver

von Günter (Gast)


Lesenswert?

Hallo Oliver,

neee neee, die Taste Enter hat bei mir 0x02. Ist eine Folientastatur, 
die direkt an nem Port angeschlossen ist.
Taste wird bei der Erkennung des Lowsignals eben spezielle Werte 
zugewiesen.

Günter

von Günter (Gast)


Lesenswert?

Ooohjeeee....

Hab den Fehler gefunden. Aber nicht an der Stelle an der ich Ihn gesucht 
habe.

Kurz zur Erklärung: Springe die obige Funktion schon mit einem 
Tastendruck als Auslöser an (Enter, was sonst). Und hab vergessen, vor 
Aufruf obiger Funktion den Wert von Taste zurückzusetzen.

Ja... ich schäm mich auch dafür! (Sag aber jetzt auch nicht, wie lange 
ich an dem Fehler geknabbert hab)

Trotzdem vielen Dank für die versuchte Hilfe.

Gruss Günter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.