while schleife

Gast #39766
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
Gast
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.
Gast
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
Gast
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
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.