Forum: Mikrocontroller und Digitale Elektronik PWM Fehler blinkt


von Hans (Gast)


Lesenswert?

Hallo,
ich versuche mich gerade an der PWM programmierung, zu der Funktion ich 
lege an einen Pin ein Signal an und sobald dieses Signal da ist, soll 
die entsprechende RGB-LED hoch gedimmt werden sobald das Signal wegfällt 
sollen die LEDs heruntergedimmt werden.

if ( (u8_rot == 1) || (u8_gelb==1) )
{
  if(OCR1A < 256)
 {
  OCR1A = OCR1A+5;
  _delay_ms(70);
  }
}

else
{
  if (OCR1A > 0)
  {
  OCR1A = OCR1A-5;
  _delay_ms(50);
  }
}

Leider blinken jedoch meine LEDs sobald ich das Signal anlege und dimmen 
nicht hoch und bleiben dann eingeschaltet.
Wechsel ich das signal, so dimmen sie herunter und die richtige andere 
Farbe z.b. grün erscheint jedoch wenn sie ganz grün sind gehen die roten 
LEDs wieder an und es dimmt wieder herunter dieser Vorgang geschieht 2 
mal und dann bleiben die LEDs grün.

Die Anweisung für die grünen LEDs ist identisch mit der der roten LEDs 
nur, dass ich hier mit dem OCR1B Register arbeite.

Für Hilfe wäre ich sehr dankbar

von LordZiu (Gast)


Lesenswert?

In welchem Kontext wird das ausgeführt, wie sind deine 
Timereinstellungen?

Und bitte die CODE TAGS verwenden!

von Hans (Gast)


Lesenswert?

TCCR1A = _BV(WGM11);       //  PWM, phase correct
TCCR1B =_BV(CS10) | _BV(CS11);   // clock select clk/64
ICR1 = 0xFF;      // Endwert Counter

/* OC1A als PWM-Port setzen */
    TCCR1A |= _BV(COM1A1);
    OCR1A = 0;

/* OC1B als PWM-Port setzen */
    TCCR1A |= _BV(COM1B1);
    OCR1B = 0;

von LordZiu (Gast)


Lesenswert?

Und weiter? Wie ist die Taktung? Ohne die, kann man nur erraten, wie 
schnell die PWM ist.

Außerdem hatte ich nach dem Kontext des zuerst geposteten Codes 
gefragt-> WO und WANN wird das ausgeführt? In einer ISR oder in der 
main?

Und, schau doch mal bitte, wenn du Code postest unter "Formatierung" und 
nimm Code-Tags.

von Karl H. (kbuchegg)


Lesenswert?

Mach dir doch nicht soviel Arbeit damit, dass du aussuchst welchen Code 
du zeigen willst und welchen nicht.
Übertrage mittels Copy&Paste einfach alles hier ins Forum

a) vermindert das die lästigen Nachfragen nach Details
b) sehen die Helfer hier alles und kriegen den Gesamtüberblick
c) sitzt der Fehler des öfteren ganz woanders als du vermutest
d) hast du weniger Arbeit:
   Im Editor Strg+A (für alles markieren), dann Strg+C (für kopieren)
   ins Forum wechseln, Strg+V (füer einfügen)
   Noch
1
[C]
 davor und
1
[/C]
 dahinter und fertig.

Lauter gute Gründe, warum sich das ausschnittweise posten von Code bis 
zu einer gewissen Codegröße einfach nicht lohnt

von Vlad T. (vlad_tepesch)


Lesenswert?

kann es sein, dass der selektierte Modus gar nicht das ICR1 als Counter 
Endwert akzeptiert?
ist das überahupt ein 16bit Counter?

wenn man den µC wüsste wär das hilfreich.

von LordZiu (Gast)


Lesenswert?

Vlad Tepesch schrieb:
> ist das überahupt ein 16bit Counter?

Hab ich auch schon dran gedacht, aber meist ist Timer 1 doch ein 16bit 
Timer, oder!?

von Hans (Gast)


Lesenswert?

hab den fehler grad selbst gefunden vielen Dank =) sonst hätt ich alles 
nicht nochmal so genau durchgesehen =)

von LordZiu (Gast)


Lesenswert?

Willst du die Lösung vielleicht KNAPP erklären? Dann können andere 
Leute, die ein ähnliches Problem haben und dieses Forum durchsuchen auch 
davon profitieren.

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.