PWM mit ATMEGA128 funktioniert nicht

Gast #210651
Ich will eine PWM-Steuerung mit dem ATMEGA128 aufbauen. Aber das
funktioniert schon im Debugger nicht. Programmieren will ich das mit
WinAVR. Hier der Codeschnipsel:

cli();
OCR3A = 20;
OCR3B = 20;
OCR3C = 20;
TCNT3 = 0;
TCCR3A |= 1<<COM3A1 | 1<<COM3A0 | 1<<COM3B1 | 1<<COM3B0 | 1<<COM3C1 |
1<<COM3C0 | 1<<WGM30;
TCCR3B |= 1<<WGM32 | 1<<CS31;
sei();

Folgende Konfiguration:

Timer 3 soll mit einem Prescaler von 8 (im Debugger ist es relativ egal
welche Frequenz) alle 3 PWM-Ausgänge mit FastPWM 8-Bit ansteuern.  Laut
Konfiguration soll der Ausgang bei "compare match" High sein und bei
"TOP" auf Low sein. Der zweite Teil funktioniert nicht. Also der
Ausgang wird zwar High, wenn TCNT3 20 erreicht. Aber wird nie wieder
Low. Wo kann der Fehler liegen?
Gast #210652
Also das PWM soll natürlich so laufen, dass der Controller damit nachher
nicht mehr belastet wird und das sollte doch gehen. Ich muss doch nicht
immer einen IRQ auslösen lassen, wenn TCNT3 0xFF erreicht. Denn, wenn
ich es im Datenblatt richtig verstanden habe, sollte er bei meiner
Konfiguration:

TCNT3 = 20 (0x14) -> Ausgang OC3A = HIGH, OC3B = HIGH, OC3C = HIGH

und bei:

TCNT3 = 255 (0xFF) -> Ausgang OC3A = LOW, OC3B = LOW, OC3C = LOW

sein. Oder ist das ein Denkfehler?
Gast #210653
Hallo Ronny,

zählt denn TCNT3 von 0 bis 255 und dann wieder von 0 bis 255 usw.?
Die TCCR3A und TCCR3B sind meiner Meinung nach richtig gesetzt. Und in
dieser Konfiguration hat es bei mir schon funktioniert. Aber ich habe
es direkt im Meag128 ausprobiert.

Gruß
Gerd
Gast #210654
Hallo Gerd,

ja genau so ist es. Der TCNT3 zählt von 0 - 255 und dann wieder von
vorn. Hast Du vielleicht den Beispielcode mal da? Ich habe das mit
AVRStudio 4.11 debugged und kompiliert mit WinAVR. Es sollte eigentlich
schon im Debugger laufen.

In der Hardware wollte ich später testen. Dazu muss ich mit dem Oszi
ran und müsste da noch einiges an Programm ändern, weil die Frequenz
zum einen viel zu hoch ist für mein Oszi und zum anderen noch andere
Steine im Weg liegen.
Gast #210655
Hallo Ronny,

habe momentan keinen Beispielcode zur Hand. Wie sehen denn Deine
Ausgänge bei TCNT3 = 0, 19, 20, 21 und 255 aus?

Gruß
Gerd
Gast #210656
Das geht nicht so genau, da ich ja nicht Takt für Takt ausprobieren
kann. Es sei denn ich würde den Prescaler ändern:

0 -> Low
21 -> High
255 -> High

Danach nie wieder Low.....
Gast #210657
Probier es doch mal im Mega128, vielleicht stimmt etwas mit dem Debugger
nicht. Du brauchst auch kein schnelles Oszilloskop. Ein einfaches
Multimeter an den Ausgang dranhängen genügt. Falls der Ausgang High
bleibt, dann mißt Du 5 Volt, sonst den gemittelten PWM-Wert.

Gruß
Gerd
Gast #210659
Also der Debugger scheint wieder einmal zu spinnen. Die Schaltung an
sich funktioniert. Ging nachher sogar mit Oszilloskop zu messen.

Danke für die Hilfe!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.