Tach zusammen, mein Name ist Jens, ich bin der Neue und will mal direkt mit einer Frage nerven: Ich versuche gerade, mittels Timer1 zwei unterschiedliche PWM-Signale auf PB1 und PB2 zu erzeugen. Bei beiden soll die PWM-Frequenz etwa 20kHz betragen. Gedacht war nun folgendes: Ich lade ICR1 mit dem Wert 397 (der MC ist mit 8MHz getaktet, 8000000/397 ~ 20151), packe in OCR1A und OCR1B geeignete Werte und bereite Timer1 vor. Dazu werden die TCCR1x-Register so bestückt: TCCR1A=_BV(COM1A1) | _BV(COM1B1) | _BV(WGM11); TCCR1B=_BV(WGM12) | _BV(WGM13) | _BV(CS10); Wenn nun TCNT1 den in ICR1 gespeicherten Wert erreicht, soll ein Interrupt ausgelöst werden; ich setze also TIMSK=_BV(TOIE1); In der ISR werden dann die OCR1x-Werte geeignet verändert. So weit, so gut. Das Problem ist nur, daß die Interrupt-Routine nicht wie gewünscht alle 397 Takte angesprungen wird, sondern alle 1022 (=0x3fe) Takte. Irgendetwas stimmt also mit meinen Einstellungen nicht, ich komme aber ums Verrecken nicht drauf, woran es hapert. Hat jemand von Euch eventuell eine Idee? Tausend Dank im voraus, Jens
Holla, habe ich glatt vergessen: Das ganze soll auf einem ATmega8 laufen! Grüße Jens
Ist es nicht so, daß der Timer weiter läuft, bis er die eingestellte maximale Bit-auflösung erreicht hat (also 8 9 10 Bit), es sei denn, Du definierst das ICR-Register als Top-Wert und aktivierst das WGM12 und WGM13 Bit im Fast-PWM Mode (Datenbladdel, mal in die Tabelle gucken - hab´s nicht ganz im Kopf). Oder Du löschst den Timer manuell in der ISR.
Was willst Du denn nun ? PWM oder Timerinterrupt ? PWM oder Frequenzerzeugung ? Die PWM erfolgt jedenfalls vollständig in Hardware und ganz ohne Interrupts. Die Frequenz, mit der die PWM erfolgt ist dabei abhängig von der gewählten Bitbreite und dem Vorteiler und ist immer gleich. Der PWM-Wert ändert nämlich nur das Tastverhältnis. Peter
Hi, @ TravelRec: Das ICR-Register sollte den TOP-Wert (hier halt 397) erhalten. Wenn ich den Fast-PWM-Mode 14 wähle (WGM11=WGM12=WGM13=1, WGM10=0), dann sollte der Zähler, laut Datenblatt, eigentlich bis zum Wert von ICR1 hochzählen und im nächsten Takt auf 0 zurückgesetzt werden. Das tut er aber irgendwie nicht. @ Peter: Letzten Endes möchte ich zwei phasenverschobene Sinuskurven via PWM erzeugen. Die notwendigen Tastwerte habe ich in einem Array abgelegt. Ich hatte es nun aber so verstanden, daß ich die PWM-Grundfrequenz unter anderem über das ICR1-Register einstellen kann, bei dem gewählten Wert von 397 sollte also eine Grundfrequenz von 8000000/397 Hz benutzt werden. Oder habe ich da etwas grundlegend falsch verstanden? Grüße Jens
Hallo zusammen, ich bin's wohl noch einmal. Das Problem hat sich gelöst :) Nun funktioniert's so, wie es soll. Der Übeltäter war nicht mein Programm, sondern AVR Studio. Durch Zufall bin ich im AVRFreaks-Forum über einen Beitrag gestolpert, in dem das gleiche Fehlverhalten beschrieben wurde. Der Threadstarter hat dort auch eine Mitteilung von Atmel gepostet, in der die Jungs eingeräumt haben, daß der Taktzyklenzähler tatsächlich beim Waveform Generation Mode 14 versagt. Nachdem ich das Programm dann in Hardware gebannt und ein paar LEDs angeschlossen habe, zeigt sich, daß es genau das tut,was geplant war. Eine angenehme Nacht, Jens
Aach sooo, na ich brenne immer gleich und simuliere nicht vorher. LEDs oder gar ein Display helfen beim Debugging. Wenn´s dann geht, ist gut, ansonsten suche ich den Fehler in meinem Programm. Bislang hat der Prozessor immer Recht gehabt und so gehe ich eventuellen Bugs im Simulator lieber gleich aus dem Weg. Nix gegen AVR-Studio ansonsten.
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.