Forum: Mikrocontroller und Digitale Elektronik Timer PWM nach manuellem Setzen des Ausgangs


von Thor2605 (Gast)


Lesenswert?

Hallo,

Ich betreibe an meinem Atmega2560 unter anderem am Timer3 und Timer4 
zwei LEDs mit PWM-Dimmung.

Es funktioniert auch alles so weit, nur wollte ich jetzt nach dem 
Dimmvorgang den Ausgang manuell auf HIGH oder LOW schalten und den Timer 
stoppen.
Ich habe jetzt aber das Problem, dass trotz erneut gestartetem Timer der 
Ausgang auf dem zuvor manuell zugewiesenen Wert stehen bleibt.

Wie kann ich den Timer wieder richtig starten? Ist das überhaupt 
möglich?

von Thomas H. (Firma: CIA) (apostel13)


Lesenswert?

man muss den "Timer" nicht stoppen um manuell zu schalten. Man 
"disconnectet" den Pin von der PWM Funktionalität und setzt ihn 
"manuell".

von Peter D. (peda)


Lesenswert?

Ich liebe Fragen zu Code, ohne den Code zu zeigen.

Du hast offensichtlich nicht den Code geschrieben, der dem entspricht, 
was Du willst.

In der Regel setzt man einfach die PWM auf einen Endwert, ohne den Timer 
abzuschalten.

von Thomas H. (Firma: CIA) (apostel13)


Angehängte Dateien:

Lesenswert?

COM0A1 und COM0A0 auf NULL dann ist dein OCXX entkoppelt

für PWM dann entsprechend wieder setzen.

von Falk B. (falk)


Lesenswert?

Man kann auch die Ausgänge umschalten, OBWOHL der Pin noch mit dem 
PWM-Generator verbunden ist! Dazu muss man nur COMA1 COMA0 passend 
setzten und einen Schreibzugriff auf FORA machen.

von Thor2605 (Gast)


Lesenswert?

Erst mal vielen Dank für die vielen Antworten.

Übergang von PWM in manuell klappt ohne Probleme, ich komme leider nur 
nicht mehr zurück und weiß nicht woran es liegt...

Hier noch der Code vom Konstruktor (nur einmal im setup, ist ein 
Singleton) und meiner Schleife (wird jede Sekunde einmal durchlaufen)
1
TPWM::TPWM()
2
{
3
  // 16 Bit Fast PWM
4
  TCCR3A = 0x82;
5
  TCCR4A = 0x82;
6
  // stop timer
7
  TCCR3B = 0;
8
  TCCR4B = 0;
9
  // TOP for PWM, full 16 Bit
10
  ICR3 = 0xFFFF;
11
  ICR4 = 0xFFFF;
12
13
  SetProp(P1, 5);
14
  SetProp(P2, 6);
15
16
  pinMode(5, OUTPUT); //Timer 3
17
  PWM1(0);
18
  pinMode(6, OUTPUT); //Timer 4
19
  PWM2(0);
20
}
21
22
void TPWM::PruefeZeiten()
23
{
24
  if (!TimeSetted()) return;
25
  unsigned long t = now() % 86400;
26
27
  for (int i = 1; i <= 2; ++i)
28
  {
29
    TPWMProp& Prop = GetPWMProp(i);
30
    long OnTimeDiff = t - Prop.OnTime;
31
    long OffTimeDiff = t - Prop.OffTime;
32
    long SumDelay = (Prop.StopIndex - Prop.StartIndex - 1) * Prop.Delay;
33
    long i4Position = 0;
34
35
    if ((t >= Prop.OnTime) && (t < Prop.OffTime))
36
    {
37
      i4Position = Prop.StartIndex + (OnTimeDiff / Prop.Delay);
38
      if (i4Position > Prop.StopIndex) i4Position = Prop.StopIndex;
39
    }
40
    else
41
    {
42
      i4Position = Prop.StopIndex - (OffTimeDiff / Prop.Delay);
43
      if (i4Position < Prop.StartIndex) i4Position = Prop.StartIndex;
44
    }
45
46
    if (Prop.TimerStarted && ((i4Position >= 255) || (i4Position <= 0)))
47
    {
48
      if (Prop.Pin == 5) TCCR3B = 0;
49
      else TCCR4B = 0;
50
      Prop.TimerStarted = false;
51
    }
52
53
    if (i4Position > 255) i4Position = 255;
54
    if (i4Position < 0) i4Position = 0;
55
56
    if (i4Position >= 255)
57
    {
58
      if (!Prop.Out)
59
      {
60
        digitalWrite(Prop.Pin, HIGH);
61
        Prop.Out = true;
62
      }
63
    }
64
    else if (i4Position <= 0)
65
    {
66
      if (Prop.Out)
67
      {
68
        digitalWrite(Prop.Pin, LOW);
69
        Prop.Out = false;
70
      }
71
    }
72
    else
73
    {
74
      if (Prop.Position != i4Position)
75
      {
76
        if (!Prop.TimerStarted)
77
        {
78
          if (Prop.Pin == 5)
79
          {
80
            TCCR3B = (1 << WGM12) | (1 << WGM13) | 1;
81
          }
82
          else
83
          {
84
            TCCR4B = (1 << WGM12) | (1 << WGM13) | 1;
85
          }
86
          Prop.TimerStarted = true;
87
        }
88
        if (Prop.Pin == 5) PWM1(i4Position);
89
        else PWM2(i4Position);
90
        Prop.Position = i4Position;
91
      }
92
    }
93
  }
94
}

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.