Forum: Mikrocontroller und Digitale Elektronik Zeit von timer1 und timer2 schwankt


von S. L. (slehner)


Angehängte Dateien:

Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

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.

von S. L. (slehner)


Lesenswert?

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.

von Tobi (Gast)


Lesenswert?

Hast du den Prescaler verwendet?
Wenn ja, wird dieser resettet?

MfG Tobi

von Karl H. (kbuchegg)


Lesenswert?

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)

von S. L. (slehner)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

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.

von Andreas K. (a-k)


Lesenswert?

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?

von Tobi (Gast)


Lesenswert?

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.

von S. L. (slehner)


Lesenswert?

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.

von Andreas K. (a-k)


Lesenswert?

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?

von S. L. (slehner)


Lesenswert?

> 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?

von AVRFan (Gast)


Lesenswert?

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.

von S. L. (slehner)


Lesenswert?

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

von S. L. (slehner)


Lesenswert?

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            ___| |_| |_| |___________| |_| |_

von Hannes L. (hannes)


Lesenswert?

> 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.

...

von S. L. (slehner)


Lesenswert?

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

von S. L. (slehner)


Lesenswert?

Exakter ist eigentlich:
>
>
1
>                               _                     _
2
> Pin1: toggelt mit Frequenz f | |___________________| |___________
3
>                               _   _   _   _         _   _   _
4
> Pin2: sendet Daten           | |_| |_| |_| |_______| |_| |_| |_
5
> 
6
>

von Hannes L. (hannes)


Lesenswert?

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.

...

von S. L. (slehner)


Lesenswert?

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)

von Hannes L. (hannes)


Lesenswert?

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.

...

von S. L. (slehner)


Lesenswert?

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