Pfad:
Home =>
AVR-Übersicht =>
Anwendungen => ATtiny mit Quarzen takten
This page in English:
 |
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
- mit einem Mäusepiano mit vier Schaltern oder
- mit einem Potentiometer in 8, 16 oder 32 Stufen
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
Das ist schon alles was es braucht:
- Die vier Schalter eines Mäuseklaviers erzeugen eine von 16
möglichen Spannungen, die mittels des AD-Wandler-Einganges ADC1
vom ATtiny25 gemessen werden.
- Der Quarz X taktet den ATtiny25, wenn seine Fuses auf den externen
Quarz umgestellt sind.
- 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.
- Das Ausgangssignal treibt den PB0-Pin, sein invertierter Wert den
Pin PB1 an.
- 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.
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=dummy | DIP-Sw | f(eff) Hz |
.db (1<<CS02)|(1<<CS00),255,4,0 | 0 | 1 |
.db (1<<CS02)|(1<<CS00),255,2,0 | 1 | 2 |
.db (1<<CS02)|(1<<CS00),255,1,0 | 2 | 4 |
.db (1<<CS02)|(1<<CS00),127,1,0 | 3 | 8 |
.db (1<<CS02)|(1<<CS00),63,1,0 | 4 | 16 |
.db 1<<CS02,127,1,0 | 5 | 32 |
.db 1<<CS02,63,1,0 | 6 | 64 |
.db (1<<CS01)|(1<<CS00),127,1,0 | 7 | 128 |
.db (1<<CS01)|(1<<CS00),63,1,0 | 8 | 256 |
.db 1<<CS01,255,1,0 | 9 | 512 |
.db 1<<CS01,127,1,0 | 10 | 1.024 |
.db 1<<CS01,63,1,0 | 11 | 2.048 |
.db 1<<CS00,255,1,0 | 12 | 4.096 |
.db 1<<CS00,127,1,0 | 13 | 8.192 |
.db 1<<CS00,63,1,0 | 14 | 16.384 |
.db 1<<CS00,31,1,0 | 15 | 32.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:
- Z zeigt auf den Beginn der ADC-Tabelle.
- X zeigt auf den Beginn der CodeTable.
- 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.
- 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.
- Wenn das Carry nicht gesetzt ist, werden vier zu der Adresse
in X addiert und das Ganze wird ab Schritt 3 wiederholt.
- 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
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.
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
- cMode = 0 mit einem 2,097152 MHz-Quarz und teilt diesen auf
1 Hz (mit den vier DIP-Schaltern auf Aus) bzw. auf
2N, mit N = 0..15, und mit
- cMode = 1 mit einem 20,0 MHz-Quarz und produziert eine
Frequenz um 77,5 kHz herum (mit +/- ca. 600 Hz pro Schritt).
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.
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.
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