Hallo Allerseits, mit Hilfe des Atmels Mega32s möchte ich ein Signal erzeugen. Timer1 Schaltet einen Ausgang ein und startet Timer2. Dieser schaltet den ausgang wieder Aus, sodass ich die Signallänge unabhängig von der Frquenz einstellen kann. Beim Betrachten des Signals mit Hilfe des Osziloskopes musste ich leider festestellen, dass die Signallänge um 20-30 Mikrosekunden variiert. Nun würde mich interessieren, ob eine solche Abweichung normal ist, oder ob es an der Programmierung liegt. Sinn eines Timers ist ja eigentlich, dass mein eine Aktion nach einem genau definierten Zeitpunkt starten kann und nicht, dass dieser variiert. Ich würde mich freuen, wenn jm. Genaueres weiss, würe ich mich freuen. VG Sebastian
Es ist ein bischen unüblich, in einem Timer-Interrupt einen anderen Timer zu starten. Wozu soll das gut sein? Dass dabei kleine Abweichungen entstehen ist klar, denn die Reaktionszeit eines Interrupts ist nicht exakt konstant, so dass der Start des 2. Timers nicht exakt mit Ablauf des ersten erfolgt, sondern etwas später - allerdings erklärt das keine Abweichung von 20-30µs.
Ich dachte mir schon, dass es unüblich ist. Allerdings ist mir für mein Vorhaben keine andere Lösung eingefallen. Erzeugen möchte ich ein Signal mit einer definierten Frequenz. Allerdings soll nicht die Hälft High und die andere low sein, sondern ich will die Anteile (Zeiten) varrieren können. Zusätzlich soll zwischen den Signalen, die eine Frequenz darstellen noch einige Bits daten übertragen werden. Zusammengefasst:
1 | _ _ |
2 | | | _ _ _ | | _ |
3 | | |_| |_| |_| |_______| |_| | ..... |
Zwischendurch benötige ich noch etwas Rechenzeit, sodass ich nicht alles mit delay machen will. Die Abweichung ist leider auch nicht konstant, sondern schwankt immer.
Hast du den Prescaler verwendet? Wenn ja, wird dieser resettet? MfG Tobi
S. Lehner wrote: > Erzeugen möchte ich ein Signal mit einer definierten Frequenz. > Allerdings soll nicht die Hälft High und die andere low sein, sondern > ich will die Anteile (Zeiten) varrieren können. Das klingt für mich nach PWM > Zusätzlich soll zwischen > den Signalen, die eine Frequenz darstellen noch einige Bits daten > übertragen werden. Den Satz versteh ich nicht. Insbesondere nicht welcher Zusammenhang nun zwischen diesen zusätzlichen Signalen und den High/Low Zeiten besteht. > Zwischendurch benötige ich noch etwas Rechenzeit, sodass ich nicht alles > mit delay machen will. Das sowieso nicht. Wenn sich der erste Verdacht bestätigt, dass das sowas wie eine PWM wird, dann kann der ein Timer das alles ganz alleine machen. (OK. Etwas Schützenhilfe in Form einer ISR zum Umschalten der Zeiten wird er schon noch brauchen)
Hallo Tobi, die Prescaler verwende ich zum starten der timer. Würden diese resetest, hielte der Timer an. Somit kann ich das ausschliessen. (Ist es eigentlich normal, dass die digitalen Ausgänge des Mikros nun einen Pegel von 4,4V haben? Die Eingangsspannung ist 5VI Danke trotzdem
Eine konstante Frequenz mir variablem Ein/Aus-Verhältnis kommt raus, wenn du den Timer im PWM Modus betreibst. Wenn der Timer im PWM Modus eine variable Obergrenze kann, dann kannst du mit der Obergrenze die Frequenz und mit OCRx das Tastverhältnis einstellen. Was anderen Takt angeht fehlt mir etwas das Verständnis davon, was du eigentlich machen willst und was für Zeiten dabei rauskommen müssen.
S. Lehner wrote: > (Ist es eigentlich normal, dass die digitalen Ausgänge des Mikros nun > einen Pegel von 4,4V haben? Die Eingangsspannung ist 5VI Nein. Hardware/Schaltbild?
Wenn der Prescaler resettet wird, hält der Timer nicht an! Vor jedem Start eines Timers, empfiehlt es sich den Prescaler zu resetten, da der Prescaler sonst einen undefinierten Wert hat, und so die Timer zu "Jittern" führen. Aber vorsicht: Timer 0 und 1 teilen sich einen Prescaler. Ein Reset wirkt sich evtl. dann noch auf Timer 0 aus! Bei 5V Eingansspannung sollten auch ca. 5V an den Pins anliegen. Wieviel Strom ziehst du denn? Wenn der Pin viel Strom liefern muss, bricht die Spannung ein. Oder das Direction Bit ist faslch gesetzt.
Stimmt mit der PWM ist eigentlich eine gute Idee. Wird dann auch bei jedem Takt ein Interrupt ausgelöst, dass ich die restlichen Daten senden kann? Meines Wissens nach wird dann einfach der PIN getoggelt. zum Rest. Ich will nach dem hohen Bit (das die Frequenz vorgibt), siehe Zeichung oben, noch einige Bits an Daten senden, die 0 oder 1 sein können. Die Übertragung erfolgt in einem von Bit1 unabhängigen Takt.
S. Lehner wrote: > Meines Wissens nach wird dann einfach der PIN getoggelt. Getoggelt, gesetzt oder gelöscht, je nach Modus. Und sowohl der OCR-Interrupt als auch der Ablauf-Interrupt erfolgen natürlich auch im PWM Modus. Warum auch nicht? > Die Übertragung erfolgt in einem von Bit1 unabhängigen Takt. Wie schnell?
> Nein. Hardware/Schaltbild?
Es handelt sich um einen mega32@1Mhz.
Angeschlossen ist nichts an en Pins, lediglich ein Voltmeter. Der
Programmer für die ISP, an einem anderen PORT Dipschalter, die mit 10k
Widerständen als Umschalter fungieren, ein Resettaster und am AD0 ein
Poti, der eine spannung con 0-5 Volt anlegt..
Fehlt noch etwas wissenswertes?
Wie wäre es, wenn Du mal beschreibst, was für ein Signal mit welchen genauen Eigenschaften Du generieren willst. Aber nicht so... >Erzeugen möchte ich ein Signal mit einer definierten Frequenz. >Allerdings soll nicht die Hälft High und die andere low sein, sondern >ich will die Anteile (Zeiten) varrieren können. Zusätzlich soll zwischen >den Signalen, die eine Frequenz darstellen noch einige Bits daten >übertragen werden. ...sondern so, dass man auch draus schlau wird, d. h. am besten in ein paar ganz einfachen, klaren, verständlichen Worten.
> > Getoggelt, gesetzt oder gelöscht, je nach Modus. > > Und sowohl der OCR-Interrupt als auch der Ablauf-Interrupt erfolgen > natürlich auch im PWM Modus. Warum auch nicht? > also gibt es ein ISR. Damit wäre es für mich die beste Alternative. > Wie schnell? immer zwischen dem eigentlichen Takt, wie oben dargestellt. (den eigentlichen Takt habe ich oben mit grösserer Amplitude gezeichnet.)
AVRFan wrote: > Wie wäre es, wenn Du mal beschreibst, was für ein Signal mit welchen > genauen Eigenschaften Du generieren willst. Aber nicht so... > >>Erzeugen möchte ich ein Signal mit einer definierten Frequenz. >>Allerdings soll nicht die Hälft High und die andere low sein, sondern >>ich will die Anteile (Zeiten) varrieren können. Zusätzlich soll zwischen >>den Signalen, die eine Frequenz darstellen noch einige Bits daten >>übertragen werden. > > ...sondern so, dass man auch draus schlau wird, d. h. am besten in ein > paar ganz einfachen, klaren, verständlichen Worten. also:
1 | _ _ |
2 | Pin1: toggelt mit Frequenz f | |___________________| |___________ |
3 | _ _ _ _ _ |
4 | Pin2: sendet Daten ___| |_| |_| |___________| |_| |_ |
> Wie schnell...
Ich denke mal, es interessiert der Wertebereich der Verzögerung (in µs).
Denn erst wenn man das weiß, kann man entscheiden, wie man das Problem
anpackt.
...
Hannes Lux wrote: >> Wie schnell... > > Ich denke mal, es interessiert der Wertebereich der Verzögerung (in µs). > Denn erst wenn man das weiß, kann man entscheiden, wie man das Problem > anpackt. > > ... im Bereich von 20-50us
Exakter ist eigentlich: > >
1 | > _ _ |
2 | > Pin1: toggelt mit Frequenz f | |___________________| |___________ |
3 | > _ _ _ _ _ _ _ |
4 | > Pin2: sendet Daten | |_| |_| |_| |_______| |_| |_| |_ |
5 | >
|
6 | >
|
Pin 1 toggelt überhaupt nicht, denn dann wäre der Tastgrad 50%. Pin 1 gibt eher Impulse aus, es interessieren jetzt minimale und maximale Impulsdauer und Impulspause. Pin 2 gibt Daten aus... - Ja aber wie? Steckt die Information in der Impulsdauer oder in der Anzahl der Impulse oder wie bei UART? Sind die Zeiten fix oder werden die mittendrin verändert? Komm' endlich mal auf den Punkt, sonst kann Dir keiner helfen. Wobei ich Dir eh nur eine ASM-Lösung bieten könnte, aber auch das könnte bei den kurzen Zeiten schon fast eng werden. ...
Stimmt, PIN1 gibt Impulse aus. Die Länge der Impulse sollte nicht von Bedeutung sein, da sie über den Timer eigestellt werden. Die Daten Werden wie angegeben gesendet. Hinzuzufügen sollte ich, dass die Impulslänge und Abstand konstant sind. Die Nullen und Einsen werden durch ein Impuls oder fehlenden Impuls gesendet (Soweit ich weiss wie bei der RS232)
S. Lehner wrote: > Stimmt, PIN1 gibt Impulse aus. Die Länge der Impulse sollte nicht von > Bedeutung sein, da sie über den Timer eigestellt werden. > > > Die Daten Werden wie angegeben gesendet. Hinzuzufügen sollte ich, dass > die Impulslänge und Abstand konstant sind. Die Nullen und Einsen werden > durch ein Impuls oder fehlenden Impuls gesendet (Soweit ich weiss wie > bei der RS232) Gut... Wenn die Zeiten nicht zu kurz sind, bietet sich an, das per Software im Timer-Interrupt zu machen. Dabei würde ich Timer1 durchlaufen lassen und beide OCR-Interrupts verwenden. Compare1A würde den Termin bestimmen, wann die nächste Periode bestimmt. In dessen ISR werden also beide Ausgänge gesetzt, der nächste Termin für OCR1A gesetzt (OCR1A einlesen, kopieren für B, Intervall aufaddieren, Summe zurückschreiben), den ersten Termin für OCR1B bestimmen (Intervall für B auf die Kopie des A-Zeitstempel addieren und in OCR1B schreiben) Die Compare1B ISR muss nun das entsprechende Bit des Datenbytes (Kopie in einem Shiftregister) an Ausgang 2 ausgeben und den nächsten Termin in OCR1B schreiben (OCR1B einlesen, Intervall addieren, zurückschreiben). Und natürlich den Impuls von Ausgang 1 wieder wegnehmen. Dies ist zwar nur beim ersten mal nötig, aber das Prüfen auf erstes mal dauert länger als das 'cbi', und AUSer als AUS geht nicht, es schadet also nicht, den Port jedesmal erneut auszuschalten obwohl er schon aus ist. Da auf diese Weise nicht am laufenden Timer manipuliert wird, sondern nur an den feststehenden Vergleichswerten, entsteht kaum Jitter. Zumindest können sich die unvermeidbaren Fehler (Interrupt-Response-Time) nicht addieren. Um Störungen durch weitere Interrupts zu vermeiden, sollte der ADC im Free-Run-Mode betrieben werden und im Compare1A-Interrupt abgefragt werden. Der ADC-Vorteiler ist dazu auf den ISR-Takt abzustimmen. In ASM halte ich es für machbar, wenn das Tempo nicht zu hoch wird. Denn es muss ja auch noch etwas Rechenzeit für die Mainloop übrig bleiben. Hier ist also Taktezählen angesagt. ...
vielen Dank für die Ausführliche Antwort. Der Vorschlag hört sich auf jeden Fall durchdacht an. Ich werde schauen, ob es für meine Frequenzen (Zeiten) machbar ist. VG Sebastian
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.