Guten abend zusammen ich hab ein Problem ich möchte eine Soft-PWM machen bei dem der Takt von einem HW-Timer generiert wird. Also dachte ich nehm ich einen 8 -Bit Timer lass den zykisch bis 100 zählen und packe den in eine globale Variable mit der die einzelen Kanäle verglichen wird. Aber irgendwie bin ich zu blöd das zu relaisieren denn wenn ich statt Zeile 10 und 14 zeile 11 und 15 einkommentiere geht es
Tobi88 schrieb: > Guten abend zusammen ich hab ein Problem ich möchte eine Soft-PWM > machen > bei dem der Takt von einem HW-Timer generiert wird. > > Also dachte ich nehm ich einen 8 -Bit Timer lass den zykisch bis 100 > zählen und packe den in eine globale Variable mit der die einzelen > Kanäle verglichen wird. Aber irgendwie bin ich zu blöd das zu > relaisieren denn wenn ich statt Zeile 10 und 14 zeile 11 und 15 > einkommentiere geht es
mir is im Code ein Fehler unterlaufen (Zeile 11 TCNT2) es muss natürlich TCNT0 heissen aber trotz korrektur läuft es nicht :-(
Dein Timer läuft mit F_CPU. Der rennt dir glatt weg. Ehe das Programm sich durch die drei ifs gewurstelt hat, ist TCNT0 schon fast wieder bei 100 angelangt. Oder sogar schon drüber. Setz den Prescaler auf 256. Das sollte für Leds reichen. Nächstes mal den Code bitte als *.c posten, nicht als *.txt. mfg.
Thomas Eckmann schrieb: > Dein Timer läuft mit F_CPU. Der rennt dir glatt weg. Ehe das > Programm > sich durch die drei ifs gewurstelt hat, ist TCNT0 schon fast wieder bei > 100 angelangt. Oder sogar schon drüber. Setz den Prescaler auf 256. Das > sollte für Leds reichen. > > mfg. Danke für den Tipp......aber ich dachte das der Mikrocontroller für 3 IFs nicht so lange braucht... ok zugegeben ich habe dahinter auch noch 2 Stakemaschinen aber trotzdem das sind nur 2 switches wo nichts gemacht wird....also ist in dem fall dein Tipp den Prescaler rauf zu setzen? hätte gedacht dass es eig gut is wenn der Presclaer klein is
Hat jetzt mit deinem Problem nicht direkt was zu tun: Warum gibst du alle Interrupts mit sei() frei, wenn du gar keine benutzt?
Martin Kreiner schrieb: > Hat jetzt mit deinem Problem nicht direkt was zu tun: Warum gibst > du > alle Interrupts mit sei() frei, wenn du gar keine benutzt? stimmt danke ist ein Überbleibsel von meinem vorherigen Code
Tobi88 schrieb: > Danke für den Tipp......aber ich dachte das der Mikrocontroller für 3 > IFs nicht so lange braucht... Braucht er auch nicht. Ich würde die ganzen if-Abfragen komplett in die ISR packen, dann läuft die PWM unabhängig von deinem restlichen Programm.
Tobi88 schrieb: > Danke für den Tipp......aber ich dachte das der Mikrocontroller für 3 > IFs nicht so lange braucht... ok zugegeben ich habe dahinter auch noch 2 > Stakemaschinen aber trotzdem das sind nur 2 switches wo nichts gemacht > wird....also ist in dem fall dein Tipp den Prescaler rauf zu setzen? > hätte gedacht dass es eig gut is wenn der Presclaer klein is 100 Takte sind gar nichts. Guck dir mal im *.lss an, was der Compiler daraus gemacht hat. Jeder Befehl braucht min. 1 Takt. Aber deine Lösung taugt nichts. Schalt den Timer Interrupt ein.
1 | ISR(Timer0_OVF_vect) |
2 | {
|
3 | counter++; |
4 | if(counter == 101) Counter = 0; |
5 | }
|
6 | .
|
7 | .
|
8 | while(1) |
9 | {
|
10 | if (counter >= PWM1) PORTB |= (1 << PB1); else PORTB &= ~(1 << PB1); |
11 | //Das darf auch in der ISR stehen.
|
12 | .
|
13 | .
|
14 | }
|
Dann kannst du den Timer auf Prescaler = 1 lassen. Ich würde aber soweit runter gehen, daß es gerade nicht flackert. Wenn es Leds sind. Und der sei() bleibt dann auch stehen. mfg.
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.