Hallo, ich habe eine kleine Verständnisfrage zum genauen Zeitpunkt des Rücksetzens des Timers eines AVR beim CTC-Modus und der fast-PWM Betriebsart. Wie beide Betriebsarten funktionieren ist mir klar, wo ich allerdings in Büchern und im Internet stark abweichende Angaben finde ist der Zeitpunkt des Compare-Matches, des zugehörigen Interrupts und des Rücksetzen des Timers: Hier sind die beiden Varianten, die ich für den CTC-Modus in Büchern bzw im Internet gefunden habe: Variante a): TOP-Wert=3 (OCR0=3) TCNT0: 0-1-2-3-0-1-2-3-0-1-2-3 compMatch(int): | | | Variante b): TOP-Wert=3 (OCR0=3) TCNT0: 0-1-2-3-0-1-2-3-0-1-2-3-0 compMatch(int): | | | Wie ihr sehen könnt, wird bei Variante a) der Compare Match direkt ausgelöst, wenn der Wert im TCNT0 Register gleich dem im OCR0 Register ist, während bei Variante b) der Compare Match erst im darauffolgenden Zählschritt, also erst in dem Schritt wo der Zähler wieder auf 0 zurückgesetzt wird gesetzt wird. Da mich genau dieser Unterschied dieser beiden Varianten verwirrt hat, würde ich gerne von euch wissen welche Variante von beiden denn nun die Richtige ist. Schöne Grüße
Da meine Frage gestern Nacht wohl etwas untergegangen ist, möchte ich sie jetzt noch einmal stellen und dabei noch ein wenig erweitern. Was ich jetzt zu meinem ersten Post noch zusätzlich gerne wissen würde ist das Verhalten der Timer bei der Betriebsart fast PWM (clear on Compare Match, Set at TOP). Was mich hier auch wieder genau interessieren würde ist, ob der Compare Match und das Rücksetzen von TOP zu 0 im gleichen oder erst im nächsten Takt jeweils ausgelöst werden. Ich brauche das nämlich zum Verständnis der Formel, die uns mein Professor beim Studieren zum Berechnen des duty cycles der fast PWM Betriebsart gegeben hat: duty_cycle= (OCR0/TOP)*100% Weil irgendwie bin ich mir nicht so ganz sicher ob die Formel überhaupt stimmt. Im Datenblatt hab ich auch schon gesucht, da find ich aber leider nur Formeln zum Berechnen der Frequenzen für die jeweiligen Betriebsarten. Vielen Dank schon mal im Voraus fürs Helfen
sowas steht im Datenblatt. Warum nur wird nie der µC genau genannt? Würd sagen mit einem Takt wird der OCR Wert erreicht. Mit dem nächsten Takt findet der Interrupt statt.
Hi >Weil irgendwie bin ich mir nicht so ganz sicher ob die Formel überhaupt >stimmt. Im Datenblatt hab ich auch schon gesucht, da find ich aber >leider nur Formeln zum Berechnen der Frequenzen für die jeweiligen >Betriebsarten. Es gibt auch noch Application Notes: http://www.atmel.com/dyn/resources/prod_documents/doc2505.pdf http://www.atmel.com/dyn/resources/prod_documents/doc2542.pdf MfG Spess
Andreas S. schrieb: > Da mich genau dieser Unterschied dieser beiden Varianten verwirrt hat, > würde ich gerne von euch wissen welche Variante von beiden denn nun die > Richtige ist. Du könntest in deiner Entwicklungsumgebung den Simulator starten und dir anguck, wann das IF gesetzt wird und wann der Zähler zurückspringt.
haach schrieb: > sowas steht im Datenblatt. Warum nur wird nie der µC genau genannt? > Würd sagen mit einem Takt wird der OCR Wert erreicht. Mit dem nächsten > Takt findet der Interrupt statt. Es ist ein Atmega 128 spess53 schrieb: > Es gibt auch noch Application Notes: > > http://www.atmel.com/dyn/resources/prod_documents/... > http://www.atmel.com/dyn/resources/prod_documents/... > > MfG Spess Die kannte ich noch gar nicht. Danke für den Hinweis. Leider haben die mir für meine Fragen jetzt aber auch nicht entscheiden weiterhelfen können. Werner schrieb: > Du könntest in deiner Entwicklungsumgebung den Simulator starten und dir > anguck, wann das IF gesetzt wird und wann der Zähler zurückspringt. Das geht leider nicht so gut in meinem Fall. Hab nämlich erst wieder Dienstag Praktikum wo ich den Controller programmiere und ich hätte gerne heut den Sonntag genutzt um mich auf die theoretische Prüfung in diesem Fach vorzubereiten. Kann denn vielleicht jemand was zu der Formel sagen? Weil mir die irgendwie ein bischen falsch vorkommt und ich die nirgends wo im Internet oder Datenblatt so finden kann. Gruß Andi
Andreas S. schrieb: > Das geht leider nicht so gut in meinem Fall. Hab nämlich erst wieder > Dienstag Praktikum wo ich den Controller programmiere und ich hätte > gerne heut den Sonntag genutzt um mich auf die theoretische Prüfung in > diesem Fach vorzubereiten. Probiers einfach aus. Mach dir eine PWM mit einem Vorteiler von 1024, setz dir eine ISR auf und in der ISR siehst du nach welcher Wert im Count Register steht. > Kann denn vielleicht jemand was zu der Formel sagen? Das ist ein Simpler Dreisatz 256 Äpfel kosten 100 Euro wieviel kosten 48 Äpfel steht das OCR Register auf dem TOP Wert hast du 100% PWM wieviel % PWM hast du, wenn das OCR Register auf einem anderen Wert steht Dazu brauchst du nicht wissen, wann genau das Rücksetzen ausgelöst wird. Den einzigen Unterschied, den dieser Zeitpunkt macht ist, ob bei 0% (bzw 100%) der Pin überhaupt kurz eingeschaltet wird (bzw. überhaupt kurz ausgeschaltet wird). Und das findet sich im Datenblatt.
Hi Wann die IR-Flags gesetzt werden ist in den Datenblätter unter 'Timer/Counter Timing Diagrams' zu finden. MfG Spess
Karl Heinz Buchegger schrieb: > Mach dir eine PWM mit einem Vorteiler von 1024, setz dir eine ISR auf > und in der ISR siehst du nach welcher Wert im Count Register steht. Genau das hab ich jetzt heute mal gemacht. Ich hab ein kleines Programm geschrieben und mir die jeweiligen Werte des TCNT0 Registers zum Zeitpunkt des CompareMatches bzw des Overflows angeschaut:
1 | //------------------------------------INCLUDES HEADER FILES------------------------------//
|
2 | #include <mega128.h> |
3 | #include <AUTLib.h> |
4 | #include <stdio.h> |
5 | #include <delay.h> |
6 | |
7 | interrupt[16]compareMatch_timer0(); |
8 | interrupt[17]overflow_timer0(); |
9 | |
10 | char output[24]; |
11 | unsigned char value_cm=0, value_ov=0; |
12 | |
13 | //------------------------------------------START---------------------------------------//
|
14 | main() |
15 | {
|
16 | //Set Up
|
17 | DDRC.0=1; |
18 | /*TCCR0=0b00001111; //CTC,PS=1024
|
19 | OCR0=100;
|
20 | TIMSK=0b00000010; //timer0 compare match interrupt enable
|
21 | */
|
22 | |
23 | TCCR0=0b01001111; //fast PWM, PS=1024 |
24 | OCR0=150; |
25 | TIMSK=0b00000011; //compare match und overflow interrupt enable |
26 | SREG.7=1; //global interrupt enable |
27 | |
28 | |
29 | //Infinite Loop
|
30 | while(1) |
31 | {
|
32 | sprintf(output,"value_cm=%d",value_cm); |
33 | array2LCD(0,output); |
34 | |
35 | sprintf(output,"value_ov=%d",value_ov); |
36 | array2LCD(1,output); |
37 | |
38 | }
|
39 | }
|
40 | |
41 | |
42 | /*interrupt[16]compareMatch_timer0()
|
43 | {
|
44 | value_cm=TCNT0; //der Wert im TCNT0 Register ist im CTC-Modus beim compare match Interrupt immer gleich 0
|
45 | PORTC.0^=1;
|
46 | }
|
47 | */
|
48 | |
49 | interrupt[16]compareMatch_timer0() |
50 | {
|
51 | value_cm=TCNT0; //der Wert im TCNT0 Register ist bei fast PWM beim CM interrupt gleich 151 (immer OCR0+1) |
52 | PORTC.0=0; |
53 | }
|
54 | |
55 | interrupt[17]overflow_timer0() |
56 | {
|
57 | value_ov=TCNT0; //der Wert im TCNT0 Register ist beim fast PWM beim overflow interrupt immer gleich 0 |
58 | PORTC.0=1; |
59 | }
|
Das Ergebnis des jeweiligen Tests hab ich als Kommentar in den jeweiligen Interrupt geschrieben. Es ist also nun so, dass beim CTC-Modus zum Zeitpunkt des CompareMatches das TCNT0 Register 0 ist. Beim fast PWM Modus besitzt das TCNT0 Register zum Zeitpunkt des CompareMatches immer den Wert OCR0+1 und zum Zeitpunkt des Overflows ist das TCNT0 Register 0. Mit diesen Erkenntnissen hab ich jetzt mal für den fast PWM Modus mit der Annahme der TOP-Wert des Counters ist 3 und OCR0=2 ein kleines Diagram skizziert: TCNT0-Wert: 0-1-2-3-0-1-2-3-0-1-2-3- PORT-Zustand: ------__------__------__ (--high,__low) Wenn ich für das nun die duty-cycle Formel anwende komme ich nun auf: duty-cycle=(OCR0/TOP)*100%=2/3 *100%= 66.66% Wenn ich den duty cycle jetzt aber nur durch Anschauen meines Timing-Diagramms herauslese komme ich aber auf duty_cycle=high_counts/period *100%= 3/4 *100%= 75% Mir ist auch klar, dass der Fehler bei einem größeren TOP-Wert, wie 255, und einem größeren OCR0-Wert verschwindend gering wird. Aber es wäre trotzdem schön, wenn mein Timing-Diagramm die Formel zur Berechnung des duty-cycles bestätigen würde. Gruß
Hi Am realen Controller gemessen (ATMega644P) stimmt keine der beiden Formeln. Dort ergibt sich für das Tastverhältnis: dc=(OCR+1)/(TOP+1). MfG Spess
spess53 schrieb: > Hi > > Am realen Controller gemessen (ATMega644P) stimmt keine der beiden > Formeln. > > Dort ergibt sich für das Tastverhältnis: > > dc=(OCR+1)/(TOP+1). > > MfG Spess Hi Spess, das ist doch genau das was mein Timing Diagramm aussagt. Bei dem hab ich ja beispielhalft OCR0=2 und TOP=3 gehabt. Und der duty cycle war bei mir ja da 75%, weil ich dc=3/4 *100% , also dc=((OCR0+1)/(TOP+1))*100% gerechnet habe. Das bedeutet dann wohl, dass die allgemein verwendete Formel duty_cycle=OCR0/TOP *100% als eine hinreichend genaue Näherung betrachtet wird. Gruß
Hi >Das bedeutet dann wohl, dass die allgemein verwendete Formel >duty_cycle=OCR0/TOP *100% als eine hinreichend genaue Näherung >betrachtet wird. Für Phase/Frequency Correct PWM stimmt diese Formel. Bei Fast PWN nicht. In der Praxis wird wohl der Fehler vernachlässigt. MfG Spess
spess53 schrieb: > Für Phase/Frequency Correct PWM stimmt diese Formel. Bei Fast PWN nicht. > In der Praxis wird wohl der Fehler vernachlässigt. > > MfG Spess Gut zu wissen. Danke für deine Hilfe
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.