Forum: Mikrocontroller und Digitale Elektronik Frequenzstabilität?


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich möchte einfach einen Ausgang 10ms einschalten und 10ms ausschalten.
Das hab ich auch hinbekommen, doch leider musste ich feststellen, als
ich mit dem Oszi nachgemessen habe, das Ti und Tp länger als 10ms sind.
desweiteren habe ich eine unsaubere negative Flanke dieses
Rechtecksignals. Die ansteigende Flanke ist sauber.
An was kann das liegen? Der Mega8 mit eingeschaltetem internen
Oszillator von 1Mhz, müsste ein Signal mit ti/tp 10ms doch sauber
hinbekommen!

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch der Signalverlauf (Bild)

von Rolf Magnus (Gast)


Lesenswert?

Die Quelldatei hätt's als Anhang auch getan, statt gleich ein
Screenshot davon...


Wieso stellst du OSCCAL auf 0xff? Damit trimmst du den Oszillator
sonstwo hin. Kein Wunder, daß die Frequenzen dann total ungenau sind.
Die unsaubere Flanke kommt primär daher, daß du Port D als Eingang
verwendest und nur die Pull-up-Widerstände ein- und ausschaltest.

von Karl H. (kbuchegg)


Lesenswert?

> internen Oszillator von 1Mhz

von dem darfst du keine Wunder erwarten, der schwingt
je nach Temperatur mit einer anderen Frequenz. Wenn
die 10 ms kritisch sind, solltest du einen Quarz
einsetzen. Falls du beim internen Oszillator bleiben
willsz, studier im Datenblatt den Abschnitt der das
OSCCAL (OSCillator CALibration) beschreibt. Damit kannst
du den noch verstimmen. Aber wie gesagt, sobald es wärmer
oder kälter wird ....

Ansonsten: definiere 'unsauber'.

von johnny.m (Gast)


Lesenswert?

Standard-Frage: Weiß der Compiler, dass Du mit 1 MHz taktest? Die
Information braucht der nämlich, um die delay-Routinen korrekt zu
verarbeiten. Also entweder #define F_CPU... oder unter
'Project|Configuration Options' den richtigen Takt auswählen.

Ansonsten kann man es anscheinend nicht oft genug sagen: Wenn Du
wirklich präzise Taktsignale erzeugen willst nimm
1. Nicht den internen RC-Oszi
2. Einen Timer und keine delay-Routinen...

von Thomas (Gast)


Lesenswert?

@johnny.m:
Ja, ich habe unter 'Project|Configuration Options' den richtigen
Tankt eingegeben. Allerdings wird hier automatisch immer ein UL
hintenangefügt, sobald ich erneut in die Configuration Options
gehe.

@Rolf Magnus:
Die Sache mit OSCCAL hat sich bereits erledigt. Hab ich auch gar nicht
mehr drin. Habe mir nur mal angesehen, was diese Funktion bewirkt.
Okay, die unsaubere Flanke ist nun weg.
Doch auch wenn ich jetzt die 10ms eingestellt habe, messe ich ti/tp
immer noch mit ca. 13ms. <<-- Das kann an dem schlechten internen
Oszillator liegen!!?

Allerdings kann ich z.b. auch 10µs einstellen und habe trotzdem ein
Signal im Bereich von einigen ms.

Danke und Gruß,

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du musst die Optimierung einschalten (-Os).

von peter dannegger (Gast)


Lesenswert?

Generell ist ein Delay nicht dazu geeignet, exakte Zeiten zu erzeugen,
denn dazu sind die Timer da.

Ein Delay dient nur dazu, um nötige Mindestzeiten nicht zu
unterschreiten oder einfach nur ein Blinklicht oder ähnliches.

Je größer ein Programm, umso ungenauer ein Delay, da ja die
Programmlaufzeiten und die Interruptbehandlungszeiten nicht
berücksichtigt werden können.


Ein Timer läuft dagegen unabhängig von der Software und ist daher immer
auf den Zyklus (50ns bei 20MHz) genau.


Peter

von Thomas (Gast)


Lesenswert?

Okay, danke. Dann muss ich mich jetzt mit den Timern auseinandersetzen.
Mit dem Tutorial komme ich nicht so ganz klar.
Deshalb wollte ich es vermeiden. Da es aber anscheinend nur so
funktioniert bleibt mir nichts anderes mehr übrig.

Ich brauche 4 Ausgänge die jeweils 10ms eingeschaltet sind, allerdings
immer um 5ms Zeitversetzt.

Danke und Gruß,
Thomas

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du die Optimierung einschaltest, werden deine Zeiten schon
mal ein gutes Stück genauer (vor allem die für kurze Delays),
aber auf die Dauer wirst du um die Timer nicht drumrum kommen.

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.