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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Thor2605 (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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:

Bewertung
0 lesenswert
nicht lesenswert
COM0A1 und COM0A0 auf NULL dann ist dein OCXX entkoppelt

für PWM dann entsprechend wieder setzen.

von Falk B. (falk)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)
TPWM::TPWM()
{
  // 16 Bit Fast PWM
  TCCR3A = 0x82;
  TCCR4A = 0x82;
  // stop timer
  TCCR3B = 0;
  TCCR4B = 0;
  // TOP for PWM, full 16 Bit
  ICR3 = 0xFFFF;
  ICR4 = 0xFFFF;

  SetProp(P1, 5);
  SetProp(P2, 6);

  pinMode(5, OUTPUT); //Timer 3
  PWM1(0);
  pinMode(6, OUTPUT); //Timer 4
  PWM2(0);
}

void TPWM::PruefeZeiten()
{
  if (!TimeSetted()) return;
  unsigned long t = now() % 86400;

  for (int i = 1; i <= 2; ++i)
  {
    TPWMProp& Prop = GetPWMProp(i);
    long OnTimeDiff = t - Prop.OnTime;
    long OffTimeDiff = t - Prop.OffTime;
    long SumDelay = (Prop.StopIndex - Prop.StartIndex - 1) * Prop.Delay;
    long i4Position = 0;

    if ((t >= Prop.OnTime) && (t < Prop.OffTime))
    {
      i4Position = Prop.StartIndex + (OnTimeDiff / Prop.Delay);
      if (i4Position > Prop.StopIndex) i4Position = Prop.StopIndex;
    }
    else
    {
      i4Position = Prop.StopIndex - (OffTimeDiff / Prop.Delay);
      if (i4Position < Prop.StartIndex) i4Position = Prop.StartIndex;
    }

    if (Prop.TimerStarted && ((i4Position >= 255) || (i4Position <= 0)))
    {
      if (Prop.Pin == 5) TCCR3B = 0;
      else TCCR4B = 0;
      Prop.TimerStarted = false;
    }

    if (i4Position > 255) i4Position = 255;
    if (i4Position < 0) i4Position = 0;

    if (i4Position >= 255)
    {
      if (!Prop.Out)
      {
        digitalWrite(Prop.Pin, HIGH);
        Prop.Out = true;
      }
    }
    else if (i4Position <= 0)
    {
      if (Prop.Out)
      {
        digitalWrite(Prop.Pin, LOW);
        Prop.Out = false;
      }
    }
    else
    {
      if (Prop.Position != i4Position)
      {
        if (!Prop.TimerStarted)
        {
          if (Prop.Pin == 5)
          {
            TCCR3B = (1 << WGM12) | (1 << WGM13) | 1;
          }
          else
          {
            TCCR4B = (1 << WGM12) | (1 << WGM13) | 1;
          }
          Prop.TimerStarted = true;
        }
        if (Prop.Pin == 5) PWM1(i4Position);
        else PWM2(i4Position);
        Prop.Position = i4Position;
      }
    }
  }
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.