mikrocontroller.net

Forum: Compiler & IDEs while schleife


Autor: Günter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Günter,
hast Du Taste als volatil deklariert?

Grüße
Oliver

Autor: Günter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens Gerdes (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Günter,

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

Grüße
Oliver

Autor: Günter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Günter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.