Forum: Compiler & IDEs Eintastendimmer und Taster Entprellung


von Tobias (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich bin dabei mich in die AVR Programmierung einzuarbeiten und 
experimentiere gerade mit einem ATtiny45.

Ich habe es bereits einen einfachen Eintastendimmer am laufen und wollte 
diesen nun mit Peter Daneggers Tasterentprellung erweitern, so dass ich 
mit einem kurzen Tastendruck schalten kann und bei einem langen 
Tastendruck dimmen.

Die Tasterentprellung funktioniert einwandfrei. Schalten mit kurzem 
Tastendruck funktioniert auch wie es soll. Nur der Dimmer tut nicht mehr 
richtig. Er dimmt kurz hoch und dann gleich wieder zurück wenn ich 
versuche die Richtung auszuwerten.

-> Frage 1: Kann mir jemand erklären warum der Dimmer bei gedrückter 
Taste nicht in eine Richtung weiterdimmt, sondern laufen die Richtung 
wechselt?

Wenn ich die "Richtungsauswertung" weglasse funktioniert das Dimmen zwar 
(in eine Richtung), aber seeehr langsam.

-> Frage 2: Wieso beeinflusst die Tasterentprellung die 
Dimmgeschwindigkeit so massiv?

Ich wäre sehr dankbar, wenn mich jemand wieder auf die richtige Spur 
setzen kann.

Anbei noch der Code ...

Merci!

Tobias

von Tobias (Gast)


Angehängte Dateien:

Lesenswert?

Uuups, da ist mit dem Code was schief gegangen ...

... jetzt der richtige Code.

von Karl H. (kbuchegg)


Lesenswert?

Weil dir eine Dauer-gedrückte Taste bei der Abfrage als eine Serie von 
TRUEs aus der get_key_rpt_l rauskommen.

D.h. du musst das so behandeln, als ob der Benutzer die Taste immer 
wieder drücken und loslassen würde. Ein Autorepeat verhält sich genau 
so, was im Regelfall auch soweit Sinn macht, denn wenn ich mit den 
Tasten einen Zahlenwert vergrößere oder verkleinere, dann will ich das 
ja genau so haben.

1
...
2
3
   if( get_key_press( 1 << INCREASE_KEY ) ||
4
       get_key_rpt( 1 << INCREASE_KEY )
5
   {
6
     Zähler erhöhen
7
   }

Drückt der Benutzer einmalig auf die Taste, dann wird der Zähler erhöht. 
Bleibt er länger drauf, dann werden dem Programm über get_key_rpt 
laufend weitere Tastendrucke vorgegaukelt, die dann ebenfalls zu den 
Zählererhöhungen führen.

Du musst allerdings nicht beide Aufrufe in ein und derselben Abfrage 
haben. Zb. kann man obiges auch so benutzen
1
   if( get_key_press( 1 << INCREASE_KEY ) )
2
   {
3
     Zähler um 1 erhöhen
4
   }
5
6
   if( get_key_rpt( 1 << INCREASE_KEY )
7
   {
8
     Zähler um 10 erhöhen
9
   }

Drückt der Benutzer einmalig auf die Taste, dann erhöht er den Zähler um 
1. Bleibt er auf der Taste drauf, dann fängt der Zähler an, sich um 
jeweils 10 zu erhöhen.

Bei dir wäre das dann zb. das du mit einem get_key_press den 
Schaltvorgang machst und beim get_key_rpt den Dimmvorgang, wobei du 
selbstverständlich die Richtungsumschaltung dann nur im get_key_rpt 
machst. Wichtig: Die Richtungsumschaltung muss sich an den Zahlenwerten 
orientieren und nicht an den Tastendrücken. Denn der get_key_rpt liefert 
ja mehrmals ein TRUE zurück solange der Benutzer auf der Taste bleibt. 
Aber er tut das nicht bei jedem Aufruf, sondern in den eingestellten 
Zeitintervallen, die den Autorepeat darstellen sollen.


Und genau da liegt auch das Problem in deinem Code. Du hast dich hier
1
   if( get_key_long_r( 1<<KEY0 ) || get_key_rpt_l( 1<<KEY0 ))
2
      {
3
      pressed = 1;
4
      if( direction )
5
        {
6
          if( pwm < 255 )
7
              ++pwm;
8
        }
9
      else
10
        {
11
          if( pwm > 0 )
12
              --pwm;
13
        }
14
    }
15
    else if( pressed )
16
      {
17
         pressed = 0;
18
         direction = 1 - direction;
19
      }
mit dem pressed Flag selbst ausgetrickst.
1
   if( get_key_long_r( 1<<KEY0 ) || get_key_rpt_l( 1<<KEY0 ))
2
   {
3
      if( direction )
4
      {
5
        if( pwm < 255 )
6
          ++pwm;
7
      }
8
      else
9
      {
10
        if( pwm > 0 )
11
          --pwm;
12
      }
13
14
      if( pwm == 0 || pwm == 255 )
15
         direction = 1 - direction;
16
    }

: Bearbeitet durch User
von Blöde Frage (Gast)


Lesenswert?

Tobias schrieb:
> PWM_Dimmer_entprellt.txt

Was für ein Compiler verwendet die File-Extension "txt"?7

IMHO ist das ganz gewöhnlicher C-Code.

von Peter D. (peda)


Lesenswert?

Da ich die Programmiersprache TXT nicht kenne, schaue ich mir sowas 
garnicht erst an.
Die Forensoftware kann für TXT nichtmal Syntax-Highlighting.

von m.n. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Da ich die Programmiersprache TXT nicht kenne, schaue ich mir sowas
> garnicht erst an.

Wenn sich jetzt jeder meldet, der sich die Datei nicht ansieht, wird es 
hier richtig voll. Niemand ist gezwungen, hier zu antworten.

Wenn man nicht ganz so arrogant drauf ist, sieht man, dass es ein 
C-Quelltest ist.

von Peter D. (peda)


Lesenswert?

m.n. schrieb:
> Wenn man nicht ganz so arrogant drauf ist

Ich finde es arrogant, etwas zu posten, ohne darüber nachzudenken, 
welches Format sinnvoll ist.
Als Fragesteller darf man ruhig mal etwas mitdenken.

Ich warte schon darauf, bis nächstens einer seinen Quelltext als mpeg 
bei Youtube einstellt.
DOC und JPG hatten wir ja schon.

: Bearbeitet durch User
von m.n. (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ich warte schon darauf, bis nächstens einer seinen Quelltext als mpeg
> bei Youtube einstellt.

So ein Quatsch!
Jedes Kind weiß, was eine .TXT-Datei ist und dass man sie einfach in 
xyz.c umbenennen kann.

von Peter D. (peda)


Lesenswert?

m.n. schrieb:
> Jedes Kind weiß, was eine .TXT-Datei ist und dass man sie einfach in
> xyz.c umbenennen kann.

Aber der Fragesteller scheinbar nicht.
Warum soll das jeder Leser für sich  machen müssen, statt einmal der 
Fragesteller?

von Tobias (Gast)


Lesenswert?

Hallo Karl Heinz,

besten Dank für deinen Wink mit dem Zaunpfahl. Das war der Knoten in 
meinem Kopf. Jetzt tut der Code genau so wie ich will.
Und besten Dank auch dafür, dass Du Dir meinen Code angesehen hast 
obwohl ich so nachlässig war ihn als *.txt anzuhängen. Naja ich wollte 
mich halt an die Forenregeln halten und "Längeren Sourcecode nicht im 
Text einfügen, sondern als Dateianhang". Aber wie man es macht ...

@Peter: Vielen Dank für den großartigen Code zur Tasterentprellung. Ich 
habe einige Zeit gebraucht um zu verstehen wie das funktioniert. Aber 
mit Deinen Kommentaren hats Du Dich für mich jetzt selbst entzaubert.

Ach und zumindest weiß ich, dass *.txt eine Dateinamenserweiterung ist - 
und keine Programmiersprache. ;-)

Beste Grüße,
Tobias

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.