hallo zusammen, ich wollt ein wenig mit PWM rumspielen! nutze dafür den 8bit timer0 vom at88! nur leider lauft der code nicht! ich habe testweise eine led angeschlossen! die led bleibt dunkel! #include <avr/io.h> void main(void) { DDRD |= (1<<DDD6 ) ; // Timer/Counter Control Register A TCCR0A |= (1<<COM0A1); TCCR0A |= (1<<WGM00); TCCR0B |= (1<<WGM02); TCCR0B |= (1<<CS02 ) //clkI/O/256 (From prescaler) TCNT0 = 0; OCR0A = 0; while(1) { _delay_ms(500); OCR0A=OCR0A+10; } } kann mir jemand weiter helfen?
Du variierst ja auch nur die PWM-Frequenz und nicht den Duty-Cycle. Also bitte nochmal ins Datenblatt schauen, welchen PWM-Mode du da ausgewählt hast und wie der funktioniert.
TCCR1A = (1<<COM1A1) | (1<<WGM11); TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10); // den Endwert (TOP) für den Zähler setzen // der Zähler zählt bis zu diesem Wert ICR1 = 0x28C0; // der Compare Wert // Wenn der Zähler diesen Wert erreicht, wird mit // obiger Konfiguration der OC1A Ausgang abgeschaltet // Sobald der Zähler wieder bei 0 startet, wird der // Ausgang wieder auf 1 gesetzt // // Durch Verändern dieses Wertes, werden die unterschiedlichen // PWM Werte eingestellt. // OCR1A = XXX; // 0x0400; So hab ich das mal gemacht. Ist zwar für Timer 1. Aber umbauen für Timer 0 sollte ja möglich sein. Beispiel findest Du aber auch im Tutorial. Gruß SD
danke für die antwort :) ich habe jetzt "TCCR0B |= (1<<WGM02); " weggelassen und somit Mode:1 PWM, Phase Correct TOP: 0xFF Update of OCRx at :TOP TOV Flag Set on :BOTTOM so funitoniert es auch! Nur jetzt wird mir noch nicht ganz so klar, wozu ich überhaupt diesen mode:5 brauche! ich denke ich wühl mich nochmal durch das datenblatt! mir fehlt da noch iwas grundlegendes!
_Tom schrieb: > Nur jetzt wird mir noch nicht ganz so klar, wozu ich überhaupt diesen > mode:5 brauche Um die PWM-Frequenz feiner einstellen zu können.
Was willst du da verdeutlichen? Die Tabelle auf Seite 99 zeigt es doch ganz deutlich: Der einzige Unterschied zwischen Mode 1 und Mode 5 besteht darin, dass in Mode 1 der Timer immer bis 0xFF zählt ehe er wieder runterzählt und im Mode 5 kannst du einen anderen Wert als 0xFF über das Register OCRA vorgeben. Schreibst du also in OCRA den Wert 0xF0 hinein, dann zählt der Timer eben nicht mehr bis 0xFF sondern nur noch bis 0xF0 hoch und dann wieder runter. Schreibst du 0x40 hinein, dann zählt der Timer nur bis 0x40 und dann wieder runter etc. Je weniger hoch er zählen muss, desto schneller geht das auch. Wenn du in 1 Sekunde immer um 1 weiter zählst, dann dauert es 100 Sekunden bis du bei 100 angelangt bist, aber nur 45 Sekunden ehe du bei 45 bist. Und da f = 1/T ist, besteht ein indirekter Zusammenhang zwischen der Zeit zum Zählen und der Frequenz die dabei herauskommt, wenn man bei bestimmten (gleichen) Zählerständen etwas macht.
das hab ich soweit auch gesehen! nur ist mir noch klar,in welchen register ich den wert, wo PD6 ein bzw. ausgeschaltet werden soll, eintrage! das habe ich ja im mode 1 im register OCR0A gemacht! nur ist dieses register im mode:5 jetzt TOP !?! ich glaub ich sollte ma leben kurz den kram beiseite legen und da nacher nochmal raufgucken
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.