Forum: Mikrocontroller und Digitale Elektronik Problem mit dem OCR1B beim ATtiny2313


von H. G. (ledi)


Lesenswert?

Hallo,

ich programmiere gerade eine state machine um eine LED zu dimmen bzw. 
Ein / Aus schalten.

Wenn ich im off state hoch dimme, blitzt die LED am OC1B Ausgang kurz 
auf.

Sobalt die Zeile
1
TCCR1A = 0xA2;            // OC1A und OC1B auf ON

im unteren Codeteil ausgeführt wurde geht mein OC1B Ausgang auf High!

Hat jemand einen Tip?

1
if (button_down)
2
  {
3
    if (button_pressed_timer < LONGPRESS_TIMEOUT)
4
      button_pressed_timer++;
5
    else
6
    {
7
      if (state != running)
8
      {
9
        if (state == off)
10
        {
11
          z=1;
12
          p_actual_16 = &black;        // Dim value = 0x0000
13
          dimm_value = 0;
14
          OCR1B = dimm_value;
15
          OCR1A = dimm_value;
16
          TCCR1A = 0xA2;            // OC1A und OC1B auf ON
17
          TCCR1B |= (1 << CS10);            // start timer
18
19
          direction = up;
20
        }
21
        else if (dimm_value == 0xFFFF)
22
          direction = down;
23
        else if (dimm_value <= 0x0100)
24
          direction = up;
25
      }
26
      state = running;
27
    }
28
  }

von al_guesto (Gast)


Lesenswert?

Welche PWM-Form verwendest du bzw. wie hast du Timer initialisiert?

von Spess53 (Gast)


Lesenswert?

Hi

>TCCR1A = 0xA2;            // OC1A und OC1B auf ON

->PWM, Phase Correct, 9-bit

>        else if (dimm_value == 0xFFFF)

Passt irgendwie nicht zusammen.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Was genau machst du eigentlich, wenn du den Timer in den off state 
schickst? Schaltest du dann den Timer-Modus auf Normal, drehst du den 
Vorteiler ab oder was machst du sonst noch um die PWM komplett zu 
stoppen?

von odr (Gast)


Lesenswert?

H. G. schrieb:
>           dimm_value = 0;
>           OCR1B = dimm_value;
>           OCR1A = dimm_value;
>           TCCR1A = 0xA2;            // OC1A und OC1B auf ON
>           TCCR1B |= (1 << CS10);            // start timer

Im Phase Correct bedeuten deine Bits in A2 für OC1A und OC1B clear on 
match when upcounting und set on downcounting, ergo bei der dimm_value 
von 0 sind sie set, also high?

von Karl H. (kbuchegg)


Lesenswert?

Spess53 schrieb:
> Hi
>
>>TCCR1A = 0xA2;            // OC1A und OC1B auf ON
>
> ->PWM, Phase Correct, 9-bit

Kann mir mal wer in einfachen Worten erklären, warum die Leute immer so 
erpicht darauf sind, die Phase Correct PWM einzusetzen? Speziell bei LED 
Ansteuerungen?

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was genau machst du eigentlich, wenn du den Timer in den off state
> schickst? Schaltest du dann den Timer-Modus auf Normal, drehst du den
> Vorteiler ab oder was machst du sonst noch um die PWM komplett zu
> stoppen?


Worauf ich hinaus will:
Gibt es eine Möglichkeit, dass der TCNT1, also der Timer-Zählwert sich 
ausserhalb des für die PWM zulässigen Zählbereiches befindet?
Denn wenn er das tut, dann muss der Zähler erst mal bis zum Overflow 
weiterzählen, ehe dann der reguläre PWM Betrieb wieder einsetzt. 
Leuchtet in dieser Zeit deine LED, dann siehst du das natürlich.
Es kann daher nicht wirklich schaden, wenn du bei der Freigabe der PWM 
das TCNT1 Register sicherheitshalber erst mal auf 0 setzt und so für 
geordnete Zähleverhältnisse sorgst.

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.