Ich habe endlich geschafft anhand der vielen Tutorials ein Software PWM
für mein Atmega168 zu programmieren.
Leider wird die ISR, welche für das PWM-Signal zuständig ist, durch
einen Timer in jedem Takt aufgerufen. Damit wäre die CPU voll
ausgelastet.
20.000.000 Hz 1000 PWM-Länge 60 FPS / 256 ? = 1,...
Woher stammt eigentlich die 256 bei der Berechnung der Taktzyklen pro
Timerdurchlauf? Wie kann ich die CPU-Last senken?
Also, zunächst: Die 256 kommt vermutlich daher, dass Du den
Overflow-Interrupt verwendest, der also aufgerufen wird sobald der
8-bit-Zähler bis 256 gezählt hat. Es ist mitnichten so, dass der
Overflow-Interrupt bei jedem Takt stattfindet...
Allerdings würde ich das hier ein bischen anders angehen, es ist nicht
nötig, für jeden PWM-Schritt den Interrupt auszulösen.
In http://www.mikrocontroller.net/articles/Soft-PWM findest Du
geschicktere Methoden.
Viele Grüße,
Simon
Ich versuche gerade die Funktion der PWM Funktion auf dieser Seite
http://www.mikrocontroller.net/articles/Soft-PWM nachzuvollziehen. Ich
habe mir jetzt einen kleinen Teil herausgenommen und wollte diesen auf
meinem Atmega 168 zum laufen bringen. Leider leuchtet keine der LEDs am
Ausgang.
Die LEDs sollen nach dem Bitmuser von pwm_mask nacheinander aktiviert
werden. Zwischen den einzelnen Mustern werden die Pausen aus pwm_timing
eingehalten.
Hier mein Code. "led_set" aktiviert 8 LEDs mit Hilfe eines übergebenen
Bitmusters.
1
/*** INCLUDE ******************************************************************/
Marcel Holle schrieb:> Ich versuche gerade die Funktion der PWM Funktion auf dieser Seite> http://www.mikrocontroller.net/articles/Soft-PWM nachzuvollziehen.
Schön.
Aber nächstes mal fang bitte einen neuen Thread an und hijacke nicht
einen alten.
> Hier mein Code. "led_set" aktiviert 8 LEDs mit Hilfe eines übergebenen> Bitmusters.
Und die Funktion sieht wie aus?
Das hier
TCCR1B |= (1 << CS01);
TIMSK1 |= (1 << OCIE1A);
schaltet offenbar den Timer 1 ein.
Das hier
ISR(TIMER0_COMPA_vect) {
ist die Service Routine für den Timer 0.
Was passt da nicht zusammen?
Hinweis: Ehe man kompliziertere Dinge in eine ISR packt, ist es oft
hilfreich in einer ISR einfach nur eine LED einzuschalten um zu sehen ob
sie überhaupt aufgerufen wird.
Karl heinz Buchegger schrieb:> Schön.> Aber nächstes mal fang bitte einen neuen Thread an und hijacke nicht> einen alten.
Sorry, ich dachte es passt. Weil ich oben ja auf das Tutorial verwiesen
wurden.
Karl heinz Buchegger schrieb:> Das hier>> TCCR1B |= (1 << CS01);> TIMSK1 |= (1 << OCIE1A);>>> schaltet offenbar den Timer 1 ein.>> Das hier>> ISR(TIMER0_COMPA_vect) {>> ist die Service Routine für den Timer 0.>> Was passt da nicht zusammen?
Danke :) Manchmal braucht man wirklich nur mal kurz jemanden der einen
Wachrüttelt, wenn man zu lange programmiert.
Marcel Holle schrieb:> Karl heinz Buchegger schrieb:>> Schön.>> Aber nächstes mal fang bitte einen neuen Thread an und hijacke nicht>> einen alten.>> Sorry, ich dachte es passt. Weil ich oben ja auf das Tutorial verwiesen> wurden.
Nur dann, wenn du 100% exakt genau dasselbe Problem hast, inklusive
identischem Code.
Im Zweifel lieber neu anfangen.
Bei dir ist es, dass alles was vor dir steht, für dein Problem völlig
irrelevant ist. Wenn der Verweis auf einen Artikel schon reichen würde,
dann hätten wir hier im Forum vielleicht 15 bis 20 Monsterthreads in
denen sich fast alles abspielt.
Oft merkt man nämlich nicht, dass jetzt ein anderer Fragesteller an der
Reihe ist und dann studiert man vorhergehenden Beitrag um vorhergehenden
Beitrag um dann auf Detailfragen zu antworten, die schon monatelang
keinen mehr interessieren.