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
In welchem Kontext wird das ausgeführt, wie sind deine Timereinstellungen? Und bitte die CODE TAGS verwenden!
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;
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.
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
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.
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!?
hab den fehler grad selbst gefunden vielen Dank =) sonst hätt ich alles nicht nochmal so genau durchgesehen =)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.