In meinem Programm habe ich 2 Timer definiert. .) Einmal wird abgefragt ob ein Drehencoder gedreht bzw. eine taste lang oder kurz gedrückt wird. .) Und beim zweiten läuft eine Schleife die mittels PWM eine LED zum pulsieren bringen soll. Das ganze funktioniert jedoch nur soweit, dass die LED nur dann pulsiert, wenn der Drehencoder bewegt wird (gedreht wird). Läuft der Timer der den Encoder auf 0 zurücksetzt ab, hört auch die LED zum pulsieren auf. Kann mir da jemand einen Tipp geben wo der Fehler ist?
Hi >uint8_t get_key_short(uint8_t key_mask) >{ > cli(); > return get_key_press(~key_state & key_mask); >} Sollen die Interrupts ausgeschaltet bleiben? MfG Spess
nein, aber der wird hier:
1 | uint8_t get_key_press(uint8_t key_mask) |
2 | { |
3 | cli(); |
4 | key_mask &= key_press; |
5 | key_press ^= key_mask; |
6 | sei(); |
7 | return key_mask; |
8 | } |
doch sowieso wieder aktiviert, oder?
ich möchte das ganze erst mal gerne zum laufen bringen, dann wird kommentiert.
Kommentare sind nicht nur für andere, sondern auch für dich. Zur Entwicklung und dann auch für später. Schreib die Kommentare gleich, das erleichtert vieles. Später schreiben ist so wie die Silvester-Vorsätze :-)
Lokus Pokus schrieb: > ich möchte das ganze erst mal gerne zum laufen bringen, dann wird > kommentiert. 1. machst du es den Helfern damit nicht einfach 2. verlierst du damit (wie man sieht) selbst den Überblick
1 | const uint8_t led_wert[32] PROGMEM = |
2 | {
|
3 | 0, 1, 2, 2, 2, 3, 3, 4, 5, 6, 7, 8, 10, 11, 13, 16, 19, 23, |
4 | 27, 32, 38, 45, 54, 64, 76, 91, 108, 128, 152, 181, 215, 255 |
5 | };
|
Im ISR:
1 | OCR1A = pgm_read_word (& led_wert[led_helligkeit]); |
OCR1A kann zu 0 werden und damit wird der Interrupt andauernd hintereinander aufgerufen ohne dass Zeit für andere Sachen bleibt. Oder du hast irgendeine andere Endlosschleife in deinen anderen Funktionen.
An dem lags mal nicht. Hab die 0 auf 1 geändert. Das würde dann aber bestimmt einen anderen Effekt verursachen. Bzw. Die Tasten oder Encoderabfrage nicht ordentlich funktionieren. Wenn ich den Encoder permanent bewege läuft der Timer ja.
Hab den Fehler gefunden. Das hier hat den Zähler gestoppt:
1 | led_dimmer (ledwert); |
Lokus Pokus schrieb: > Das ganze funktioniert jedoch nur soweit, dass die LED nur dann > pulsiert, wenn der Drehencoder bewegt wird (gedreht wird). Läuft der > Timer der den Encoder auf 0 zurücksetzt ab, hört auch die LED zum > pulsieren auf. Logisch. Ist der Timer abgelaufen, wird timeCount zu 0 In deiner Hauptschleife steht aber
1 | if (timeCount == 0) |
2 | {
|
3 | nSelect = 0; |
4 | encoder = 0; // Nach Zeit zurück zum Ausgangswert |
5 | led_dimmer (ledwert); |
6 | }
|
wenn timeCount gleich 0 ist, wird led_dimmer aufgerufen. led_dimmer seinerseits weist aber der PWM einen konstanten Wert zu. Damit kann sich dein Timer 0 abmühen so viel er will, laufend neue PWM Werte vorzugeben. Beim nächsten Durchlauf durch die Hauptschleife macht der Aufruf von led_dimmer alles wieder zunichte. Edit: zu spät.
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.