hi zusammen, ich hoffe es kann mir einer von euch helfen. ich finde keinen richtigen quarz für mein board. was ich vor habe ist eine clock zu intergrieren habe aber an meinem controller keinen eingang für einen 32.768khz quarz somit bin ich auf den hauptquarz angewiesen...ich bekomme immer total schiefe werte...das passt mir überhaupt nicht...gibt es überhaupt einen passenden?? wenn ja sollte der zwischen 4 und 8 mhz liegen. danke für eure hilfe. gruß, marcel
ist doch nur ne Softwarefrage, dürfte mit jedem beliebigen Quarz gehen. Die MC-Quarze sind allerdings nicht besonders genau, zumindest nicht die, die man für wenige Cent bei Reichelt und Co kauft.
wo bitte schön ist ein 4Mhz genau?? beim 8bit timer und einem teiler 1024 komme ich auf 65,536 ms.wie soll ich denn da auf eine sekunde kommen ohne das mir die uhr am tag ein paar sekunden wegläuft?
Man kann den Timer mit einem Wert vordefinieren. In jedem Interrupt wird dieser Wert wieder in den Timer hineingeschrieben - damit kann man sogar Ungenauigkeiten des Quarz ausgleichen, die Uhr also kalibrieren. Noch einfache ist es, wenn Du den 16-Bit Timer (Timer1) des Atmel benutzt und mit dem Compare-Interrupt arbeitest. Es gibt eine Option, die den Timer1 in diesem Fall gleich löscht. So kann man aus einem beliebigen Quarz beliebige Frequenzen erhalten. Im Datenblatt ist alles beschrieben. Ansonsten Quarze benutzen, deren Freqenz eine 2er-Potenz ist. Es gibt nicht viele, aber es gibt sie.
Hallo Markel, Du kannst jeden Quarz nehmen und trotzdem eine hochgenaue Uhr damit bauen. Kein Mensch kann nämlich erkennen, ob Dein Sekundentakt wirklich genau ist. Du must also nur verhindern, daß sich diese kleinen Fehler addieren. Und das geht sehr einfach: http://www.specs.de/users/danni/appl/soft/clock/timebase.htm Die C-Routine hat den Vorteil, daß sie alle Korrekturrechnungen selbsttätig ausführt. Du must also nur die genaue Quarzfrequenz eintragen. Theoretisch erreichst Du damit nur wenige Sekunden / Jahr. Praktisch wirds durch Temperaturschwankungen etwas mehr sein. Peter
dank erstmal peter. also ich hab mir den code mal angeschaut und werde daraus irgendwie nicht richtig schlau. z.b: void t0_int( void ) interrupt 1 { static uchar prescaler = 0; union bw i; if( --prescaler == 0 ){ du legst ein uchar prescaler in der int routine an mit wert 0. danach kommt deine if schleife, in der du erst 1 von prescaler abziehst und dann auf 0 vergleichst. meiner meinung nach kann das innere der if bedingung niemals ausgeführt werden weil prescaler vorher immer auf null gesetzt wird und dann noch 1 abgezogen wird.
Hallo Marcel, static Variablen innerhalb einer Funktion behalten ihren Wert vom Verlassen bis zum nächsten Aufruf bei und werden nur einmal vor dem main() initialisiert. Sind quasi wie globale Variablen, bloß eben nur innerhalb der einen Funktion sichtbar. Als Editor nehme ich Borland C++ 3.0, da ist eine schöne deutsche Hilfe mit dabei, die sowas auch erklärt. Peter
Das ist aber ein bischen übertrieben, denn durch Exemplarstreuung und Temperaturschwankungen hat man auch mit nicht billigen Bauteilen eine Ungenauigkeit von ca. 1 s pro Tag, selbst wenn man den Quarz genau ausmißt. Dazu kommt noch die Alterung. Mit Temperaturstabilisierung, aktiv gealtertem Quarz und Eichen mit mind. 12-stelligem Frequenzzähler kann man es genauer bekommen, aber ein DCF-77-Empfänger ist meist billiger.
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.