Hallo, versuche ein PWM-Signal zu erzeugen. Kann mir jemand sagen wo der Fehler in dem Code steckt. Der Compiler sagt dass alles in Ordnung ist, doch am Osz... ist nix zu sehen. Atmega48, 8MHz externer Quarz! Gruß
Danke, eigentlich logisch! Jetzt klappts. Ich verwende ja jetzt das OCR0A Register um die Pulsbreite des PWM Signals ändern. Könnte ich nun das OCR0B in einem anderen Timer nutzen, es da mit dem TCNT0 vergleichen um mir dann z.B. eine Pause des anderen Timers generieren? Oder denke ich da jetzt völlig unlogisch.....?
Wie der Name schon sagt, gehören die Register OCR0A und OCR0B zum Timer 0 (deshalb die '0' vor dem A bzw. dem B). Das ist intern fest verdrahtet und lässt sich nicht ändern. Du kannst damit mit dem selben Timer ein zweites PWM-Signal gleicher Frequenz erzeugen.
Ändern will ich das ja gar nicht. Will den Interrupt des anderen Timers für eine bestimmte Zeit anhalten, sobald er z.B. 10mal durchlaufen wurde.
Beide OC-Register hängen an exakt dem gleichen Timer. Formuliere doch mal deine Frage um. So, wie ich sie verstehe, willst du mit OCR0A eine PWM ausgeben. In dessen Interrupt-Routine zählst du dann eine Variable herunter (einfacher und universeller ist das...). Sobald diese Variable = 0 ist, schaltest du OCR0A aus (und startest den OCR0B-Interrtupt). OCR0B wird nur als Interrupt ausgeführt, und zählt seinerseits eine Variable herunter, die bei 0 dann wieder OCR0A freigibt.... Richtig so?
Nein, nicht wirklich. Hab ein Signal mit Timer2 erzeugt. Da dieses Signal im µs Bereich liegt ist die maximale Impulspause dort 255µs, da ich den Timer im CTC Modus (Teiler8) mit dem Compare Interrupt betreibe. Nun möchte in dort aber gerne eine Impulspause von ca. 60ms erzeugen, was aber mit diesem ja nicht mehr möglich ist. Nun dachte ich, das ich mit dem Timer2 wo auch das PWM-Signal erzeugt wird, durch vergleichen einer Variable irgendwie auf diese 60ms komme und den Interrupt von Timer2 dann einfach ein/aus schalte. Bestimmt voll kompliziert wie ich denke und wahrscheinlich geht es auch viel einfacher! Aber irgendwie komm ich nicht drauf, wie ich diese 60ms Pause dort erzeugen kann.
Ok, nun wissen wir schon, wie lang die Pause sein soll. Jetzt müßten wir nur noch wissen, wie lang der Impuls sein soll und was das alles mit Timer0 zu tun hat, um den es ja im ursprünglichen Code geht. Im letzten Posting wird ja auf einmal alles mit Timer2 gemacht. Also, mit welchen Timern willst du wie was für Impulse und was für Pausen erzeugen?
Also mit Timer0 wird bis jetzt nur das PWM Signal erzeugt. Mit Timer2 wird ein Signal erzeugt, das einen Impuls von 20µs Highpegel hat, danach 140µs Lowpegel und dann 10µs Highpegel. Nach diesen 3 Impulsen soll nun eine Pause von 60ms erfolgen, bevor diese 3 Impulse sich wiederholen. Nur krieg ich diese lange Pause mit diesem Timer nicht hin, da die maximale Impulsdauer bei meinen Einstellungen maximal 255µs beträgt..... Nun will ich irgendwie diese Pause erzeugen und habe mir Gedacht, dass dieses vielleicht mit einem anderen Timer zu realisieren ist. In diesem Fall mit Timer0 da dort nur das PWM Signal erzeugt wird.... Nur irgendwie weiß ich nicht, wie ich das anstellen soll....
> Nur krieg ich diese lange Pause mit diesem Timer > nicht hin, da die maximale Impulsdauer bei meinen Einstellungen > maximal 255µs beträgt..... Und wednn diese maximale Impulsdauer 253 mal abgelaufen ist, dann sind das (+/- ein paar Zerquetschte) in etwa 60 ms. Also: maximale Impulsdauer einstellen, jedes mal im Interrupt eine Variable hochzählen, bei 253 -> deine 60 ms sind vergangen.
Also nachdem die drei Impulse erzeugt wurden, setze ich OCR2A auf 255(maximale Pulsdauer), schalte den Ausgang des Ports auf 0 und lasse den Interrupt ca. 253 durchlaufen. Danch geht wieder alles von vorne los. Richtig? Nur irgendwie muss ich dann schauen dass der Port beim nächsten Interrupt nicht wieder gesetzt wird, sondern erst nach dem 253'ten Durchlauf......
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.