Hallo, ich möchte mit einem Tiny13 sechs LEDs via PWM dimmen. Soweit ich das Datenblatt verstanden habe, hat er zwei Hardware PWMs, die über die Compare Register gesteuert werden ? Wie bekomme ich nun auf die anderen Pins eine steuerbare PWM ? Assembler kann ich leider nicht und WinAVR unterstützt ja den Tiny13, daher möchte ich in C programmieren ;) Wie mache ich sowas ? Meine Idee, ich nehme einen Timer und setze in dessen Überlaufinterrupt je nach Zählerstand der einzelnen Pins selbige auf Low oder High. Ist das der richtige Ansatz ? Mit der Suche habe ich hier leider nix passendes gefunden :-( Danke für jede Hilfe ;)
NochnAnfänger wrote: > > Meine Idee, ich nehme einen Timer und setze in dessen Überlaufinterrupt > je nach Zählerstand der einzelnen Pins selbige auf Low oder High. > Ist das der richtige Ansatz ? > Ja, das ist der richtige Ansatz. Für jeden Pin gibt es einen Grenzwert. Im Überlaufinterrupt zählst du einen globalen Zähler hoch. Ist der globale Zählerstand kleiner diesem Grenzwert, dann wird der Pin eingeschaltet. Ist er größer wird der Pin ausgeschaltet. Das prüfst du für jeden Pin einzeln durch. In Pseudocode Überlaufinterrupt: globaler_Z = globaler_Z + 1 if( globaler_Z < PWM_1 ) schalte Pin 1 ein else schalte Pin 1 aus if( globaler_Z < PWM_2 ) schalte Pin 2 ein else schalte Pin 2 aus if( globaler_Z < PWM_3 ) schalte Pin 3 ein else schalte Pin 3 aus if( globaler_Z < PWM_4 ) schalte Pin 4 ein else schalte Pin 4 aus ... Das ergibt dann eine PWM mit 256 Stufen. Dies deshalb, da der globaler_Z sinnvollerweise in einem uint8_t abgelegt wird. Der hat 8 Bit und daher zählt dieser Zähler immer von 0 bis 255, 0 bis 255, etc. Für die PWM_x Variablen reichen dann ebenfalls uint8_t. Bei 6 PWM Stufen kann man die einzelnen Stufen wie oben noch ausprogrammieren. Bei mehr Stufen, würde man das ganze natürlich in eine Schleife packen und die PWM Werte sinnvollerweise in ein Array legen. 256 braucht man aber oft nicht, und ausserdem kann es dann noch ein Problem mit dem Timing geben, da ja die PWM Frequenz damit effektiv nur noch ein 256-tel der Timer-Zählfrequenz ist. Dann kann man zb. die PWM auf nur 64 Stufen begrenzen: Überlaufinterrupt: globaler_Z = globaler_Z + 1 if( globaler_Z > 63 ) globaler_Z = 0 if( globaler_Z < PWM_1 ) ... Eine andere Möglichkeit die PWM Frequenz zu erhöhen ist es, sich nicht an den Overflow Interrupt zu klemmen, sonden zb. an den CTC Interrupt (keine Ahnung ob der Tiny 13 sowas hat).
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.