Drehencoder reagiert ohne Abfrage

OP #2185012
Ich verwende die Universelle Tastenabfrage von Peter Dannegger und das 
Drehgeberbeispiel.
Habe in meiner Programm jedoch ein seltsames verhalten.

Wenn der AVR gestartet wird, dürfte der Drehgeber bereits ausgelesen 
werden, obwohl ich in dem Programm zuerst auf eine tastenabfrage 
reagiere bevor der Drehgeberteil aktiviert wird.

Drehe ich nämlich am Geber und wechsle dann mittels Taster ind die 
Schleife wird hier bereits der geänderte Wert des Drehgebers ausgegeben.

Woran liegt das?
1
int main(void)
2
{
3
  int32_t val = 0;
4
  ioinit();
5
  eeprom_var();
6
  encode_init();
7

8
  sei();                            // Interrupts aktivieren
9

10
  for(;;)
11
  {
12
    LEDS_PORT = _DP;
13

14
    if(get_key_short(ENC_TASTER))
15
    {
16
      timer = 1;
17
      while(ende != 1)
18
      {
19
        val += encode_read();
20

21
        if(nSelect == 0)                    // Haupt-Menü
22
        {
23
          if (val > 3) val = 3;
24
          if (val < 0) val = 0;
25
        }
26

27
        if(nSelect == 1)                    // Floppy-ID Menü
28
        {
29
          if (val > 5) val = 5;
30
          if (val < 4) val = 4;
31
        }
32

33
        if(nSelect == 2)                    // Kernal-Menü
34
        {
35
          if (val > 9) val = 9;
36
          if (val < 6) val = 6;
37
        }
38

39
        if(nSelect == 3)                    // Schreibschutz-Menü
40
        {
41
          if (val > 11) val = 11;
42
          if (val < 10) val = 10;
43
        }
44

45
        switch(val)
46
        {
47
          // Hauptmenü
48
          case 0:
49
            LEDS_PORT = _I | marker;            // I (00110000) -> ID
50
            if(get_key_short(ENC_TASTER))
51
            {
52
              val = 4;
53
              nSelect = 1;
54
            }
55
            break;
56

57
.......
Gast
Schreibe in deine Endlosschleife

    x=get_key_short(ENC_TASTER))
    val += encode_read();

und baue KEINE zweite Stelle mit einem
Aufruf nach get_key_short(ENC_TASTER))
ein.

Klingt kompliziert "aber ich muß mein
Programm umstrukturieren, ich weß gar
nicht wie" ? Ja, aber genau dann
klappt's auch, weil darin die Ursache
liegt und quasi automatisch behoben wird
wenn man's richtig macht.

Die Schleife muß schnell und immer
wiederholt laufen, EGAL in welchem Menüpunkt
oder Zustand man gerade steckt. Steuer den
Zustand anders, macht man meist mit einer
globalen Variablen.

(ja, es gibt auch andere Lösungen, z.B.
gemeinsame read-Input Funktion, aber eine
Lösung reicht dir ja hoffentlich, ud ich
nehme die, die hinterher funktioniert).
OP
Ist mir nicht so ganz klar was du meinst.

Warum den encoder bereits in der Startschleife auslesen wenn ich ihn 
dort noch gar nicht benötige?

Und was meinst du mit "baue KEINE zweite Stelle mit einem Aufruf nach 
get_key_short(ENC_TASTER))ein." ?

Das ich nach der Tastenabfrage keine weitere Schleife verwenden soll?
Hmm, da hast du einiges zusammenkopiert.

>Wenn der AVR gestartet wird, dürfte der Drehgeber bereits ausgelesen

Sicher, die Routine läuft ja schin im der ISR.

>Drehe ich nämlich am Geber und wechsle dann mittels Taster ind die
>Schleife wird hier bereits der geänderte Wert des Drehgebers ausgegeben.

Logisch, du musst am Anfang NACH dem ersten Tastendruck einen Reset 
machen.

1
 if(get_key_short(ENC_TASTER))
2
    {
3
      encode_read();   // hier der einmalige Reset
4
      timer = 1;
5
      while(ende != 1)
6
      {
7
        val += encode_read();
8

9
        if(nSelect == 0)                    // Haupt-Menü

MFG
Falk

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 15 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.