Forum: Mikrocontroller und Digitale Elektronik Uhr mit hilfe von Uhrenquarz


von VON THRON (Gast)


Lesenswert?

Hallo miteinander,

habe noch nie einen Timer init geschrieben und benötige Hilfe.
Habe einen Uhrenquarz mit 6,5536Mhz mit einem Teiler von 2 komme ich 
wieder auf die  bnötigten 32768 Mhz.

für meine ISR weis ich aus einem Infinieon Programm:

ISR (TIMER1_OVF_vect)
{
    sekunden++;
    if(sekunden == 60)
    {
      minuten++;
      sekunden = 0;
    }
    if(minuten == 60)
    {
      stunden++;
      minuten = 0;
    }
    if(stunden == 24)
    {
      stunden = 0;
    }
}

später in der main kann ich in der while-Schleife dann so abfragen?

while(1)
{
    if ((stunden==23)&(minuten==59)&(sekunden==59))
    //Befehl was machen
}

würde mich über die benötigte Hilfe freuen.

von LuXXuS 9. (aichn)


Lesenswert?

VON THRON schrieb:
> würde mich über die benötigte Hilfe freuen.

Was ist denn genau die Frage? Du sagst ja nicht, was du genau machen 
möchtest - anscheinend irgendwie einen Tag registrieren...?

VON THRON schrieb:
> Habe einen Uhrenquarz mit 6,5536Mhz mit einem Teiler von 2 komme ich
> wieder auf die  bnötigten 32768 Mhz.

Die Rechnung scheint mir auch noch etwas suspekt...

von VON THRON (Gast)


Lesenswert?

habe das komma vergessen 3,2768MHz.

Ja ich möchte jeden Tag einen wert in einem EEPROM Speichern, befehl ist 
bekannt zum speichern. Mir geht es im endeffekt um die Routine des 
Timers.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

VON THRON schrieb:
> Habe einen Uhrenquarz mit 6,5536Mhz mit einem Teiler von 2 komme ich
> wieder auf die  bnötigten 32768 Mhz.
hertz? Hertz hieß der gute Mann, mit großem 'H'...
1MHz = 1000000Hz

> auf die  bnötigten 32768 Mhz.
Also 3,2786MHz? Für was werden die benötigt?

> aus einem Infinieon Programm:
Die Firma heißt "Infineon"...

Schreib doch einfach, WAS du mit WELCHEM uC WIE machen willst. Du 
kopierst irgendwo irgendwelche Codezeilen zusammen und kapierst sie 
nicht...

> später in der main kann ich in der while-Schleife dann so abfragen?
Das kann man, wenn man sich sicher ist, dass man die richtige Sekunde 
erwischt. Wenn man mal (aus welchen Gründen auch immer) eine Sekunde 
lang was anderes zu tun hat, war vorher 23:59:58 und nachher 0:0:0 ... 
:-o

von VON THRON (Gast)


Lesenswert?

möchte eine Uhr bauen mit einem ATMEGA 644!

Jetzt denken viele wieso den großen, aber ganz einfach er hat ein großes 
EEPROM wo ich genung daten speichern kann.

Die 3,2768 MHz werden für die Uhr benötigt. das habe ich jetzt aus 
anderen Beitrrägen mal herausgelesen.

möchte das alle 24 Std dann der Wert gespeichert wird.

von Wilhelm F. (Gast)


Lesenswert?

VON THRON schrieb:

> würde mich über die benötigte Hilfe freuen.

Damit die ISR nicht zu lang wird, kannst du die Abfrage aus der ISR auch 
in die Main-Schleife setzen. In der ISR könnte man ein Flag setzen, daß 
eine Sekunde um ist, welches in Main dann ausgewertet und wieder 
gelöscht wird. Man muß nur dafür sorgen, daß die Main-Schleife eine 
Umlaufzeit etwas unter einer Sekunde hat, damit kein Ereignis verpasst 
wird.

Du könntest die If-Abfragen noch etwas ineinander schachteln, denn 
Minuten müssen erst gezählt werden, wenn die Sekunden auf Null 
überlaufen, gleiches für die Stunden. Das spart etwas Programmlaufzeit, 
da nicht jede Sekunde alle 3 Variablen abgefragt werden müssen.

von Sebastian (Gast)


Lesenswert?

3,2768 MHz braucht man eigentlich nur, wenn die Uhr Millisekunden zählen 
soll. Ansonsten haben Uhrenquarze 32,768 kHz - das gibt nämlich geteilt 
durch 2^15 einen Sekundentakt.

Wenn man aber mit so hohen Qaurzfrequenzen arbeitet, gehört ein 
Vorteiler vor den Timer. Der ATMEGA kann ein paar Faktoren 
hardwaremäßig, das kann man über entsprechendes Register konfigurieren, 
ansonsten muß man in der ISR einen Zähler mitführen, der zur Ermittlung 
der ganzen Sekunden bemutzt wird, bevor man an Minuten oder Stunden 
denkt.

von Peter D. (peda)


Lesenswert?

VON THRON schrieb:
> Die 3,2768 MHz werden für die Uhr benötigt. das habe ich jetzt aus
> anderen Beitrrägen mal herausgelesen.

Welche denn?
Ich hab sowas noch nie gesehen.

Wenn man Strom sparen will, werden 32kHz oft verwendet.
Ansonsten ist der exakte Wert völlig schnuppe.


Peter

von Karl (Gast)


Lesenswert?

VON THRON schrieb:
> Jetzt denken viele wieso den großen, aber ganz einfach er hat ein großes
> EEPROM wo ich genung daten speichern kann.

Wenn die Daten öfters überschrieben werden, wäre ein ein externes EEPROM 
besser geeignet. I2C EEPROM, I2C RTC, ATmega8 fertig.

von VON THRON (Gast)


Lesenswert?

Wilhelm Ferkes:
Ich möchte es übersichtlich haben bin noch anfänger und habe noch nicht 
die Erfahrungswerte.

Sebastian:
Das würde heisen wenn ich die Millisekunden noch mit einbeziehen würde 
dann würde meine Uhr genauer werden?
Genau Hilfe benötige ich zu der Konfig.
Habe gerade einen 6,5536 MHz quarz daliegen und möchte nicht seperat 
nochmal einen bestellen denke das geht dauch mit diesem oder?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> möchte eine Uhr bauen mit einem ATMEGA 644!
Und warum muß die Uhr so schnell (mit >6MHz) rennen. Da passiert doch 
die meiste Zeit rein überhaupt gar nichts, in so einer Uhr.

Peter Dannegger schrieb:
> Wenn man Strom sparen will, werden 32kHz oft verwendet.
Und weil diese Frequenz sehr geläufig ist.
> Ansonsten ist der exakte Wert völlig schnuppe.
Man kann mit JEDEM (ausreichend schnellen) Quarz eine genaue Uhrzeit 
erhalten. Nur reicht dann ein simpler Hardware-Vorteiler evtl. nicht 
mehr aus.

von VON THRON (Gast)


Lesenswert?

Lothar: habe gerade keinen anderen Controller da.
Ich möchte die Uhr so Simple wie möglich gestalten das ich sie als 
anfänger auch verstehe.

von Peter D. (peda)


Lesenswert?

Lothar Miller schrieb:
> Man kann mit JEDEM (ausreichend schnellen) Quarz eine genaue Uhrzeit
> erhalten. Nur reicht dann ein simpler Hardware-Vorteiler evtl. nicht
> mehr aus.

Der Mega644 hat einen 16Bit-Timer.
Man nehme noch ne 16Bit-Variable im Timerinterrupt und schon kann man 
jedes Teilerverhältnis von 2 .. 4294967296 ganz exakt einstellen.
Einen Hardware-Vorteiler braucht man nicht, wenn man einen MC nimmt.


Peter

von VON THRON (Gast)


Lesenswert?

Also gebracht haben mir die Komentare bis jetzt noch nichts!

von Skua C. (skua)


Lesenswert?

ISR (TIMER1_OVF_vect)
{
    sekunden++;
    if(sekunden == 60)
    {
      minuten++;
      sekunden = 0;
    }
    if(minuten == 60)
    {
      stunden++;
      minuten = 0;
    }
    if(stunden == 24)
    {
      stunden = 0;
    }
    if ((stunden==23)&(minuten==59)&(sekunden==59))
    {
      losgehts = 1;
      schreibdas = irgendwelchedaten();
    }
}

losgehts = 0;
while(1)
{
  if (losgehts)
  {
   schreiben(schreibdas);
   losgehts = 0;
  }
  beliebiger_sonstiger_kram();
}

von && (Gast)


Lesenswert?

Und das hier verfehlt mit Sicherheit auch seine Aufgabe:
>if ((stunden==23)&(minuten==59)&(sekunden==59))
Wenn dann &&

Gruß

von Markus (Gast)


Lesenswert?

ISR (TIMER1_OVF_vect)
{
    sekunden++;
    if (sekunden == 60)
    {
      minuten++;
      sekunden = 0;

      if (minuten == 60)
      {
        stunden++;
        minuten = 0;

        if (stunden == 24)
        {
          stunden  = 0;
          losgehts = 1;
        }
      }
    }
}

int main ( void )
{
 losgehts = 0;
 while(1)
 {
   if (losgehts == 1)
     {
       schreiben(schreibdas);
       losgehts = 0;
     }
   beliebiger_sonstiger_kram();
 }
}

von Matthias (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Wenn man Strom sparen will, werden 32kHz oft verwendet.
> Ansonsten ist der exakte Wert völlig schnuppe.

Aber der Mensch ist ja bequem und möchte mit vernünftigen 
Teilerverhältnissen irgendwann mal bei einem ganzzahligen Sekundentakt 
landen...

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


Lesenswert?

VON THRON schrieb:
> Also gebracht haben mir die Komentare bis jetzt noch nichts!

Das fängt aber bereits damit an, dass du dir über deine eigentliche
Aufgabenstellung nicht wirklich im Klaren bist.

Um's brutal zu sagen: eine einfache Uhr ist nach dem LED-Blinker so
ziemlich das einfachste Stück Firmware, was man sich in einem
Controller vorstellen kann.  Eigentlich hast du das ja schon komplett
hingeschrieben (von der Initialisierung des Timers abgesehen).

Jetzt wäre der Punkt, wo du mal nicht nur Codeschnipsel anderer
Leute reinziehen solltest, sondern dir als erstes einmal darüber
im Klaren werden solltest, wie die Hardware eines Controllers zu
dem Punkt kommt, dass sie dir jede Sekunden einmal einen Interrupt
wirft.  Du musst also (aus dem Datenblatt!) verstehen, wie man einem
Timer den passenden Takt und den passenden Vorteiler einstellt.

Für deine drei Variablen sekunden, minuten und stunden solltest du
nicht vergessen, diese als "volatile" zu kennzeichnen.

von Peter D. (peda)


Lesenswert?

Matthias schrieb:
> Aber der Mensch ist ja bequem und möchte mit vernünftigen
> Teilerverhältnissen irgendwann mal bei einem ganzzahligen Sekundentakt
> landen...

Ich bin noch bequemer als Du.
Ich rechne überhaupt nichts, sondern lasse es den Compiler ausrechnen:

Beitrag "Die genaue Sekunde / RTC"


Peter

von Wilhelm F. (Gast)


Lesenswert?

Peter Dannegger schrieb:

> Ich bin noch bequemer als Du.
> Ich rechne überhaupt nichts, sondern lasse es den Compiler ausrechnen:

> Beitrag "Die genaue Sekunde / RTC"

Aach, Peter, wir sind doch hier bei Anfänger, nicht bei 
Fortgeschrittene. Selbstverständlich nutzt man später den Preprozessor, 
wo es nur geht. Dazu ist er ja da. Ich lasse über den Preprozessor 
Baudraten und Timings aus dem Quarztakt berechnen. Und wenn da nichts 
vernünftiges heraus kommt, kann man sogar noch eine Errormessage 
generieren. Man muß doch aber erst mal wissen, wie die Dinge zu Fuß 
gehen, bevor man sie automatisiert. ;-)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
>> Nur reicht dann ein simpler Hardware-Vorteiler evtl. nicht mehr aus.
> Einen Hardware-Vorteiler braucht man nicht, wenn man einen MC nimmt.
Der uC hat einen Hardwareteiler, so hatte ich das gemeint  ;-)
Und wenn 16  Bit nicht reichen, dann muß Software her...


> ISR (TIMER1_OVF_vect)
> {
>     sekunden++;
Das geht wieder nur, wenn ein Softwarevorteiler nicht nötig ist. Aber 
der Link zur Uhr mit der genauen Sekunde wurde ja schon gepostet....

VON THRON schrieb:
> Lothar: habe gerade keinen anderen Controller da.
Das hatte sich davor noch anders angehört:
VON THRON schrieb:
> er hat ein großes EEPROM wo ich genung daten speichern kann.
Aber man braucht nicht einen 64k großen uC wegen des großen EEPROMs für 
eine Uhr. Große EEPROMs gibts viel billiger als externe Bausteine...

&& schrieb:
> Und das hier verfehlt mit Sicherheit auch seine Aufgabe:
>>if ((stunden==23)&(minuten==59)&(sekunden==59))
> Wenn dann &&
Klar geht das: was ist denn das Ergebnis der einzelnen Vergleiche?
Richtig: das Ergebnis z.B. von (stunden==23) kann nur 0 oder 1 sein. Und 
dann/deshalb geht das...

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


Lesenswert?

Lothar Miller schrieb:
> Und
> dann/deshalb geht das...

Naja, ich würde mal sagen: es geht zufälligerweise hier mal gut.
Dennoch sollte der OP wohl den Unterschied zwischen bitweisem und
logischem UND sich nochmal in seinem C-Lehrbuch ansehen, man kann
sich sonst schnell mal ein blaues Auge holen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Jörg Wunsch schrieb:
> Naja, ich würde mal sagen: es geht zufälligerweise hier mal gut.
Wie definierst du in diesem Zusammenhang "Zufall"?
Es ist doch so, dass a==b nur 0 oder 1 zurückgeben kann, oder wie?

Es ist schon klar, dass & bzw. && prinzipiell was anderes machen und zum 
Ziel haben...

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


Lesenswert?

Lothar Miller schrieb:
> Wie definierst du in diesem Zusammenhang "Zufall"?

Dass er Glück gehabt hat, dass es klappt, obwohl er offensichtlich
die Operatoren verwechselt hat.  Solange die Operanden stets die
Ergebnisse eines Vergleichs sind, geht das gut, wenn sie auch
anderweitig entstanden sein können (und man sie eigentlich auf
gleich/ungleich 0 testen müsste) nicht mehr.

von Matthias (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Ich rechne überhaupt nichts, sondern lasse es den Compiler ausrechnen:
> Beitrag "Die genaue Sekunde / RTC"

Ich bin immer wieder begeistert, was du alles für Trick und Know How auf 
Lager hast und hier im Forum mit allen teilst.

Danke
Matthias

von VON THRON (Gast)


Lesenswert?

void timer1_init()
{
    OCR1A = 6400;         // Vergleichswert setzen

    TCCR1A = 0;           // Modus einstellen, Clear Timer on 
Compare-Mode

    TCCR1B = (1<<CS12) |(1<<CS10) | (1<<WGM12); //Teiler und Modus 
einstellen, Teiler 1024 //CTC-Mode
    TIMSK0 |= (1<< OCIE1A);// Interrupt zulassen bei TIMER1
    sei();
}

was passt da noch nicht!

von VON THRON (Gast)


Lesenswert?

die ganze sache ist echt fein doch lässt sich die Uhr nicht stellen, 
irgendwie bekomme ich es einfach nicht hin.

habe schon alles mögliche ausprobiert! Versuche das ganze über C# 
zumachen.

//Sendefunktion der Zeit zum stellen
string Time = DateTime.Now.ToLongTimeString();

        private void Uhrstellen(object sender, EventArgs e)
        {
            string help;

            serialPort1.Open();
            serialPort1.Write("c");

            help = Time.Substring(0, 2);
            serialPort1.Write(help + "\n");
            help = Time.Substring(3, 2);
            serialPort1.Write(help + "\n");
            help = Time.Substring(6, 2);
            serialPort1.Write(help + "\n");
            help = serialPort1.ReadTo("\n");

            serialPort1.Close();

        }

volatile unsigned char stunden;
volatile unsigned char minuten;
volatile unsigned char sekunden;

//Empfangsroutine beim Empfangen
ISR_Rx()
if ( verb == 0x63)        //Bei c folgende Funktion ausführen
{
    cli();
    zeitstellen();
    sei();
}

ISR (TIMER1_COMPA_vect)
{
    sekunden++;
    if (sekunden == 60)
    {
       minuten++;
        sekunden = 0;
    }
    if (minuten == 60)
    {
        stunden++;
        minuten = 0;
    }
    if (stunden == 24)
    {
      stunden = 0;
    }
    if ((stunden == 23)&&(minuten == 25)&&(sekunden == 59))
    {
  speichern = 1;
    }
}

void zeitstellen()
{

uart_gets(text,25);              stunden = atoi(text); 
uart_gets(text1,25);
minuten = atoi(text1);
uart_gets(text2,25);
sekunden = atoi(text2);

//Test Ausgabe Uhr richtige Zeichenfolge

uart_puts("aktuelle Uhrzeit: ");
uart_puts(dtostrf( stunden, 1,0,string ));
uart_puts(":");                uart_puts(dtostrf( minuten, 1,0,string 
));
uart_puts(":");
uart_puts(dtostrf( sekunden,1,0,string));
uart_puts("\n");               zum beenden
}

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.