Micros auf Arduino zählt nur in 4er-Schritten. Wobei eine absolute Genauigkeit auf Microsekunden mit normalen Arduinos eine Illusion ist. So genau sind die Resonatoren nicht.
Da müssten schon mehr Infos zum Verwendungszweck kommen, um sinnvolle Wege aufzuzeigen.
Hallo,
vielen Dank für Eure Antworten. @Klaus: Ich habe nicht vor weitere HW (RTC etc.) zu verwenden. @Moko: Ich glaube dass die Nachtwächter-Funktion mein Problem nicht löst. @Tommy56: Das stimmt. Die Uhr sollte aber etwas genauer gehen wie eine Kuckucksuhr. Also 1-2 Minuten/Woche
Mein Projekt sieht wie folgt aus:
Es soll eine elektromechanische Uhr werden die mit einer Batterie betrieben wird.
Diese sollte alle Sekunden einen Motor um ein Stück weiterdrehen.
Damit die Batterie nicht schon nach einem Tag aufgebraucht ist, also sollte der Arduino "schlafen gelegt" werden.
Das Heist es sollen alle Verbraucher abgeschaltet werden nur die Clock sollte weiterlaufen.
Ich habe mal versucht ein Diagram zu machen (siehe Anhang)
Da gibt es was wie:
ich kann mit nicht vorstellen daß das was wird, selbst wenn du auf das "schlafen gehen" verzichtest wird das eine Eieruhr. Die Quarz Frequenzen sind zu ungenau, u.A. werden desshalb RTC verwendet. Man kann das sicher 1-2 Stunden laufen lassen müsste dann aber mal wieder synchronisieren. Sieihe NTP Uhren.
Es soll eine elektromechanische Uhr werden die mit einer Batterie betrieben wird.
Diese sollte alle Sekunden einen Motor um ein Stück weiterdrehen.
Damit die Batterie nicht schon nach einem Tag aufgebraucht ist, also sollte der Arduino "schlafen gelegt" werden.
Das Heist es sollen alle Verbraucher abgeschaltet werden nur die Clock sollte weiterlaufen.
Dann muss die Sekunde NICHT auf 1µs eingehalten werden.
Sondern nur im Mittel.
Im Grunde ist das doch ganz einfach....
Man nimmt einen nackten ATMega328P.
Lässt ihn mit 1 oder 8 MHz internem Takt laufen.
Timer2 läuft mit einem Uhrenquarz im asynchronen Modus.
Sleep, wenn nix zu tun ist.
Eine solche Kombination läuft bei mir schon seit ca 5 Monaten an einer CR2032.
Allerdings ohne Motor.
Und meine Heizkörper Thermostate beinhalten: Display Motor ATMega169P und 2 AA Batterien Uhrenquarz.
Laufzeit mit einem Satz Batterien ca 24 Monate.
Also.
Wenn Du es genau haben willst (sagen wir einige Sekunden pro Jahr bis zu einige Minuten pro Jahr) brauchst Du einen Quarz.
Die Möglichkeiten sind zB die von combie wo der Controller einen externen Uhrenquarz bekommt und dieser das Timing macht. Der Takt wird vom ungenauen RC Oszillator gemacht, aber der muß nicht genau sein.
Das bedeutet daß man die Platine selbst bauen muß.
Alternativen sind einen Arduino ohne Zusatzelektronik zu nehmen (Arduino MINI, PRO MINI oder MICRO) und eine RTC anzuschließen. Die meisten RCT haben die Genauigkeit von einigen Minuten pro Jahr; die DS3231 sind da genauer weil Temperaturkompensiert und man kommt schon auf Sekundenabweichungen. Der Vorteil von externen RTC ist, daß man die Uhrzeit und Datum zur Verfügung hat und somit den Motor auch auf eine bestimmte Stelle plazieren kann nachdem die Schaltung eingeschaltet wurde. Den Arduino kann man in sleepmodus bringen und durch ein 1Hz Signal des RTC aufwecken und den Motor bewegen.
Wenn Du die RTC das Teilen überlässt (den Strom nimmt Die dafür eh), kannst Du auch immer +1 zählen und somit 32767 öfter schlafen (ok, eigentlich nur 1x, aber immerhin) - also die angesprochenen 1Hz.
Hallo Schuppeste,
danke für den Hinweis. Ich glaube mit dieser Genauigkeit kann ich leben.
Den Begriff "sekundengenauesTimeout" habe ich gewählt um mögliche Lösungen wie "delay(xxx)" etc zu vermeiden.
Ich wollte, dass die Hardware die Kontrolle der Zykluslänge übernimmt. Daher die Verwendung des Timers.
Da delay() auch nur an einem Timer hängt, sehe ich hier keine Erklärung.
Der Arduino 'wartet' auch nur x ISRs ab, um millis um 1 zu erhöhen - mit der gleichen Genauigkeit, Die auch den anderen Timern gegeben ist.