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)
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ß)
> 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?
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.
> 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.
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.
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
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
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.
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.
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
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
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.
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
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.
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
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.
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
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?
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
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.