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
Uuups, da ist mit dem Code was schief gegangen ... ... jetzt der richtige Code.
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
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.
Da ich die Programmiersprache TXT nicht kenne, schaue ich mir sowas garnicht erst an. Die Forensoftware kann für TXT nichtmal Syntax-Highlighting.
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.
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
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.