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!
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.
> 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'.
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...
@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ß,
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.