Taktgeber bauen NUR MIT ARDUINO

Hallo Leute,

vorneweg, klasse Projekt der Arduino und es würde mich sehr freuen wenn ihr mir helfen könntet!

Ich möchte eine Digitaluhr bauen und brauche einen Taktgeber. Da ich zurzeit in den Ferien bin und ich zu keinen Bauteilen komme, kann ich auch keinen Uhrenbaustein oder RLC ala DS1307 bauen.

Deshalb möchte ich einen genauen Taktgeber nur mit dem Arduino realisieren. Hab schon viel gegoogelt und nachgedacht, auch über Timer Interrupts doch ich komm einfach nicht weiter.

Ein "delay(1000)" ist mir zu ungenau, damit komm ich auf 1 sekunde abweichung pro minute.

Es wäre toll wenn ihr eine Idee habt, ich komm einfach nicht weiter!
Hab hier auch noch ein paar 16MHz Quarze herumliegen. Aber ich möchte das Software-mäßig schaffen, denn der Arduion wird ja auch mit 16MHz betrieben. Es müsste doch möglich sein ein gutes 1Hz-Taktsignal zu bekommen!!!

Bitte antwortet mir, vielen Dank!

Mit freundlichen Grüßen,
GraKa!

Hallo, ungefaehr das selbe problem habe ich auch. Du konntest den timer des arduino benutzen. Du weisst dass der Kristal eine frecventz von 16Mhz hat. also 16 milio schlage pro sekunde. Teile es mit 16000 und du bekommst 1000 schlage pro sekunde. Dan sagst du dem programm dass nach 1000 schlagen Sekunde +1 bekommt.

Das problem ist, wie schreibe ich den code.

Hi, schön dass es noch einen gibt mit dem gleichen Problem ;D

Das hab ich mir auch schon gedacht, doch ich weiß auch nicht wie ich den Code schreibe.
Es gibt ja auch so Time-Libraries aber die sind nicht so genau.

Vielleicht kann uns ja jemand helfen!

Vielen Dank, mit freundlichen Grüßen,
Stefan Binna!

Diese time library bezieht ihre genaue Uhrzeit von dem PC, durch den serielen port.

http://www.arduino.cc/playground/Code/Timer1
Das konnte dir weiterhelfen. Dieser timer benutzt die frecvent des Kristals um die sekunden zu berehnen.

Danke schonmal für die Antwort, aber heißt das dann nicht dass der Arduino imer mit dem PC verbunden sein muss?

gruß GraKa!

Bei der Time library muss er nur einmal verbunden werden. Wenn du ihn das erste mal startest. nachher lauft er von alleine. Wenn ihm der Strom ausgeht dann musst du ihn von neuen an den pc anschliesen damit er die genaue uhrzeit bekommt. Irgendwie wie eine normale uhr. wenn die batterie aus geht musst du die uhrzeit wieder einstellen. Man konnte das mit 2 oder 3 knopfen aber auch alleine machen.

Das einfachste ein 1Hz Signal zu bekommen ist ein Real Time Clock. Manche Modelle haben einen Ausgang von 1Hz oder sind umschaltbar und haben auch 1Hz.
Eine andere (noch günstigere Quelle) ist ein altes elektronsches Uhrwerk. Der Motor wird mit 1 Hz angesteuert und das IC kann mit 3 V betrieben werden; Gegebenenfalls einen kleinen (ein paar pF) großen Kondensator vom Quarz zur Masse schalten falls der Quarz mit einer Oberschwingung schwingt.
Einen noch genauere Quelle von 1 Hz ist das DCF77 Signal ( hat leider alle 60 Sekunden eine Lücke) oder dessen Trägerfrequen, die auch Atomuhrenstabilisiert mit 77500 Hz schwingt.
Auch Radiosender senden dekodiert ein Zeitsignal.
Grüße Uwe

Jap, ich möchte es aber OHNE andere Bausteine realisieren.

@Shebu: Hast du mal ein Beispiel wie ich ein 1Hz-Taktsignal softwaremäßig realisieren kann? Ich blicke da nicht ganz durch, hab jetzt sowas probiert aber es funktioniert nicht:

#include <TimerOne.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int ib = 0;
int isec = 0;

void setup()
{
lcd.begin(16,2);
Timer1.initialize(1000000);
Timer1.attachInterrupt(callback);
Serial.begin(9600);
}

void callback()
{
isec++;
}

void loop()
{
/*int ivar;

if (ivar==0)
{
ib++;
}

if ((ib==1)&&(ivar==0))
{
isec++;
//lcd.setCursor(0,1);
//lcd.print(isec);
}

if (ivar==1)
{
ib=0;
}

lcd.setCursor(0,1);
lcd.print(ivar);*/

callback();

lcd.setCursor(0,0);
lcd.print(isec);

}

Gruß GraKa!

Was du geschrieben hast ware gut. Versuch es lieber erst mit dem serial monitor un wenn alles klapt kannst du es mit dem lcd ersetzen.

#include <TimerOne.h>
#include <LiquidCrystal.h>

int isec = 0;

void setup()
{
 Timer1.initialize(1000000);
 Timer1.attachInterrupt(callback);
 Serial.begin(9600);
}

void callback()
{
 isec++;
}

void loop()
{
Serial.println(isec);
}