Forum: Mikrocontroller und Digitale Elektronik 2 Timer parallel laufen lassen


von Lokus P. (derschatten)


Angehängte Dateien:

Lesenswert?

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?

von Spess53 (Gast)


Lesenswert?

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

von Lokus P. (derschatten)


Lesenswert?

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?

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

Du gibst nicht viel auf ausreichend kommentierten Code, oder?

von Lokus P. (derschatten)


Lesenswert?

ich möchte das ganze erst mal gerne zum laufen bringen, dann wird 
kommentiert.

von ich (Gast)


Lesenswert?

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

von Magnus M. (magnetus) Benutzerseite


Lesenswert?

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

von Lokus P. (derschatten)


Lesenswert?

Sonst niemand einen Tipp dazu?

von ein gast (Gast)


Lesenswert?

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.

von Lokus P. (derschatten)


Lesenswert?

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.

von Lokus P. (derschatten)


Lesenswert?

Hab den Fehler gefunden.
Das hier hat den Zähler gestoppt:
1
led_dimmer (ledwert);

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.