Forum: Mikrocontroller und Digitale Elektronik Drehencoder reagiert ohne Abfrage


von Lokus P. (derschatten)


Lesenswert?

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
.......

von MaWin (Gast)


Lesenswert?

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).

von Lokus P. (derschatten)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

Poste VOLLständigen Code als Anhang.

von Lokus P. (derschatten)


Angehängte Dateien:

Lesenswert?

im Anhang

von Falk B. (falk)


Lesenswert?

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

von Lokus P. (derschatten)


Lesenswert?

Danke!

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.