Uhr mit hilfe von Uhrenquarz

Gast #2219771
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.
#2219777
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...
Moderator (Firma: Titel) Persönliche Seite #2219781
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
Gast #2219791
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.
Gast #2219803
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.
Gast #2219804
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.
Gast #2219826
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?
Moderator (Firma: Titel) Persönliche Seite #2219828
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.
#2219851
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
#2219897
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();
}
Gast #2219916
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();
 }
}
Moderator Persönliche Seite #2219955
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.
Gast #2220017
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. ;-)
Moderator (Firma: Titel) Persönliche Seite #2220029
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...
Moderator Persönliche Seite #2220053
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.
Gast #2225058
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!
Gast #2236029
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren