Forum: Mikrocontroller und Digitale Elektronik Wie ungenau ist der interne Quarz


von Unlucky2012 (Gast)


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!

von spess53 (Gast)


Lesenswert?

Hi

>Dabei habe ich jetzt festgestellt, dass der interne Quarz
>wohl ziemlich ungenau sein muss.

Gibt es nicht. Das ist ein RC-Oszillator.

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

Ja.

MfG Spess

von (prx) A. K. (prx)


Lesenswert?

Unlucky2012 schrieb:

> Dabei habe ich jetzt festgestellt, dass der interne Quarz
> wohl ziemlich ungenau sein muss.

Kein Wunder. Es gibt nämlich keinen internen Quarz.

von Cyblord -. (cyblord)


Lesenswert?

Unlucky2012 schrieb:

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

Im Datenblatt steht was zur Genauigkeit des internen Oszillators. Nimm 
den Worst-Case Fall und RECHNE NACH.
Kommt mir allerdings auch etwas sehr viel vor.

gruß cyblord

von Peter II (Gast)


Lesenswert?

teste den code doch mal im Simulator - wenn dort der sekundentakt exact 
stimmt dann weist du das es nicht an der Software liegt.

von Peter D. (peda)


Lesenswert?

Unlucky2012 schrieb:
> Dabei habe ich jetzt festgestellt, dass der interne Quarz
> wohl ziemlich ungenau sein muss.

Kein Wunder, der existiert ja nichtmal.
Quarze lassen sich nicht integrieren.

Ansonsten sagt Dir:
Table 28-1. Calibration Accuracy of Internal RC Oscillator
etwas von 10%
1/60 = 1,7% liegt also voll im Rahmen.


Peter

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


Lesenswert?

Peter Dannegger schrieb:
> 1/60 = 1,7% liegt also voll im Rahmen.

Meist sind sie sogar etwas besser, aber er schreibt ja auch "fast
eine Sekunde", also wohl eher ein Fehler von 1 %, und das ist
voll im grünen Bereich.  Für eine RS-232 reicht es noch (die
toleriert 2 % Fehler), für viel mehr halt nicht.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Nana, für RS232 reichts eben NICHT.
Weil auch mehr Fehler kommen kann, auch je nach Temperatur.

von Andreas D. (rackandboneman)


Lesenswert?

Doch. Im Endeffekt ist in dem RC-Oszillator eine Menge Quarz, das ist 
doch ein CMOS-IC :)

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


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.

von Christian F. (cmf) Benutzerseite


Lesenswert?

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

Das kommt immer drauf an. Bei mir geht es sowohl im Keller als auch im 
25° Zimmer nur bis 9800 baud. Alles drüber ist nur Müll.

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


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.

von tt2t (Gast)


Lesenswert?

> Quarze lassen sich nicht integrieren.

Doch, siehe DS3231

von Osche R. (Gast)


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.

von Wolfgang (Gast)


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.

von Naseweis (Gast)


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!

von Osche R. (Gast)


Lesenswert?

Wobei der Chip ja aus Silizium ist. Man muss also nur den Wafer in 
BT-Richung sägen ;-)

von Udo S. (urschmitt)


Lesenswert?

om pf schrieb:
> Wobei der Chip ja aus Silizium ist. Man muss also nur den Wafer in
> BT-Richung sägen ;-)
<Erbsenzählmodus>
Nicht ganz. Ein Quarz ist aus SiO2, der Chip (undotiert) aus 
einkristallinem Silizium.
</Erbsenzählmodus>

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


Lesenswert?

Udo Schmitt schrieb:
> Ein Quarz ist aus SiO2

Übrigens auch aus einkristallinem, also zumindest beim Schwingquarz.

von Udo S. (urschmitt)


Lesenswert?

Jörg Wunsch schrieb:
> Übrigens auch aus einkristallinem, also zumindest beim Schwingquarz.
Richtig, das war jetzt aber auch Erbsenzählmodus.
ich habe ja nicht Quarzsand geschrieben :-)

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.