Forum: Mikrocontroller und Digitale Elektronik PWM ich raff es nicht (Phase and Frequency Correct PWM Mode)


von HansKanns(nicht) (Gast)


Lesenswert?

Hallo,
ich bin glaube ich für die PWM zu schusselig oder ich habe einen 
generellen Gedankenfehler da drin.
Hintergrund. Ich möchte eine LED mit 2Hz blinken lassen (nur für mich 
zum Verständis möchte ich eine PWM nutzen).
Ich simuliere das ganze mit AVR Studio 5. Atmega 32 ist mein µC.

Mein Ausschnitt aus dem Programm:
1
  
2
#define F_CPU 16000000UL // CPU Takt damit die delay Funktion passt
3
  
4
TCCR1A = (1<<WGM13)|(1<<COM1A1);//PWM Phase Correct an Frequency Correct,Top-Wert ist ICR1
5
                  //OC1A wird gelöscht, wenn Top erreicht ist und gesetzt wenn 0 erreicht ist.
6
                        
7
TCCR1B = (1<<CS10);        //Prescaler auf 0
8
ICR1 = 3999;
9
OCR1A = 2000;
10
  //Berechnung: 
11
  //16000 Schritte macht der µC pro Sekunde
12
  //Bei 2 Hz soll er 2 mal pro Sekunde den Ausgang an und ausschalten.
13
  //Da das ein 16 Bit Timer ist, kann ich bis maximal 65536 (0-65535) zählen.
14
  //Insgesamt soll der Zähler also 2 Mal hoch und 2 mal runterzählen je Sekunde.
15
  //Das sind also 4 Schritte. 16000/4 sind 4000. Der Zähler zählt von 0 an dann bis 3999.
16
  //Ich setze den TOP Wert(hier ICR1 also auf 3999).
17
  //Einen Prescaler benötige ich hier nicht.
18
  //f = 16000/(2*Prescaler*Topwert)
19
  
20
  //Ausgänge setzen
21
  DDRD |= (1<<PD5);    // Ausgang PD5 ist der feste Ausgang für OC1A
Laut Datenblatt habe ich eine "PWM, Phase and Frequency Correct" 
eingestellt.
Mein TOP Wert ist ICR1.
Müsste mein Zähler nicht mit 3999 hochzählen und dann wieder 
runterzählen?
In der Simulation zählt er immer noch bis 65535 und springt dann auf 0.
Dafür ist doch mein TOP Wert, oder nicht?
Mein Ausgang müsste doch gesetzt bzw. gelöscht werden wenn der Wert von 
OCR1A erreicht wird.

Ich kapiere das irgendwie nicht. Wäre nett, wenn mir mal einer das Brett 
vor dem Kopf wegnehmen könnte. Die Tutorials habe ich bereits gelesen. 
Aber da ist der "PWM, Phase and Frequency Correct" nicht mit drin.

Vielen Dank.
Gruß HansKanns(nicht)

von Karl H. (kbuchegg)


Lesenswert?

HansKanns(nicht) schrieb:

> Laut Datenblatt habe ich eine "PWM, Phase and Frequency Correct"
> eingestellt.

Welcher Prozessor?

(wie soll irgendjemand kontrollieren, was du tatsächlich eingestellt 
hast, wenn man den µC nicht weiß)

von HansKanns(nicht) (Gast)


Lesenswert?

Hatte ich eigentlich oben geschrieben (kann man ja mal übersehen):
Atmega 32 ist mein µC.

von Karl H. (kbuchegg)


Lesenswert?

> In der Simulation

Vorsicht. Die Simulatoren sind auch nicht fehlerfrei.
Hast du schon mal untersucht, ob es da ein Errata-gibt, ob die PWM Modi 
beim Simulator tatsächlich funktionieren?

von Karl H. (kbuchegg)


Lesenswert?

HansKanns(nicht) schrieb:
> Hatte ich eigentlich oben geschrieben (kann man ja mal übersehen):
> Atmega 32 ist mein µC.

Ah, ok.
entschuldigung, hab ich tatsächlich übersehen.

Ja, dann stimmt die Einstellung.


Wirfs auf den realen Prozessor und sieh nach was passiert. Letzten Endes 
ist sowieso dies die einzige Autorität.

von Karl H. (kbuchegg)


Lesenswert?

> TCCR1B = (1<<CS10);        //Prescaler auf 0

Auf 1.
Aber ist ok.

(0 wäre: der Timer macht keinen Mux, weil er keinen Takt erhält)

>  //Berechnung:
>  //16000 Schritte macht der µC pro Sekunde

16-tausend?
Eher 16-Millionen.

von Karl H. (kbuchegg)


Lesenswert?

Im übrigen

> Mein Ausschnitt aus dem Programm:

tus nicht.
Zeig alles. Das ist für dich einfacher und für uns auch.
Vielleicht hast du ja irgendwo anders einen Fehler und siehst ihn nur 
nicht.

von Spess53 (Gast)


Lesenswert?

Hi

>Mein TOP Wert ist ICR1.
>Müsste mein Zähler nicht mit 3999 hochzählen und dann wieder
>runterzählen?

>In der Simulation zählt er immer noch bis 65535 und springt dann auf 0.
>Dafür ist doch mein TOP Wert, oder nicht?

Ich weiß nicht, wie es beim 5er Studio ist, aber die Simulatoren des 4er 
Studios unterstützen keine Timermodi mit Register als Top.

MfG Spess

von HansKanns(nicht) (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> 16-tausend?
> Eher 16-Millionen.

Ja stimmt, da habe ich mich vertan. Ich kann immer noch nicht glauben, 
wie schnell die kleinen Dinger sind :-)

Schade. Scheinbar simuliert AVR Studio das wirklich nicht richtig. Wäre 
zum Verständnis mal schön gewesen. Jetzt hatte mich das total verwirrt.
Aber ich bin ja beruhigt, dass ihr das wenigstens schon mal passend 
eingestellt habe.
Vielen Dank erst einmal.

Gruß Hans

von c-hater (Gast)


Lesenswert?

Spess53 schrieb:

> Ich weiß nicht, wie es beim 5er Studio ist, aber die Simulatoren des 4er
> Studios unterstützen keine Timermodi mit Register als Top.

Das ist blanker Unsinn.

von Spess53 (Gast)


Lesenswert?

Hi

>Das ist blanker Unsinn.

Stimmt. Für deinen Kommentar.

MfG Spess

von c-hater (Gast)


Lesenswert?

Spess53 schrieb:

>>Das ist blanker Unsinn.
>
> Stimmt. Für deinen Kommentar.

Nun meinen Kommentar kann ich immerhin problemlos mit Fakten belegen...

Aktuell arbeite ich nämlich zufällig gerade an einem Projekt, was u.a. 
auch Timer 1 im Mode 14 benutzt. Sprich: Fast-PWM mit ICR als Top.

Und das läuft nicht nur auf einem realen AVR, sondern auch im Simulator 
im Studio4 und zwar genau so, wie man es erwarten würde.

Wenn du es nicht glaubst, bin ich auch gern bereit, ein klitzekleines 
Testprogramm bereitzustellen, welches sich ausschließlich mit der 
Demonstration des Timers befaßt. Nur um zu zeigen, daß jeder gut beraten 
ist, dir nix, aber auch garnix zu glauben.

Möchte bloß mal wissen, ob du absichtlich FUD verbreitest, oder ob das 
einfach nur eine Folge deiner Inkompetenz ist.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

c-hater schrieb:
> oder ob das
> einfach nur eine Folge deiner Inkompetenz ist.

Also Spess53 als unfähig bezeichnen finde ich schon anmaßend. Musst du 
aber selber wissen, ich finde seine Beiträge meist sehr hilfreich.

Zum anderen sind die Simulatoren schon bisschen Müll, ich frag mich 
ehrlich schon, warum die überhaupt mit dabei sind, wenn man erstmal ne 
ganze Liste lesen kann, was alles nicht funktioniert. Also ich hab eher 
schlechte Erfahrung mit den Simulatoren, egal, welches Studio, ob 4,5 
oder 6, wenns um etwas wesentliches geht, kann man die alle vergessen. 
Ich hätte manchmal gern etwas simuliert, einfach um zu sehen, ob man das 
Datenblatt richtig verstanden hat, und alle Register richtig beschrieben 
hat, dass die Hardware dann das macht, was ich gern möchte.

MfG Dennis

von Spess53 (Gast)


Lesenswert?

Hi

>Wenn du es nicht glaubst, bin ich auch gern bereit, ein klitzekleines
>Testprogramm bereitzustellen, welches sich ausschließlich mit der
>Demonstration des Timers befaßt. Nur um zu zeigen, daß jeder gut beraten
>ist, dir nix, aber auch garnix zu glauben.

Kannst du gern. Da du dich c-Heater nennst aber bitte in Assembler. Das 
Ganze wurde schon vor Jahren durchgekaut und das AVR Studio kenne ich 
seit Version 2.xx.

MfG Spess

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Dennis H. schrieb:
> Zum anderen sind die Simulatoren schon bisschen Müll, ich frag mich
> ehrlich schon, warum die überhaupt mit dabei sind, wenn man erstmal ne
> ganze Liste lesen kann, was alles nicht funktioniert.

Ich benutze sie gerne, um delay Routinen und andere Laufzeiten zu 
messen. Und um eben mal das Verhalten von Flags durchzuklingeln, finde 
ich sie auch prakisch.

> Ich hätte manchmal gern etwas simuliert, einfach um zu sehen, ob man das
> Datenblatt richtig verstanden hat, und alle Register richtig beschrieben
> hat, dass die Hardware dann das macht, was ich gern möchte.

Im Zweifelsfall stimmt das Datenblatt und der Simulator ist fehlerhaft. 
Zumindest habe ich noch keine Anomalie eines Tiny oder Mega gehabt, die 
nicht im Datenblatt oder den Errata stand.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Matthias Sch. schrieb:
> Im Zweifelsfall stimmt das Datenblatt und der Simulator ist fehlerhaft.
> Zumindest habe ich noch keine Anomalie eines Tiny oder Mega gehabt, die
> nicht im Datenblatt oder den Errata stand.

Ich meinte das etwas anders. Technisches Englisch zu verstehen braucht 
etwas Übung. Also ich würde gern mithilfe des Simulators sehen wollen, 
ob ich das Datenblatt richtig verstanden habe. Das Datenblatt ist schon 
richtig, da lege ich keine Zweifel ran, Zweifel habe ich eher manchmal 
bei meinem Verständnis, vorallem bei Hardware, die eher wenig von 
anderen genutzt wird, da hilft meist googlen auch nicht wirklich.

MfG Dennis

von c-hater (Gast)


Angehängte Dateien:

Lesenswert?

Spess53 schrieb:

> Kannst du gern. Da du dich c-Heater nennst aber bitte in Assembler.

Natürlich, was sonst?

> Das
> Ganze wurde schon vor Jahren durchgekaut und das AVR Studio kenne ich
> seit Version 2.xx.

Und hast offensichtlich seitdem rein garnichts mehr hinzu gelernt...

Im Anhang ist jedenfalls das entsprechende Testprojekt und Screenshots 
des Simulators von den wesentlichen Momenten der ersten zwei 
Timerzyklen. Interessant zum Nachweis der Funktionsfähigkeit ist 
natürlich der cycle counter des Systems. Deswegen habe ich die 
Screenshots gleich entsprechend benannt, was nebenbei auch noch den 
Vorteil hat, daß man sie zur Anzeige leicht in die richtige 
chronologische Reihenfolge bringen kann.


So, damit dürfte das Thema erledigt und abschließend geklärt sein, wer 
genau hier Unsinn erzählt und wer die Fakten wiedergibt.

von Spess53 (Gast)


Lesenswert?

Hi

>> Kannst du gern. Da du dich c-Heater nennst aber bitte in Assembler.

>Natürlich, was sonst?

Habe ich heute schon selbst gemacht. Beim Simulator funktioniert es 
definitiv nicht. Die PWM-Modi 8, 10 und 14 verhalten sich wie die Modi 
mit festem Top 0x1FF. Die Modi 9, 10 und 15 wie die mit festem Top 
0x3FF. Egal was in OCR1A oder ICR1 drin steht.

Für den Simulator2 des 4er Studios muss ich meine Aussage zurückziehen. 
Bei dem lassen sich die Modi simulieren. Allerdings ist mir aufgefallen, 
das die Zeit/Taktanzahl zwischen zwei Overflow-Interrupts teilweise 
nicht korrekt angezeigt wird.

MfG Spess

von c-hater (Gast)


Lesenswert?

Spess53 schrieb:

> Für den Simulator2 des 4er Studios muss ich meine Aussage zurückziehen.

Aha, da kommen wir der Sache doch schon näher...

> Allerdings ist mir aufgefallen,
> das die Zeit/Taktanzahl zwischen zwei Overflow-Interrupts teilweise
> nicht korrekt angezeigt wird.

Doch, wird sie. Stichwort: variable Interruptlatenz.

von Spess53 (Gast)


Lesenswert?

Hi

>> Für den Simulator2 des 4er Studios muss ich meine Aussage zurückziehen.

>Aha, da kommen wir der Sache doch schon näher...

Ja, das du genauso Unrecht hattest wie ich.

>Doch, wird sie. Stichwort: variable Interruptlatenz.

Aber nicht 27 Takte zu wenig wenn das Hauptprogramm aus einem rjmp 
besteht.

MfG Spess

von c-hater (Gast)


Lesenswert?

Spess53 schrieb:

> Ja, das du genauso Unrecht hattest wie ich.

Holla...

Du schriebst, wie jeder hier nachlesen kann:

> Ich weiß nicht, wie es beim 5er Studio ist, aber die Simulatoren des 4er
> Studios unterstützen keine Timermodi mit Register als Top.

Und ich schrieb darauf:

> Das ist blanker Unsinn.

So, daraus leitest du jetzt ab, daß ich genauso Unrecht hätte wie du? Du 
hast eine absolute Behauptung aufgestellt. Zur Widerlegung so einer 
Behauptung reicht nunmal ein einziges Gegenbeispiel, welches ich ja wohl 
geliefert habe.

Ich im Gegenteil habe nur deine Behauptung als das bezeichnet, was sie 
war. Ich habe aber keine gleichermaßen absolute Gegenbehauptung 
aufgestellt, wie etwa daß jeder der Simaulatoren des 4er Studios das 
unterstützen würde. Sowas käme mir garnicht in den Sinn, denn ICH weiß 
ja, wovon ich rede.

> Aber nicht 27 Takte

Wo siehst du den TOV 27 Takte daneben?

Beim mir kommt er beim ersten Mal 5 Takte "zu spät", was problemlos mit 
dem Prescaler zu erklären ist, der wurde ja schließlich nicht explizit 
resettet, kann also jeden beliebigen Delay zwischen 0 und 7 Takten 
einführen, ohne gegen die Specs zu verstoßen.

Und ab dem dem zweiten Mal ist der Abstand der TOV-Ints immer im Wechsel 
47 und 49 Takte, was eben mit der variablen Latenz zu erklären ist, 
jeder zweite Interrupt kommt genau einen Takt zu spät. Das Mittel der 
Abstände ist also 48 Takte, was auch auffallend gut zu dem 
Erwartungswert von 8*(5+1)=48 paßt.

Du kannst nicht verlieren, stimmt's?

von Spess53 (Gast)


Lesenswert?

Hi

>So, daraus leitest du jetzt ab, daß ich genauso Unrecht hätte wie du? Du
>hast eine absolute Behauptung aufgestellt.

Hast du mit

> Das ist blanker Unsinn.

auch aufgestellt.

>Zur Widerlegung so einer
>Behauptung reicht nunmal ein einziges Gegenbeispiel, welches ich ja wohl
>geliefert habe.

Und ich auch.

>Wo siehst du den TOV 27 Takte daneben?

Zwischen dem erste und zweiten Overflow-Interrupt.

>Beim mir kommt er beim ersten Mal 5 Takte "zu spät", was problemlos mit
>dem Prescaler zu erklären ist, der wurde ja schließlich nicht explizit
>resettet, kann also jeden beliebigen Delay zwischen 0 und 7 Takten
>einführen, ohne gegen die Specs zu verstoßen.

Ich habe keinen Prescaler benutzt. Fällt also aus.

>Und ab dem dem zweiten Mal ist der Abstand der TOV-Ints immer im Wechsel
>47 und 49 Takte, was eben mit der variablen Latenz zu erklären ist,

Ab dem 3.Interrupt verhält sich die Simulation auch 'normal'.

>Du kannst nicht verlieren, stimmt's?

Wieso? Ich kann zumindest zugeben wenn ich Unrecht habe. Du agierst zwar 
mit korrekter Logik, legst aber die Bewertungskriterien (z.B. absolute 
Behauptung) zu deinen Gunsten aus. Für mich keine Basis für weitere 
Diskussionen.

MfG Spess

von c-hater (Gast)


Lesenswert?

Spess53 schrieb:

> Ich habe keinen Prescaler benutzt. Fällt also aus.
[...]
> Ab dem 3.Interrupt verhält sich die Simulation auch 'normal'.

Wenn du keinen Prescaler benutzt, kann sich die Simulation garnicht 
'normal' verhalten. (Genauso wenig wie bare metal das dann könnte)

Die statische Interruptlatenz beträgt nämlich 8 Takte, 4 für die 
Auslösung, 4 weitere für's reti.

Diese acht Takte verbraucht jede einzelne Auslösung der drei 
programmierten Interrupts unweigerlich, zusammen also 24 Takte. Der 
gesamte Zyklus des Timers umfaßt aber ohne Prescaler nur 6 Takte.

D.h. in der Konsequenz, daß du die Interrupts komplett vom Timer 
abgekoppelt hast, denn es liegt schon ab dem "sei" ZU JEDER ZEIT ein IRQ 
an.

Ich kann das problemlos im Simulator modellieren und der verhält sich 
auch genau so, wie es zu erwarten ist. Nämlich: die drei Interrupts 
werden unmittelbar nacheinander abgearbeitet, main wird überhaupt nicht 
mehr durchlaufen und das PWM-Signal hat eigentlich überhaupt nichts mehr 
mit den Interrupts zu tun. Im konkreten Fall hat es das allerdings doch 
wieder, aber nur zufällig, weil 3*8=24 und 24/6 ganzzahlig teilbar, was 
dazu führt, daß an den Int-Breakpoints PWM-mäßig scheinbar alles 
zumindest konstant aussieht, wenn auch nicht unbedingt korrekt. (Aber 
auch die Konstanz ist ein typischer Alias-Effekt, denn es sind 
inzwischen jeweils vier PWM-Zyklen gelaufen, nicht nur einer)

Aber bei der ganzen Spielerei konnte ich nirgendwo den von dir 
behaupteten Fehler von 27 Takten finden.

Kannst du das auch mal als Screenshots mit zugehörigem Programm bringen? 
Wenn nicht, würde ich mal so frei sein, zu behaupten, daß bei dir noch 
was viel Schlimmeres der Fall ist, als keine Ahnung zu haben: nämlich 
ein Lügner zu sein.

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
Noch kein Account? Hier anmelden.