Forum: Mikrocontroller und Digitale Elektronik Uhrenquarz am Atmega 8 nur an TOSC1


von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Hallo!

Ich habe vor einer ganzen Weile mir eine Wordclock selbst gebaut. 
Schaltung selbst entworfen, Programm selbst geschrieben. Läuft alles 
soweit ganz gut. Nur ist mir ein ganz typischer Anfängerfehler 
unterlaufen. Ich nutze nur den internen Taktgenerator, was ich jetzt mit 
regelmäßig falsch gehender Uhr merke. Zuerst dachte ich, wenn ich 
ständig mit dem DCF77 Signal syncronisiere, wird das schon klappen, nur 
ist teilweise der Empfang des Signals nur in der Nacht ordentlich. Ich 
hätte also einen Uhrenquarz für den Timer2 einsetzen müssen. Ich habe 
allerdings jetzt das Problem, das an den beiden XTAL1 und 2 Pins Taster 
angeschlossen sind. Einen der beiden Pins würde ich frei bekommen, 
einfach einen Taster auf einen anderen Pin verbinden. Nur leider habe 
ich dann keine anderen Pins mehr frei. Ich hätte also nur XTAL1 zur 
Verfügung. Im Datenblatt des Atmega8 wird auf Seite 30 unten davon 
abgeraten, nur den XTAL1 Pin zu nutzen.

Jetzt ist natürlich meine Frage, ist es trotzdem möglich, das ich den 
XTAL1 für einen Uhrenquarz nutze und XTAL2 oder auch PB7 weiterhin als 
Tastereingang nutze?

Oder hat jemand noch eine ganz andere Idee, wie ich das Problem in den 
Griff bekommen könnte?


Vielen Dank schonmal im Voraus für eure Antworten


MfG Dennis

von Drobel (Gast)


Lesenswert?

Dennis H. schrieb:

> Oder hat jemand noch eine ganz andere Idee, wie ich das Problem in den
> Griff bekommen könnte?

Du kannst den Sekundentakt, der vom internen Oszillator abgeleitet wird, 
trimmen. Wie sieht deine Zeitroutine aus?

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Drobel schrieb:
> Du kannst den Sekundentakt, der vom internen Oszillator abgeleitet wird,
> trimmen. Wie sieht deine Zeitroutine aus?

Mh, ich verstehe dich nicht ganz, oder vielleicht auch du mich nicht. 
Das Problem ist, dass der interne Quarz, wenn er kalt ist, anders läuft, 
als wenn er eine Woche schon läuft. Ich kann also Software-seitig nicht 
wirklich etwas verändern.

Die Zeitroutine ist ganz simpel, es wird ein Interrupt ausgelöst, in dem 
in eine 16-bit Variable hochzähle, sozusagen habe ich aus meinem 8-bit 
Timer2 einen 16bit Timer gemacht. Und wenn diese 16-bit Variable mit 
meinem getesteten Wert übereinstimmt, wird wieder eine Sekunde höher 
gezählt. Getestet habe ich allerdings nur im Dauerbetrieb der Uhr. Das 
wird aber nicht ihr Anwendungsgebiet sein, da sie mit auf Messen soll, 
und dort macht es sich blöd, wenn die Uhr ständig falsch geht. Sie wird 
also mal für ein paar Tage angesteckt, und dann wieder mit nach hause 
genommen, zuhause wieder angesteckt, usw..

MfG Dennis

von Fred S. (kogitsune)


Lesenswert?

Zwei Überlegungen dazu:
Wenn einer der ADC Pins frei ist, kannst Du Deine **beiden** Schalter 
dort mit einem Spannungsteiler mit unterschiedlichen Widerstandswerten 
unterbringen. Nötig ist dann nur eine ADC-Abfrage und Zuordnung zu einem 
von 3 Werten (kein Schalter, Schalter 1, Schalter 2 betätigt).
Ob die zeitlichen Anforderungen Deines Gesamtprogramms mit einem 
Uhrenquarz erfüllt sind, musst Du mal überlegen. Evtl. wäre ein 
höherfrequenter Quarz geeigneter.

von Basti M. (counterfeiter)


Lesenswert?

Oder High Voltage Programming, dann bekommste den Reset bin noch frei...

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Fred S. schrieb:
> Deines Gesamtprogramms mit einem
> Uhrenquarz erfüllt sind, musst Du mal überlegen. Evtl. wäre ein
> höherfrequenter Quarz geeigneter.

Nein, das sicher nicht. Ich möchte den Uhrenquarz ja auch nur als 
Taktquelle für den Timer2. Der Rest der Schaltung kann ja weiterhin mit 
dem internen Takt laufen, das ist ja dann kein Problem. Nur die 
Zeitzählung muss genauer werden. Und das Datenblatt gibt an, das die 
externe Taktquelle für den Timer2 auch an den XTAL1 und 2 angeschlossen 
werden soll.

Basti M. schrieb:
> Oder High Voltage Programming, dann bekommste den Reset bin noch frei...

Dazu habe ich keinen Programmierer, extra dafür einen kaufen wäre mir 
dann doch etwas zu weit hergeholt.

Mir ist gerade selbst noch eine Idee gekommen. Wie wäre es, wenn ich 
einen Atmega88 nehme. Der ist ja ansich baugleich und Pinkompatibel. 
Dort könnte ich dann den Pin-Change Interrupt nutzen. Ist nur die Frage, 
wie bekomme ich den Uhrenquarz so verschalten, das er dafür geeignet 
ist. Also das er einen Eingang am Atmega treiben kann.

MfG Dennis

von Drobel (Gast)


Lesenswert?

Dennis H. schrieb:

> Mh, ich verstehe dich nicht ganz, oder vielleicht auch du mich nicht.
> Das Problem ist, dass der interne Quarz, wenn er kalt ist, anders läuft,
> als wenn er eine Woche schon läuft.

Skizze:

Angenommen du verwendest einen 1 MHz internen Takt und einen 16-Bit 
Timer.

Der Timer läuft nach 62.500 Takten (1/16 s nach internem Takt) über.

Die Überläufe werden in einer Variablen mitgezählt.

Etwa alle 24 Stunden kommt die präzise DCF-77 Zeit.

Aus dem Abstand der DCF-Telegramme, bzw. der übertragenen Zeit, kann die 
neue Anzahl der Takte bestimmt werden, die den Timer zum Überlauf 
bringt.
Bei einigen AVR-Controller ist eine Temperaturkompensation (z. B. 
ATTiny24A) möglich.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Drobel schrieb:
> Aus dem Abstand der DCF-Telegramme, bzw. der übertragenen Zeit, kann die
> neue Anzahl der Takte bestimmt werden, die den Timer zum Überlauf
> bringt.

Achso, also habe ich dich nicht richtig verstanden. Das klingt logisch. 
Nur muss ich mir dann auch merken, wie lange der letzte DCF Kontakt her 
ist, um eine genaue Abweichung hinzubekommen. Ich werd mal drüber 
nachdenken, sowas muss bei mir immer paar Stunden im Kopf reifen :-)


MfG Dennis

von Dietrich L. (dietrichl)


Lesenswert?

Noch eine Idee, inspiriert durch Drobels Vorschlag:

Takt eines Quarzgenerators mit langem Zähler runterteilen und als 
Referenz (z.B. 1 sec-Takt) an den freien Pin hängen. Damit den internen 
Zähler synchronisieren / korrigieren.

Gruß Dietrich

von Fred S. (kogitsune)


Lesenswert?

Dietrich L. schrieb:
> Takt eines Quarzgenerators mit langem Zähler runterteilen und als
> Referenz (z.B. 1 sec-Takt) an den freien Pin hängen. Damit den internen
> Zähler synchronisieren / korrigieren.
Z.B. mit einem zusätzlichen Attiny24, den Du mit einem Uhrenquarz laufen 
lassen kannst. Der Attiny24 kann dann den runtergeteilten Takt ausgeben.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Dietrich L. schrieb:
> Takt eines Quarzgenerators mit langem Zähler runterteilen und als
> Referenz (z.B. 1 sec-Takt) an den freien Pin hängen. Damit den internen
> Zähler synchronisieren / korrigieren.

Naja, so ähnlich meinte ich das mit dem Tausch gegen den Atmega88, da 
ich dort an meinem letzten freien Pin einfach den PIN-Change Interrupt 
nutzen kann. Nur habe ich keine Ahnung davon, wie ich den Quarz 
beschalten muss, das er einen Eingang eines Atmegas treiben kann, davon 
habe ich keine Ahnung.

MfG Dennis

von Karl H. (kbuchegg)


Lesenswert?

> Ich habe allerdings jetzt das Problem, das an den beiden XTAL1 und
> 2 Pins Taster angeschlossen sind. Einen der beiden Pins würde ich
> frei bekommen, einfach einen Taster auf einen anderen Pin verbinden.
> Nur leider habe ich dann keine anderen Pins mehr frei.

Was fehlt mir da jetzt?
Meiner Ansicht nach reicht das doch schon.
Nimm einen fertigen QUarzoszillator (zb 4Mhz oder 8Mhz) und takte den µC 
damit.

Einen Quarzoszillator (nicht: einen Quarz!) schliesst man mit lediglich 
einem Pin an den µC an. Damit hast du einen quarzstabilisierten µC-Takt, 
der die Uhr über den Tag bringt. Mehr brauchst du ja nicht. Und aus 
einem 8Mhz Quarztakt eine Uhr aufzubauen, die in ein paar Tagen nicht 
mehr als ein paar Sekunden abweicht, ist ja jetzt nicht wirklich das 
große Problem.

von Dietrich L. (dietrichl)


Lesenswert?

Dennis H. schrieb:
> Naja, so ähnlich meinte ich das mit dem Tausch gegen den Atmega88, da
> ich dort an meinem letzten freien Pin einfach den PIN-Change Interrupt
> nutzen kann. Nur habe ich keine Ahnung davon, wie ich den Quarz
> beschalten muss, das er einen Eingang eines Atmegas treiben kann, davon
> habe ich keine Ahnung.

Nicht einen Quarz beschalten, sondern einen fertigen Quarzoszillator 
nehmen. Der hat Versorgungsanschlüsse und einen Takt-Ausgang.

Für einen Pin-Change-Interrupt sind die Frequenzen der Quarzoszillatoren 
aber normalerweise zu hoch, daher der Teiler dahinter.

Gruß Dietrich

von Dietrich L. (dietrichl)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Einen Quarzoszillator (nicht: einen Quarz!) schliesst man mit lediglich
> einem Pin an den µC an.

In Datenblatt des ATmega8 steht allerdings bei "External Clock":
  XTAL1     EXTERNAL CLOCK SIGNAL
  XTAL2     NC

Also wird XTAL2 (vermutlich) nicht als Eingang verwendet werden dürfen.

Gruß Dietrich

von Fred S. (kogitsune)


Lesenswert?

Was spricht gegen die ADC-Lösung, um die beiden Pins frei zu bekommen? 
Ist kein ADC-Eingang mehr frei oder freizubekommen?

von Karl H. (kbuchegg)


Lesenswert?

Dietrich L. schrieb:
> Karl Heinz Buchegger schrieb:
>> Einen Quarzoszillator (nicht: einen Quarz!) schliesst man mit lediglich
>> einem Pin an den µC an.
>
> In Datenblatt des ATmega8 steht allerdings bei "External Clock":
>   XTAL1     EXTERNAL CLOCK SIGNAL
>   XTAL2     NC
>
> Also wird XTAL2 (vermutlich) nicht als Eingang verwendet werden dürfen.

Hab ein wenig gegoogelt.
Scheint so als ob du recht hast.
Wieder was gelernt.

von Quack & Salb (Gast)


Lesenswert?

Der Uhrenquez muss leider an Timer 2 laufen.

Es gibt auch noch die Loesung mit dem internen RC Oszillator wenn die 
Spannung und die Temperatur hinreichend stabil ist. Wenn dann wieder ein 
DCF77 signal erhaeltlich ist, die Differenz abspeichern und eine RC-Osc- 
Korrektur errechnen. Das waer dann ein gesampelter PLL.

Der Mega8 ist uebrigen in den meisten Faellen die falsche Wahl. Denn die 
20 cents, die man gegenueber einem Groesseren spart sind beim ersten 
Aerger aufgrund der Limitationen 1000 fach draussen. Ich wuerd nie was 
unterhalb einem 32k AVR machen.

von Fred S. (kogitsune)


Lesenswert?

Vermutlich (?) hast Du die PDIP Version des ATmega8. Dann könntest Du 
Dir einen TQFP=>PDIP Adapter bauen und die beiden zusätzlichen 
ADC-Eingänge des TQFP-ATmega8 für Deine Schalter nutzen, wenn die o.g. 
Variante "2 Schalter an einem ADC Eingang" nicht machbar ist, weil kein 
ADC Eingang frei ist.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Erstmal vielen dank für die zahlreichen antworten.

Das ich den xtal2 gar nicht nutzen kann, wenn ich xtal1 als taktquelle 
nutze, wusste ich auch nicht, ich hab nur den Hinweis im datenblatt 
gelesen, das es nicht empfohlen wird. Die Schaltung so zu ändern, das 
ich die Taster über adc einlese ist großer Aufwand, es ist zur Zeit nur 
pb1 frei, welcher kein adc Eingang ist. Ich halte irgendwie immer noch 
an dem Pin change interrupt fest. Wäre eine einfache Lösung auf 
lochraster aufzubauen und funktioniert beim atmega88 an fast jedem Pin. 
Ein quarzosszillator klingt ja schonmal gut, nur die relativ hohe 
impulsfolge muss für den Pin change nicht unbedingt sein. Gibts nicht 
einen billigen einfachen frequenzteiler ic, der durch acht oder 32 oder 
sowas teilt? Das wäre vielleicht die kostengunstigste und auch am besten 
umsetzbare Idee, weil ich da auf der vorhandenen leiterplatte nix weiter 
ändern muss.

Mfg Dennis

von Fred S. (kogitsune)


Lesenswert?

Dennis H. schrieb:
> Gibts nicht einen billigen einfachen frequenzteiler ic, der durch acht oder 32 
oder sowas teilt?
Wie schon gesagt, ich würde einen Attiny dafür einsetzen. Wenn Du die 
Grundfrequenz mit einem Uhrenquarz erzeugen willst, dann z.B. Attiny24 
(weiß nicht auswendig, welcher andere Tiny auch die Möglichkeit bietet, 
einen solchen einzusetzen), wenn Du einen höherfrequenten Quarz 
verwendest, geht auch ein 8-Beiner, z.B. Attiny15. Damit kannst Du ein 
beliebiges Teilerverhältnis programmieren.

von Dietrich L. (dietrichl)


Lesenswert?

Dennis H. schrieb:
> Gibts nicht
> einen billigen einfachen frequenzteiler ic, der durch acht oder 32 oder
> sowas teilt?

Ja, haufenweise. Schau doch mal bei der 74HCxxx-Serie.
Beispiele: 74HC4020, 74HC4024, 74HC4040, 74HC4060, ....
Beim 74HC4060 kannst Du bei geeigneter Quarzfrequenz auch bis genau 1Hz 
runterteilen.

Gruß Dietrich

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Hallo!

Ich versuche gerade, die mir genannten Lösungen umzusetzen und irgendwie 
scheitere ich ziemlich daran.

Das Problem ist, das es keine Uhrenquarz-Oszillatoren gibt, es gibt 
irgendwie nur Quarze. Einen einfachen Quarz kann ich aber nicht an so 
einen 74HC4060 schalten. Darum war meine Idee, nehm ich einfach einen 
kleinen Attiny. Z.B. Attiny13, weil ich diesen noch in der Bastelkiste 
habe. Bei diesem kann ich den Timer mit einer externen Quelle am T0-Pin 
takten. Aber da wird mein einfacher Quarz auch wieder nicht reichen weil 
der Attiny da sicher auch einen Oszillator haben möchte.

Gibt es irgendwo einen Oszillator mit den üblichen 32,768khz?

Ich habe bei meiner Suche ein gutes PDF verlinkt von Falk Brunner 
gefunden.

http://www.mikrocontroller.net/attachment/24538/AN299.pdf

Soweit so gut, aber es scheint ja deutlich auf das Layout anzukommen. 
Ich würde aber ungern extra dafür eine Leiterplatte bestellen wollen, 
ich würde es gern auf Lochraster machen.

Wäre vielleicht auch ein Oszillator mit 4,194304MHz möglich? Den könnte 
ich dann als Systemtakt für den Attiny13 nehmen, ist nur die Frage, ob 
sowas dann auch noch so genau ist, wie ein Uhrenquarz.


MfG Dennis

von Walter S. (avatar)


Lesenswert?

Dennis H. schrieb:
> Aber da wird mein einfacher Quarz auch wieder nicht reichen weil
> der Attiny da sicher auch einen Oszillator haben möchte.

Tiny13 weiß ich nicht und mag nicht im Datenblatt nachschauen (das wäre 
eigentlich deine Aufgabe), aber an Tiny25 kannst du einen Quarz 
anschließen

von dolf (Gast)


Lesenswert?

Dennis H. schrieb:
> 4,194304MHz möglich?

das ist auch ein uhrenquarz (2^22)

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Walter S. schrieb:
> Tiny13 weiß ich nicht und mag nicht im Datenblatt nachschauen (das wäre
> eigentlich deine Aufgabe), aber an Tiny25 kannst du einen Quarz
> anschließen

Ist richtig, das es meine Aufgabe wäre, nur weis ich nicht so richtig, 
unter welchem Punkt ich da suchen muss. Unter Clock Options steht nur, 
welche Fuses ich einstellen muss. Aber ich würde mal denken, da es nur 
einen Pin dafür gibt, das der Attiny13 nur einen Oszillator haben 
möchte, zumindest als Systemtakt. Wenn ich den Timer einen extra Takt 
geben möchte, die Möglichkeit bietet mir der Attiny13 finde ich gar 
keine Infos über die Taktquelle, aber auch hier ist nur ein Pin, der zur 
Verfügung gestellt wird, somit denke ich auch hier, das nur ein 
Oszillator angeschlossen werden kann.

dolf schrieb:
> das ist auch ein uhrenquarz (2^22)

Genau deswegen habe ich den ja gewählt, nur ist eben die Frage nach der 
Genauigkeit.

Ich habe auch gerade versucht, bei Maxim einen DS32KHz als Sample zu 
ordern, nur leider wollen die eine Firmen-Mailadresse, die ich nicht 
bieten kann. Mist. Das wäre ein Uhrenquarz Oszillator. Und irgendwie nur 
bei Mouser zu bestellen und da ganz schön teuer. Deswegen wäre Sample 
gut, aber die wollen nicht.


MfG Dennis

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.