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

Quarzfrequenzoszillator und Teiler mit ATtiny25

Dies hier beschreibt einen mit einem Quarz angetriebenen ATtiny25-Controller, der die Quarzfrequenz durch eine einstellbare Konstante teilt. Die Konstante kann entweder eingestellt werden.

Die Zeichnungen auf dieser Seite sind in der LibreOffice-Draw-Datei hier, die Berechnungen sind in der LibreOffice-Calc-Datei hier verfügbar.

Quarzteiler mit einem Mäuseklavier

Quarzteiler-Schaltbild mit Maeuseklavier Das ist schon alles was es braucht:
  1. Die vier Schalter eines Mäuseklaviers erzeugen eine von 16 möglichen Spannungen, die mittels des AD-Wandler-Einganges ADC1 vom ATtiny25 gemessen werden.
  2. Der Quarz X taktet den ATtiny25, wenn seine Fuses auf den externen Quarz umgestellt sind.
  3. Die Quarzfrequenz wird durch den ausgewählten TC0-Vorteiler, durch den ausgewählten CTC-Vergleichswert und durch den ausgewählten Softwareteiler geteilt, was die Ausgangsfrequenz bestimmt.
  4. Das Ausgangssignal treibt den PB0-Pin, sein invertierter Wert den Pin PB1 an.
  5. Der Controller kann mittels der ISP6-Schnittstelle programmiert werden.

Zwei-Teiler mit dem Mäuseklavier

Als Beispiel wird ein 2,097152 MHz-Quarz durch 16 Teiler von zwischen 1.048.576 und herab bis 32 geteilt. Das ergibt Ausgangsfrequenzen von 1 Hz, 2 Hz und, jeweils mit dem Faktor 2N, höhere Frequenzen bis zu 32,768 kHz. Für diese 16 Kombinationen wurde das Rechenblatt "Zweiteiler" in der LibreOffice-Calc-Datei hier entwickelt.

Die moeglichen Teiler Hier sind alle möglichen Teiler, mit denen die Quarzfrequenz geteilt werden kann, versammelt. Das Minimum ist zwei, was bei einem 2,097152 MHz-Quarz einer Frequenz von 1.048.576 Hz entspräche. Aber das geht nun rein gar nicht, denn jeder Interrupt braucht maximal 22 Taktzyklen, damit er ablaufen kann. Das bedingt einen Mindestwert von 25 beim CTC-Compare-Teiler-Wert, damit auch der ADC-Interrupt und dessen Auswertung noch ein wenig Zeit abkriegt. Das begrenzt die Spitzenfrequenz auf einen Teiler von 50, die Maximalfrequenz mit einem 2,097152 MHz-Quarz liegt also bei 41,9 kHz. Wenn Du es höher brauchst, musste einen schnelleren Quarz nehmen.

Die maximale Teilerrate liegt bei 1024 * 256 * 256 * 2 = 134.217.728, was zu einer Frequenz von 0,015625 Hz oder 64 Sekunden pro Puls führt.

Diese 16 verschiedenen Kombinationen von Vorteilerwerten, CTC-Vergleichswerten und Software-Teilerwerten mit Werten zwischen 25 und 220 erzeugen eine Tabelle mit dem folgenden Inhalt. Bitte beachten, dass das Dummy-Byte 0 hinzugefügt wurde, damit die Zeile eine geradzahligen Anzahl Bytes kriegt, damit sie in das Wort-strukturierte Flash-Memory des Controllers reinpasst.

CodeTable: ; 1=CS0x, 2=comp, 3=soft divider, 4=dummyDIP-Swf(eff) Hz
.db (1<<CS02)|(1<<CS00),255,4,001
.db (1<<CS02)|(1<<CS00),255,2,012
.db (1<<CS02)|(1<<CS00),255,1,024
.db (1<<CS02)|(1<<CS00),127,1,038
.db (1<<CS02)|(1<<CS00),63,1,0416
.db 1<<CS02,127,1,0532
.db 1<<CS02,63,1,0664
.db (1<<CS01)|(1<<CS00),127,1,07128
.db (1<<CS01)|(1<<CS00),63,1,08256
.db 1<<CS01,255,1,09512
.db 1<<CS01,127,1,0101.024
.db 1<<CS01,63,1,0112.048
.db 1<<CS00,255,1,0124.096
.db 1<<CS00,127,1,0138.192
.db 1<<CS00,63,1,01416.384
.db 1<<CS00,31,1,01532.768


Natürlich kannst Du die Code-Tabelle auch mit anderen Daten befüllen, die dann mit den 16 Werten auch andere Frequenzen erzeugen. Bei Änderungen aber stets aufpassen, dass bei einem CS0x von 1 ein Minimum von 25, bei CS0x=2 ein Minimum von 4 für das CTC-Compare übrigbleibt, sonst verheddert sich die ISR. Bei höheren Vorteilerwerten gibt es kein Limit.

Die Mäuseklavier-Spannungen

Die Berechnungstabelle "MäuseKlavier" in der LibreOffice-Calc-Datei hier erlaubt das Herumspielen mit Widerständen am Mäuseklavier. Alle Messungen erfolgen mit 10-Bit-Auflösung und 64 Messungen werden zu einer 16-Bit-Summe aufaddiert.

Wie man an der Tabelle sieht, sind alle oberen Toleranzwerte unterhalb der unteren Toleranzwerte der nächsten Zeile. Wenn Du Widerstände änderst und wenn dann Überlappungen auftreten, werden die überlappenden Werte rot.

Die Umwandlung der ADC-Summenwerte in Einträge der CodeTable geht so:
  1. Z zeigt auf den Beginn der ADC-Tabelle.
  2. X zeigt auf den Beginn der CodeTable.
  3. Vergleichen der ADC-Summe mit dem LSB und MSB der ADC-Tabelle. Wenn dabei das Carry gesetzt wird (ADC-Summe niedriger als der Tabellentrag), wird die ganze Umwandlung abgebrochen.
  4. Wenn nicht, wird die ADC-Summe mit dem LSB und MSB des nächsten ADC-Tabellen-Werts verglichen. Wenn hierbei das Carry gesetzt ist (ADC-Summe unterschreitet nächsten Wert), dann werden die Werte für TCCR0B, für OCR0A und für den Software-Teiler in den drei Registern gesetzt, auf die die Adresse in X zeigt.
  5. Wenn das Carry nicht gesetzt ist, werden vier zu der Adresse in X addiert und das Ganze wird ab Schritt 3 wiederholt.
  6. In jedem Fall wird dann die ADC-Summe auf Null gesetzt, der ADC-Zähler auf 64 und es wird die nächste Wandlung gestartet.
Die ADC-Tabelle geht folgendermaßen:

; Resistors: R0=4k7, R1=15k, R2=6k8, R3=3k3, R4=1k5, all 1.0%
AdcTable:
  .dw 0,447 ; 0
  .dw 15360,15936 ; 1
  .dw 26432,27008 ; 2
  .dw 32512,33216 ; 3
  .dw 38144,38848 ; 4
  .dw 41280,41920 ; 5
  .dw 44160,44800 ; 6
  .dw 46144,46720 ; 7
  .dw 49408,49920 ; 8
  .dw 50560,51072 ; 9
  .dw 51712,52224 ; 10
  .dw 52544,52992 ; 11
  .dw 53504,53952 ; 12
  .dw 54144,54592 ; 13
  .dw 54848,55232 ; 14
  .dw 55360,55744 ; 15
  .dw 65535,65535 ; End of table



Der letzte Eintrag in der Tabelle sorgt in jedem Fall dafür, dass die Wandlung beendet wird, denn es kann keine höhere ADC-Summe als 65.472 geben (1.023 * 64 = 65.472), so dass alle Werte oberhalb von 55.743 zu einem Abbruch der Wandlung durch ein gesetztes Carry führen.

Ein Quarzteiler für eine Mittenfrequenz mit +/- Abweichungen

Quarzteiler fuer Mittenfrequenz mit Potentiometer Machmal braucht man eine Mittenfrequenz mit einer schmale Bandbreite nach oben und unten. Dann würde die Tabelle mit dem Mäuseklavier langweilig aussehen: alles bleibt gleich, nur die CTC-Vergleichswerte variieren etwas nach oben und unten. Außerdem ist die Einstellung mit einem Poti etwas bequemer als mit dem Mäuseklavier. Daher auch noch diese Variante.

Das Schaltbild zeigt, wie es geht: nur das Mäuseklavier durch ein Poti ersetzt. Der 1k-Widerstand vor dem Poti schützt vor den beiden Endanschlägen im Falle der Programmierung mittels ISP6, wenn USCK vom Programmiergerät als Clock-Signal angesteuert wird.

Als Beispiel aus der Praxis: Ich brauche einen Quarzgenerator mit 77,5 kHz Mittenfrequenz, den ich in der Frequenz etwas nach oben und nach unten verstellen kann. Zuerst brauche ich dafür schon mal die optimale Quarzfrequenz. Im Tabellenblatt "Quarze" sind alle kommerziell verfügbaren Quarze aufgelistet. Angegeben ist dafür auch die Gehäuseart (HC18 und oder HC49, das O gibt an, wenn es die Frequenz auch als fertigen Oszillator gibt, was wir hier nicht brauchen). Das Tabellenblatt gibt es in der LibreOffice-Calc-Datei hier.

Wenn Du Deine gewünschte Frequenz in Zelle C7 eingibst, kriegst Du alle Teilerwerte dafür in Spalte C. Wenn es zu viele "-"-Einträge sind, kann vielleicht das Ändern des Vorteilerwerts in Zelle C5 mit dem Ausklappfeld hin zu 8, 64, 256 oder 1.024, je nach zu erzeugender Frequenz, Abhilfe schaffen. Wenn Deine Zielfrequenz sehr, sehr niedrig ist, kannst Du auch zusätzlich noch den Register-Teilerwert in Zelle E5 auf bis zu 256 erhöhen.

Spalte D listet dann die Abweichung von Deiner gewünschten Frequenz auf: positive Werte, wenn sie höher ist, negative bei niedrigeren. Spalte E berechnet das Minimum aus allen Quarzen und stellt dieses in Zelle E7 dar, was in meinem Fall 19 Hz Differenz waren. Wenn Du in der Liste abwärts gehst, findest Du den oder die Quarze mit den niedristen Abweichungen als grün hinterlegten Eintrag in Spalte E. In meinem Fall war das der 20,0 MHz-Quarz.

Frequenz vs Poti Wenn Du diesen Quarz in dem Ausklappfeld in Zelle B3 auswählst, kriegst Du den zugehörigen Teilerwert in Zelle I3. Du kannst nun um diesen Teilerwert herum weitere Teiler auswählen. Mit einer Schrittweite von 1 in Zelle I5 geht es einen auf- und abwärts, mit 0,5 in jedem zweiten Schritt und mit 2 geht es immer zwei Schritte auf- und abwärts. Die sieben niedrigeren Teilerwerte der Bandbreite gibt es im Zellenbereich I16:I22, die höheren Im Bereich I7:I14. Die resultierenden Frequenzen gibt es in Spalte J. In meinem Fall reicht die Bandbreite von 73 bis 82 kHz, mit jeweils etwa 600 Hz pro Schritt, wie man auch in dem Diagramm sieht.

Bitte beachten, dass diese Teilerwerte nur für Werte zwischen 1 und 256 gelten, zu niedrige werden auf 1, zu hohe auf 256 gesetzt. Und natürlich gelten den Vorteiler- und der Registerteiler-Wert für alle in dieser Reihe.

Teiler mit weniger als 30 haben einen roten Hintergrund. Falls der eingestellte Vorteilerwert 1 ist, besteht die Gefahr, dass der Wert so nicht funktioniert. Bei einem Vorteilerwert von acht ist 4 das Minimum.

Bitte auch beachten, dass der CTC-Vergleichswert für OC0A der Teilerwert minus Eins ist. Das ist in den Werten in Spalte M erkennbar, die die Werte der Felder I25:I29 für den Export in den Assembler-Quellcode (diesen Bereich markieren, Strg-C zum Kopieren und Strg-V zum Einfügen im Quellcode) bereitstellt.

Um den Modus Mittenfrequenz+/- auszuwählen, muss cMode im Quellcode auf 1 gesetzt werden, dann re-assemblieren und Hexcode in das Flash brennen.

Software für den tn25-Quarz-Teiler

Die Software ist im Assembler-Format als quarzdiv_tn25_v1.asm hier downloadbar. Bitte unbedingt die Zeilen in der Sektion "Adjustable Constants" anschauen. Du solltest in jedem Fall cMode korrekt einstellen und damit entweder die Mäuseklavier- (cMode = 0) oder die Poti-Version (cMode = 1) wählen. Im Default-Fall arbeitet Für das Ändern aller Einstellungen bitte die LibreOffice-Calc-Datei hier verwenden, um die Berechnungen auszuführen und die erzeugten Quellcode-Teile zu kopieren. Bitte in jedem Fall die Konstante "clock" mit der Taktfrequenz des Quarzes füttern.

Wenn Du diese Software in einem ATtiny45 oder ATtiny85 verwenden willst: nur die Include-Datei def.inc ändern, alles Andere erledigt der Assembler.

Das Programm verwendet den Sleep-Mode. In den meisten Fällen schläft der Controller mehr als 99% der Zeit. Nur bei sehr kleinen CTC-Teiler-Werten braucht er längere Phasenanteile.

Die Fuses bei einem 2MHz-Quarz Die Fuses bei einem 20MHz-Quarz Beim Programmmieren nicht das Umstellen der Fuses vergessen. Die CKDIV8- Fuse muss gelöscht und der Quarz eingeschaltet werden. Bei einem 2MHz-Quarz ist die linke Einstellung die korrekte, bei einem 20MHz die rechte. Wenn Du das vergisst, stimmt die Frequenz nicht.

Aufbau des Teilers auf dem Steckbrett Und: ja, der Tiny arbeitet auch mit einem Quarz von 20 MHz noch einwandfrei, ist ja auch dafür spezifiziert.

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