Pfad: Home => AVR-Übersicht => Anwendungen => ATtiny mit Quarzen takten   This page in English: Flag EN Logo
Tiny XTAL oscillator Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Einen ATtiny mit einem Quarz takten

ATtiny mit Quarz

Eine einfache Aufgabe: ein ATtiny soll statt mit dem internen ungenauen RC-Oszillator mit einem externen Quarz getaktet werden. Eigentlich eine einfache Aufgabe. Aber dabei gibt es viele Hürden und Dinge, die man falsch machen kann oder die nicht funktionieren. Daher hier einige Hinweise, wie man es macht.

CMOS-Version des Quarzteilers Und so sähe so ein Quarzteiler für einen 15 MHz-Quarz durch 68 in der CMOS-Ausführung aus: Insgesamt wären hier drei 14-polige ICs nötig und insgesamt 42 Anschlüsse zu verdrahten.

Dagegen passt die Version mit einem ATtiny25-Mikrocontroller in ein einziges achtpoliges IC, bei dem nur ganze sieben Pins zu verdrahten sind. Der ganze Rest steckt in den Prozessorinnereien, die mit ein paar lumpigen Zeilen Programm dazu gebracht wird, die gesamte Aufgabe zu erledigen.

1 Einen quarzgenauen Rechteckgenerator bauen

Aufgabenstellung ist es, einen quarzgenauen Taktgenerator zu bauen. Das geht im Prinzip ganz einfach:
  1. Den ATtiny mit einem Quarz takten.
  2. Den internen Timer/Counter in den CTC-Modus (Clear Timer on Compare) bringen).
  3. In das Vergleichsregister des Timers (bei einem 8-Bit-Timer: Compare A, bei einem 16-Bit-Timer entweder in Compare A oder in das Interrupt Capture Register ICR) einen Vergleichswert schreiben.
  4. Die Ausgänge OCnA und/oder OCnB beim Compare Match torkeln lassen.
  5. Die Ausgänge OCnA und/oder OCnB als Ausgänge einstellen.
Und schon ist der schöne Rechteckgenerator fertig.

Damit lassen sich aus einem Quarz ganz famose Frequenzen zaubern. Und alles sehr flexibel. Mit dem OpenOffice-Rechensheet hier lässt sich für alle handelsüblichen Quarze Zellen mit "-" kennzeichnen unmögliche Kombinationen.

Enthält die Zelle E6 bzw. J6 0,00, dann ist mindestens ein Quarz in der Lage, genau diese Frequenz zu erzeugen. Welcher das ist, kann man an den grün eingefärbten Deltas in den Spalten E bzw. J sehen. Quarze, die weniger als 0,1% vom Sollwert abweichen, sind gelb hinterlegt.

Man beachte noch, dass der CTC-Div-Wert um Eins verringert werden muss, bevor er in das oder die Compare-Register geschrieben werden kann.

2 Die Hardware

Schaltbild des Quarzteilers Das ist schon die ganze Hardware. Die zwei Keramikkondensatoren von 18 pF sind zum Anschwingen des Oszillators zwingend.

Das Ausgangssignal kann an PB0 (OC0A) und, wenn das so gewünscht und programmiert ist, an PB1 (OC0B) entnommen werden. Beide können auch gegenphasig sein oder gegenseitig verschoben sein.

Noch ein Hinweis zum Ziehen des Quarzes mit einem Trimmer. Das funktioniert am XTAL1-Eingang. Aber nicht zu viel erwarten, es können nur wenige kHz gezogen werden, und zwar nach oben. Und: nicht zu viel, dann startet der Quarzoszillator beim Anlegen der Betriebsspannung nicht.

3 Umstellung der Fuses

Damit der ATtiny mit dem externen Quarz als Taktgeber arbeitet, müssen die folgenden Fuses verstellt werden:
  1. CLKDIV8 muss ausgeschaltet werden, es sei denn man möchte mit einem Achtel des Quarztaktes den Takt antreiben.
  2. CLKSEL muss entweder auf einen Low-Speed-Quarz (z. B. mit 32,768 kHz) gesetzt oder man wählt einen passenden externen Quarztakt als Quelle aus. Lass Dich von den fehlenden Auswahlmöglichkeiten im Studio nicht zu der Annahme verleiten, der tiny könne nur mit Low-Speed-Quarzen arbeiten (ich bin da schon drauf reingefallen!).
Achtung bei 32,768 kHz-Quarzen. Nach der Umstellung kann man den Tiny nur noch mit weniger als 8 kHz über ISP ansprechen. Hat man die CLKDIV8-Fuse versehentlich eingeschaltet, nur noch mit weniger als 1 kHz. AVRISP-MkII-Clones können das, STK500-Clones nicht! Das Studio weigert sich übrigens auch, Flash oder EEPROM mit weniger als 5 kHz zu programmieren. Man kann da also in eine üble Falle laufen, aus der nur noch das STK500 mit Parallel-HV-Programmierung heraushilft, um den Chip noch anzusprechen!

4 Aus Rechtecken Sinusse machen

Wenn man keine Rechtecke braucht sondern einen schönen Sinus, dann schlägt die Stunde der RC-Netzwerke, denn dann müssen die Oberwellen aus dem Rechtecksignal herausgefiltert werden.

Einstufiges RC-Filter 1 Hz nach 100k/3u3-Filter Solche RC-Filter, hier ein einstufiges, dämpfen hohe Frequenzen. Ihre Amplitude nimmt umso stärker ab umso höher die Frequenz wird. Hier ist R=100kΩ und C=3µF. Die erste Harmonische bei der Rechteckspannung hat die dreifache Frequenz der Grundschwingung: sie wird schon ein wenig gedämpft. Rechts is das Ergebnis zu sehen.

Das sieht noch nicht nach Sinus aus, aber ein Rechteck ist es auch nicht mehr.

1 Hz nach zweistufigem 100k/3u3-Filter Wenn wir den Aufwand etwas erhöhen und einen weiteren Widerstand und Kondensator der gleichen Größe investieren, dann sieht dessen Ausgang schon etwas besser nach Sinus aus.

1 Hz nach dreistufigem 100k/3u3-Filter Und hier noch eine weitere Stufe danach: in rot die Spannung am zweiten Kondensator, in grün die am dritten. An dem grünen gibt es nun gar nichts mehr zu mäkeln.

Bemerkenswert ist, dass wir mit jeder weiteren RC-Stufe Amplitude einbüßen: hier geht die Amplitude von 0,79 Vpp auf 0,32 Vpp zurück, also etwa um den Faktor 2.

Vierstufiges RC-Filter 1 Hz nach vierstufigem 100k/3u3-Filter Das ist das Ganze mit vier Stufen im Überblick.

1 Hz nach 100k/1u-Filter Wer mehr Amplitude braucht, nimmt einen kleineren Kondensator, hier einer mit 1 µF.

RC-Simulations-Software nach dem Start Wer mit diversen Einstellungen (Anzahl RC-Stufen, Widerstände und Kondensatoren, etc. herumspielen möchte, kann das mit meiner Lazarus-Software, die es für Win64 als ausführbare Datei hier (gepackt) gibt. Startet man die, sieht sie so aus.
RC-Simulations-Software nach dem Start Wählt man aus den beiden Auswahlfeldern links unten eine RC-Kombination aus, dann wird diese gerechnet und dargestellt. Mit dem Auswahlfeld N kann die Anzahl der RC-Stufen eingestellt werden. Klickt man auf die farbigen RC-Felder kann man die Farbe der jeweiligen Kurve verstellen. Wählt man weiß aus, wird die Kurve nicht gezeichnet.

Aendern der angezeigten Anfangszeit Fast alle Parameter lassen sich verstellen. Klickt man in ein Eingabefeld, dann wird dieses gelb dargestellt. Ist man mit der Eingabe fertig, drückt man die Enter-Taste und der Parameter wird übernommen. Bei Fehlern wird das Eingabefeld rot gefärbt.

1 Hz gezoomt So kann man sich mit Verstellen der Spannung und der Zeit beliebige Details anzeigen lassen.

Klickt man in den Anzeigebereich, kann man die angezeigten Bilder als PNG- oder Bitmap-Grafik abspeichern.

5 Software und Downloads

Die Software gibt es im Assemblerformat hier zum Download. Das Listing gibt es weiter unten.

Zusätzlich gibt es noch folgenden OpenOffice-Dokumente zum Download: Der Quellcode:

;
; *********************************
; * Xtal oscillator with ATtiny25 *
; * (C)2019 by DG4FAC             *
; *********************************
;
.nolist
.include "tn25def.inc" ; Define device ATtiny25
.list
;
; **********************************
;         H A R D W A R E
; **********************************
;
; Device: ATtiny25, Package: 8-pin-PDIP_SOIC
;
;            _________
;         1 /         |8
; RESET o--|RESET  VCC|--o +5 V
; XTAL1 o--|PB3    PB2|--o
; XTAL2 o--|PB4    PB1|--o Osc out 2
;   0 V o--|GND    PB0|--o Osc out 1
;         4|__________|5
;
;
; **********************************
;  A D J U S T A B L E   C O N S T
; **********************************
;
.equ clock = 15000000 ; 15 MHz, your xtal frequency
.equ fOut = 100 ; Your desired frequency
.equ cClkPresc = 1 ; Your clock prescaler value 
.equ cUseOC0B = 1 ; Use OC0B as reverse output
;
; **********************************
;   F I X E D   C O N S T A N T S
; **********************************
;
; Derive prescaler value from clock and frequency
.if (clock/fOut/cClkPresc/2)<=256
  .equ cPresc=1
  .equ cCsPresc=1
  .else
  .if (clock/fOut/cClkPresc/2/8)<=256
    .equ cPresc=8
    .equ cCsPresc=2
    .else
    .if (clock/fOut/cClkPresc/2/64)<=256
      .equ cPresc=64
      .equ cCsPresc=3
      .else
      .if (clock/fOut/cClkPresc/2/256)<=256
        .equ cPresc=256
        .equ cCsPresc=4
        .else
        .if (clock/fOut/cClkPresc/2/1024)>256
          .error "Desired frequency too low!"
          .else
          .equ cPresc=1024
          .equ cCsPresc=5
          .endif
        .endif
      .endif
    .endif
  .endif
;
; Derive divider and compare value
.equ divider = (((((clock+fout/2)/fOut+cClkPresc/2)/cClkPresc+cPresc/2)/cPresc)+1)/2
.equ cCtc = divider - 1 ; CTC value
;
; **********************************
;        R E G I S T E R S
; **********************************
;
.def rmp = R16 ; Multipurpose register
;
; **********************************
;  M A I N   P R O G R A M   I N I T
; **********************************
;
.cseg
.org 000000
;
Main:
  sbi DDRB,DDB0 ; PB0 direction output
  cbi PORTB,PORTB0 ; Clear OC0A output
  ldi rmp,cCtc ; Write CTC value
  out OCR0A,rmp ; to compare register A
  .if cUseOC0B == 1
    sbi DDRB,DDB1 ; PB1 direction output
    sbi PORTB,PORTB1 ; Set OC0B output
    out OCR0B,rmp ; and B
    ldi rmp,(1<<WGM01)|(1<<COM0A0)|(1<<COM0B0) ; CTC mode, toggle OC0A and OC0B
    .else
    ldi rmp,(1<<WGM01)|(1<<COM0A0) ; CTC mode, toggle OC0A
    .endif
  out TCCR0A,rmp ; in TC0 control port A
  ldi rmp,cCsPresc ; Prescaler setting
  out TCCR0B,rmp ; in TC0 control port B
  ldi rmp,1<<SE ; Sleep enable, idle mode
  out MCUCR,rmp
Loop:
  sleep ; Go to sleep
  rjmp loop
;
; End of source code                

15MHz-Quarz macht 100 Hz Das ist ein Standardlauf mit der beschriebenen Software.


©2019-2020 by http://www.avr-asm-tutorial.net