Wie ungenau ist der interne Quarz

Gast #2688636
Lesenswert?

Hi,

ich arbeite mich gerade in die Mikrocontroller ein. Zur Zeit versuche 
ich mich gerade an einer Uhr, welche sich mittels DCF77 selbst 
syncronisiert. Dabei habe ich jetzt festgestellt, dass der interne Quarz 
wohl ziemlich ungenau sein muss.

Ich arbeite mit einem ATmega88 (mit gesetztem CKDIV8 Fuse), d.h. 
effektiv arbeitet mein Controller mit 1 MHz. Nun würde ich gerne im 
Sekundentakt eine Variable hochzählen (und abhängig davon dann die 
Minuten und Stunden).

Mein Code hierfür sieht wie folgt aus:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <stdio.h>
4

5
#include <string.h>
6
#include <stdlib.h>
7
#include <stdbool.h>
8

9
#include "lcd.h"
10

11
volatile uint8_t seconds;
12
volatile uint8_t minutes;
13
volatile uint8_t hours;
14

15
volatile bool updateLCD;
16

17
int main() {
18

19
  TCCR1B = _BV(WGM12) | _BV(CS10); // CTC, Prescale = 1
20

21
  OCR1A = (F_CPU / 100) - 1; // 100 Hz
22
  TIMSK1 = _BV(OCIE1A);
23

24
  sei();
25

26
  lcd_init(LCD_DISP_ON);
27

28
  char buffer[17];
29
  updateLCD = true;
30

31
  while(1) {
32

33
    if (updateLCD) {
34

35
      sprintf(buffer, "%02u:%02u:%02u MESZ\n", hours, minutes, seconds);
36

37
      lcd_puts(buffer);
38
      lcd_puts("MO 00.00.0000\n");
39

40
      updateLCD = false;
41

42
    }
43

44
  }
45

46
}
47

48
ISR(TIMER1_COMPA_vect) {
49

50
  static uint8_t counter;
51

52
  counter++;
53

54
  if(counter != 100) {
55

56
    return;
57

58
  }
59

60
  seconds++;
61
  counter = 0;
62

63
  if(seconds == 60) {
64

65
    seconds = 0;
66
    minutes++;
67

68
  }
69

70
  if (minutes == 60) {
71

72
    minutes = 0;
73
    hours++;
74

75
  }
76

77
  if (hours == 24) {
78

79
    hours = 0;
80

81
  }
82

83
  updateLCD = true;
84

85
}

Mir ist klar, dass sprintf() recht anspruchsvoll ist (Anzahl der Zyklen 
und Programmspeicher). Das soll aber zunächst keine Rolle spielen.

Jedenfalls kann ich einen Drift von fast einer Sekunde pro Minute 
feststellen. Das erscheint mir in Anbetracht der Tatsache, dass ich im 
CTC Modus arbeite, fast ein wenig viel.

Mache ich hier irgendetwas falsch, oder kann der interne Oszillator 
wirklich so ungenau sein?

Vielen Dank im Voraus!
Moderator Persönliche Seite #2688736
Lesenswert?

Martin Wende schrieb:
> Nana, für RS232 reichts eben NICHT.

Es reicht nicht garantiert, aber in der Praxis (zumindest unter
Bürobedingungen, also T = 25 °C ±5 K, Vcc = Vcc[nenn] ± 10 %)
trotzdem.  Also sich für ein Produkt drauf verlassen kann man
nicht, sich aber per RS-232 schnell eine Debugausgabe zimmern,
ohne sich weiter Gedanken drum machen zu müssen, klappt hingegen.
Moderator Persönliche Seite #2688895
Lesenswert?

Christian F. schrieb:
> nur bis 9800 baud

Die Baudrate selbst ist eigentlich egal, entscheidend ist ja nur
der relative Fehler.  Allerdings ergeben sich für bestimmte
Baudraten bei den üblichen "glatten" Megahertz-Taktfrequenzen
mehr oder minder große systematische Fehler (durch die endliche
Granularität des Teilerfaktors), die sich natürlich zu den
zufälligen Fehlern (initialer Offset + Schwankung der Taktfrequenz)
addieren.  Sofern die UART der Gegenseite es kann, würden daher
(bei 8 MHz Takt) bspw. 1 Mbit/s sicherer funktionieren als 9600 bit/s.

Abhilfe wäre es, den RC-Oszillator auf eine "baudratenfreundliche"
Frequenz zu ziehen.  7,37 MHz werden daher auch als Ziehbereich nach
unten (für den 8-MHz-Oszillator) per Datenblatt garantiert.
Gast #2689028
Lesenswert?

Jörg Wunsch schrieb:

> Abhilfe wäre es, den RC-Oszillator auf eine "baudratenfreundliche"
> Frequenz zu ziehen.  7,37 MHz werden daher auch als Ziehbereich nach
> unten (für den 8-MHz-Oszillator) per Datenblatt garantiert.

Und wenn's noch genauer sein soll, kann man auch nachkalibrieren.

Dazu guckst Du Dir über den Portpin ein paar RS-232-Telegramme an und 
bestimmt die kürzeste Low-Phase. Das ist dann ein bit. Die Soll-Länge 
ist bekannt, die Ist-Länge hast Du gerade gemessen. Entprechend der 
Abweichung wird dann das OSCCAL-Register angepasst. Das Ganze erfolgt am 
besten als Regelung, d.h. nur wenig verstellen und dafür regelmässig.
Gast #2689349
Lesenswert?

Christian F. schrieb:
> Martin Wende schrieb:> Nana, für RS232 reichts eben NICHT.Das kommt immer drauf 
an. Bei mir geht es sowohl im Keller als auch im25° Zimmer nur bis 9800 baud. 
Alles drüber ist nur Müll.

Wenn das von der Schnittstellengeschwindigkeit abhängt, hast du noch ein 
Problem mit schlechter Signalform. Ob du versuchst ein 300 Bd Signal 60% 
vor Bitmitte abzutasten oder ein 115kBd Signal ist egal.
Gast #2689846
Lesenswert?

tt2t schrieb:
>> Quarze lassen sich nicht integrieren.
>
> Doch, siehe DS3231

Hi,
"integrieren" läßt sich unterschiedlich interpretieren.
Integriert im Gehäuse gibt es schon seit Ewigkeiten, auch und besonders 
von Dallas/Maxim.
Integriert auf dem Chip, also monolithisch, ist dagegen, meines Wissens, 
kommerziell noch nicht realisiert worden.
Beim DS3231 ist es die erste Variante!

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