Forum: Mikrocontroller und Digitale Elektronik ATMEGA8 ms Timer


von Kevin (Gast)


Lesenswert?

hallo,

Atmega8
4MHz


Wie kann ich die Millisekunden drin zusetzen ?


1
int main() {
2
3
  
4
TCCR1B = (1<<CS12|1<<WGM12);
5
OCR1A = 15625-1;
6
TIMSK = 1<<OCIE1A;
7
sei();
8
9
10
while(1)
11
{
12
}
13
  
14
return 0;
15
  
16
}
17
18
19
ISR(TIMER1_COMPA_vect)
20
{
21
  Sekunden++;
22
  
23
  if(Sekunden == 60)
24
  {
25
    Sekunden = 0;
26
    Minuten++;
27
  }
28
  if(Minuten == 60)
29
  {
30
    Minuten = 0;
31
    Stunden++;
32
  }
33
  if(Stunden > 23)
34
  Stunden = 0;
35
  
36
}



danke im voraus

von ich (Gast)


Lesenswert?

??
Ich glaub du hast vergessen, dein Kontext nicht unserer ist.
MfG
ich

von Peter II (Gast)


Lesenswert?

Vorteiler auf 64 und bis 625 zählen.

von Oliver S. (oliverso)


Lesenswert?

Kevin schrieb:
> Wie kann ich die Millisekunden drin zusetzen ?

Nur mal rein interessehalber: Was für eine Sprache ist das, und wo 
spricht man die? Muß was exotisches sein, selbst Google übersetzer kann 
mit den Worten nix anfangen...

Oliver

von LostInMusic (Gast)


Lesenswert?

>Wie kann ich die Millisekunden drin zusetzen ?

Dunkel ist der Frage Sinn...

von Martin (Gast)


Lesenswert?

1
int main()
2
{
3
     //Interrupt für Timer1 für Zeitfunktionen
4
     TCCR1A =  (1<<WGM11);           //CTC Modus
5
     TCCR1B |= ((1<<CS12)|(1<<CS10));    //Prescaler 1024
6
     OCR1A = 4-1;                   //((4000000/1024)/1000) = ~4
7
  
8
     //Compare Interrupt erlauben
9
     TIMSK |= (1<<OCIE1A);
10
11
     sei();
12
  
13
     while(1)
14
     {
15
     }
16
  
17
     return 0; 
18
}
19
20
21
ISR(TIMER1_COMPA_vect)
22
{
23
  millisekunden++;
24
    
25
  if(millisekunden == 1000)
26
  {        
27
    sekunde++;
28
29
    millisekunden = 0;
30
    
31
        
32
    if(sekunde == 60)
33
    {
34
      minute++;
35
      sekunde = 0;
36
    }
37
    if(minute == 60)
38
    {
39
      stunde++;
40
      minute = 0;
41
    }
42
    if(stunde == 24)
43
    {
44
      wochentag++;
45
      stunde = 0;
46
    }
47
    if(wochentag == 7)
48
    {
49
      wochentag=0;
50
    }
51
  }
52
}

von LostInMusic (Gast)


Lesenswert?

>Vorteiler auf 64 und bis 625 zählen

Noch besser ist Vorteiler 8 und bis 500 zählen.

von Martin (Gast)


Lesenswert?

Stimmt ... dachte erst das das OCR1A Register 8 Bit lang ist, deswegen 
habe ich 1024 gewählt... Vorteiler 8 ist natürlich besser bei 16 Bit 
Register!

von Karl H. (kbuchegg)


Lesenswert?

Es kommt auch auf die Uhr an.

Benötigt man einen Kurzzeittimer, dann spielt die Genauigkeit meist 
nicht so die besondere Rolle. Ob der 10 Minuten Küchentimer in diesem 10 
Minuten um 0.2 Millisekunden falsch geht, ist meist unwichtig.

Interessanter sind lang laufende Uhren.
Und bei diesen gilt, dass man den Timer-Vorteiler sehr wahrscheinlich 
auf 1 setzen will.
Denn: Auch wenn auf dem Quarz drauf steht, er hätte 4 Mhz, so sind das 
keine 4.000000000 Mhz. Auch ein Quarz hat Abweichungen. Mit einem 
Vorteiler von 1024 kann man aber eine Quarzfrequenz von 4000078Hz nicht 
vernünftig ausgleichen. D.h. hier geht man auf Vorteiler 1 und gleicht 
den CTC_wert ab, so dass man eine möglichst gute, ganzzahlige Anzahl von 
ISR Aufrufen pro Sekunde hat, die auch noch einen ganzzahligen Bezug zu 
1 Sekunde bzw. Millisekunden hat. Es kann relativ knifflig sein, diese 
Forderungen unter einen Hut zu bringen, so dass die Uhr auch nach 2 
Monaten noch nicht allzuviel Zeit verloren oder gewonnen hat.

von Loocee L. (loocee)


Lesenswert?

Karl Heinz schrieb:
> Interessanter sind lang laufende Uhren.

Mit einem Prozessorquarz baut man keine Uhren.

von Mike (Gast)


Lesenswert?

Karl Heinz schrieb:
> Es kann relativ knifflig sein, diese
> Forderungen unter einen Hut zu bringen, so dass die Uhr auch nach 2
> Monaten noch nicht allzuviel Zeit verloren oder gewonnen hat.

Beitrag "Die genaue Sekunde / RTC"

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.