Pfad: Home => AVR-Übersicht => Anwendungen => ATtiny mit Quarz => Tonleiter mit Quarz   This page in English: Flag EN Logo
Tiny-Quarz-Oszillator Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Tonleiter mit Quarz und 16-Bit-Frequenzteiler im ATtiny24

Quarzfrequenzoszillator und Tonleiterteiler mit ATtiny24

Ein wenig anders als bei der 8-Bit-TC-Version mit dem ATtiny25 hier funktioniert das Teilen der Quarzfrequenz zur Tonleiter mit einem 16-Bit-TC. Hier also die 16-Bit-Version für 60 verschiedene Tonleiter-Töne.

Die Berechnungen hierzu sind in der LibreOffice-Calc-Datei hier verfügbar, das Schaltbild und ein Flussdiagramm gibt es in der LibreOffice-Draw-Datei hier.

Seitenanfang Hardware Töne Quarze Widerstände Software

Die Hardware des 16-Bit-Tonleiter-Spielers

Schaltbild des ATtiny24-Tonleiter-Spielers Das ist die Hardware, die man dazu braucht:
  1. Ein Quarz Q taktet den ATtiny24 an den beiden XTAL-Pins.
  2. Die abzuspielenden Töne werden mit den Tasten K1 bis KN ausgewählt, die über ein Widerstandsnetzwerk an ADC-Eingangs-Pins angeschlossen sind. Alle bis zu 60 Tasten können entweder an einen einzigen ADC-Eingang oder, mit weiteren Widerstandsnetzwerken, an bis zu sechs verschiedene Eingänge angeschlossen werden. Die Aufteilung der Tasten auf mehrere Netzwerke hat den Vorteil, dass Widerstände der E12-Reihe mit höheren Toleranzen verwendet werden können.
  3. Das Ausgangs-Signal kommt vom OC1A-Pin des Prozessors. Der Elko und der Lautsprecher können zum Programmieren über die ISP6-Schnittstelle mit dem Jumper J1 abgetrennt werden, damit die Programmiersignale nicht gestört werden.
  4. Die Betriebsspannung sollte bei 4.5 V oder höher liegen, wenn Quarze mit 10 MHz und mehr verwendet werden.
Die Abtrennung des fünften und sechsten Widerstandsnetzwerks mit einem 1k-Widerstand stellt den seltenen Fall sicher, dass während des Programmierens über die ISP6-Schnittstelle jemand eine der höhren Tasten dieser beiden Netzwerke betätigt: der hohe Strom nach Plus würde das Programmieren stören.

Die Dimensionierung des Quarzes und der Widerstände kann mit der LibreOffice-Calc-Datei hier erfolgen.

Die Schaltung auf dem Breadboard Klein und schnuckelig kommt die Schaltung daher, hier auf einem Breadboard zusammengesteckt mit einem 20MHz-Quarz und einem Poti, auf dem alle 60 Töne spielbar sind (mit cRNetw = 0).

Seitenanfang Hardware Töne Quarze Widerstände Software

Konfigurieren der Töne

Die abspielbarem Toene Das Tabellenblatt töne hat alle abspielbaren Töne zwischen a' minor (a1m) und der Note d''''''' (d7). Aufgelistet sind die Notennamen und die Frequenz der Note in Hz.

Mit diesem Tabellenblatt können die abzuspielenden Töne konfiguriert werden. In der Ausklappzelle B3 kann der erste Ton ausgeählt werden, in der Zelle B4 der letzte Ton. Die Anzahl Töne ist dann in der Zelle B5 errechnet.

Bitte beachten, dass die in diesem Tabellenblatt vorgenommenen Einstellungen sich auf alle folgenden Tabellenblätter auswirken.

Seitenanfang Hardware Töne Quarze Widerstände Software

Auswahl des Quarzes

Noch ein Hinweis: das LibreOffice in der Version 7.4.3 hat einen üblen Fehler. Er schlägt beim Öffnen von Tabellen dann zu, wenn in der Ansicht Zeilen/Spalten fixieren ausgewählt ist und wenn die Tabelle beim Speichern in einer unteren Zeile stand. Dann kann es vorkommen, dass die obersten Zeilen der Tabelle nicht mehr angezeigt werden können. Zur Behebung reicht es, die Fixierung von Zeilen/Spalten im Ansicht-Menue kurz aufzuheben und in die obersten Zeilen zu navigieren. Danach kann die Ansicht wieder fixiert werden, ohne dass der Fehler erneut auftritt.

Liste der Quarze Das Tabellenblatt quarze enthält alle kommerziell verfügbaren Quarze. Einige Frequenzen (z. B. 1,2/2,4/4,8 und 9,6) wurden hinzugefügt, um den internen RC-Oszillator im ATtiny13 auch noch rechnen zu können. Mehr Frequenzen sieht man beim Blättern in der Frequenzspalte nach oben.

Das Tabellenblatt zeigt alle Teiler an, die bei der jeweiligen Quarzfrequenz zum Erzielen der konfigurierten Töne nötig sind. Die Töne sind in den Zeilen 3 (Nummer), 4 (Name) und 5 (Tonfrequenz) gelistet.

Alle Zahlen hier basieren auf Vorteilerwerten von 1. Wenn das bei tieferen Tönen nicht ausreicht, erhalten die Zellen einen gelben Hintergrund und der Vorteiler von 8 wird bei der Berechnung verwendet.

Der am Besten geeignete Quarz wird im Tabellenblatt delta ermittelt, nur das Ergebnis erscheint hier, grün markiert.

Die berechneten CTC-Vergleichswerte Das Tabellenblatt ctc berechnet alle Werte, die in das Vergleichsregister Compare-A von TC1 (gerundeter Teilerwert minus Eins) zu schreiben sind. Aus diesem Blatt wird im Tabellenblatt QuellCode die Tabelle konstruiert.

Die berechneten Ist-Frequenzen Im Tabellenblatt fIst sind alle Frequenzen berechnet, die sich aus dem Vorteiler (Eins oder Acht) und dem CTC-Vergleichswert ergeben. Wie man sieht, weichen die erzielten Frequenzen nur sehr geringfügig vom Sollwert ab. Bei sehr hohen Frequenzen kann die Abweichung aber etwas größer werden (prozentual bleibt es geringfügig).

Ermittlung des optimalen Quarzes Aus den Abweichungen berechnet das Tabellenblatt delta die prozentualen Abweichungen des Ist-Wertes vom Soll-Wert. Das Quadrat dieser Abweichungen wird in Spalte B über alle Töne aufsummiert, die Wurzel daraus gezogen und durch die Anzahl Töne geteilt. Das stellt ein Maß für die durchschnittliche Abweichung dar. Der Quarz mit der niedrigsten durchschnittlichen Abweichung ist derjenige, der am Besten passt. Er ist in grün markiert.

In der Zelle A5 kann man noch einen prozentualen Zuschlag eingeben. Die dann ebenfalls noch in Frage kommenden Quarze sind als zweite Wahl in gelb markiert (hier: 16,9344 und 18 MHz). Bei den geringen Abweichungen hier handelt es sich aber um akademische Unterschiede, so dass man A5 auch gerne mal auf 200% setzen kann.

Quarzspezifische Tabelle der Teiler Abschließend kann man im Tabellenblatt QuellCode mit dem Ausklappfeld B6 einen der Quarze auswählen (nicht notwendigerweise der mit der niedrigsten Abweichung). Für den ausgewählten Quarz kriegt man hier alle Parameter zusammengestellt und als eine für den Quellcode geeignete Tabelle formatiert. Wenn der Vorteiler auf 8 einzustellen ist, kriegt man das sowohl in der entsprechenden Spalte als auch in der Quellcode-Kopie als Kommentar mitgeteilt.

Zum Kopieren in den Quellcode wird der gesamte gelb hinterlegte Zellbereich markiert, mit Strg-C in die Zwischenablage kopiert und von dort mit Strg-V in den Quellcode geschoben. Es lohnt sich ferner, hinter dem letzten Eintrag mit dem Vorteiler=8-Hinweis noch ein Label ToneTable1: einzufügen, so dass die Software den geeigneten Vorteiler herauskriegt.

Seitenanfang Hardware Töne Quarze Widerstände Software

Konfigurieren der Widerstände

Die Verteilung der Widerstaende Das Tabellenblatt widerstände berechnet die Widerstände des Tasten-Widerstands-Netzwerkes. Auf der linken Seite sind die Zuordnungen der Tasten zu den Netzwerken vorgenommen, rechts sind dann die Widerstände gerechnet.

Die Anzahl der Widerstände mit gleichem Wert ergibt sich aus der Anzahl Netzwerke, die an die ADC-Eingänge des ATtiny24 angeschlossen sind. Die Anzahl Netzwerke (eins bis sechs) kann in der Zelle D3 des Tabellenblattes konfiguriert werden. Hier sind 60 Töne auf sechs Netzwerke verteilt. Das bedeutet, es werden zehn verschiedene Widerstandswerte zu je sechs Widerständen gebraucht, was man an der Spalte D (Wid #) sieht.

Die Widerstandswerte Die zehn Widerstände jedes der sechs Netzwerke sind im rechten Teil des Tabellenblatts gezeigt. Die in weiß auf grünem Hintergrund angegebenen Empfehlungen geben Hinweise darauf, was in den Eingabezellen darunter hineingehört. Bei zehn Widerstandswerten sind Widerstände aus der Reihe E12 mit 5% Genauigkeit ausreichend. Der Widerstand R0 kann bei 4k7 stehen bleiben. Die Spalte O mit dem Eintrag Max = listet die ADC-Differenzen auf, über die hinweg eine Taste zugeordnet wird: je höher die Toleranz des Widerstands desto weiter reicht der Zuordnungsbereich. Man erkennt aber auch, dass die Widerstände in der Mitte einen weiteren Bereich brauchen als die Widerstände oben und unten. Die Spalte P zeigt die Differenzen, die zwischen dieser und der nächsten Taste bestehen. Diese Werte sollten alle Null oder positiv sein, damit keine Tastenzuordnungen sich überlagern. Falls das Minimum in Zelle P4 negativ sein sollte, muss mit den Einstellungen der Widerstandsreihe, der Toleranz und, falls auch das nicht zum Erfolg führt, mit dem Widerstandswert R0 gespielt werden, bis es hinkommt.

Die Skalierung der Widerstandswerte Bitte beachten, dass die Spalte ADC aus dem Tabellenblatt skalierung zugeliefert wird. Hier ist in einem ziemlich aufwändigen Prozess die Charakteristik der Bandbreite an ADC-Werten abgebildet: die Bandbreite steigt in der Mitte steiler an als oben und unten, wie man an dem Diagramm auf dieser Seite sieht.

Die Einstellung der Delta-Werte erfolgt in Spalte C. Damit der gesamte ADC-Messbereich so weit als möglich verwendet wird, sollte die Reihe mittels des Einstellwerts in Zelle D7 so eingestellt werden, dass die Summe in Zelle B7 zwischen mindestens 1005 und maximal 1014 liegt. Nur mit diesen justierten Werten gelingt es, die maximal 60 Widerstände so einzustellen, dass keine Überlappung eintritt.

Da in dem eingestellten Fall nur 10 verschiedene Widerstandswerte gebraucht werden, sind diese einigermaßen gleichverteilt auf das gesamte Spektrum gelegt. Welche zehn Werte tatsächlich verwendet werden, sieht man an gelben Flecken im Diagramm.

Ist alles in Ordnung, dann kann die gelb hinterlegte Tabelle im Tabellenblatt widerstände markiert werden, mit Strg-C in die Zwischenablage kopiert und mit Strg-V in den Quellcode übertragen werden. Die Tabelle gibt für jeden Widerstand an, ab welchem Wert die Taste gedrückt ist und bis zu welchem Wert (plus Eins) genau diese Taste als gedrückt angesehen werden kann. Der letzte Eintrag der Tabelle beendet dann die Werte-Sucherei.

Wenn bis zu 64 ADC-Messungen aufsummiert werden sollen, trägt man diesen Faktor in der Zelle Q3 ein. Falls keine Summierung erfolgen soll, kriegt diese Zelle eine Eins.

Seitenanfang Hardware Töne Quarze Widerstände Software

Software

Flussdiagramm der Software Die Software in Assembler-Quellcode ist zum Download hier verfügbar. Per Default ist die Software auf drei Widerstandsnetzwerke und 60 Töne eingestellt. Wer es gerne anders mag, kann den Quellcode beliebig nach eigenem Geschmack ändern. Das Flussdiagramm rechts bildet die Umwandlung von ADC-Werten in Tonhöhen ab.

Die Fuse-Einstellungen Mit dem Programmieren müssen dann auch die Fuses des ATtiny24 auf den externen Quarz umgestellt werden, sonst sind die Frequenzen zu niedrig.

Im Flussdiagramm gezeigt ist die Umwandlung der ADC-Messungen in Töne, einschließlich der Verwaltung der bis zu 6 Netzwerke. Diese Verwaltung der Netzwerke verkompliziert die Software etwas, denn die n Netzwerke werden separat gerechnet. Tritt bei einem Netzwerk ein Gleichstand ein und wird damit ein Ton erkannt, dann werden die Resultate der Erkennung in Register und dann erst beim ebenfalls abgebildeten Compare-A-Interrupt in den Timer 1 geschrieben. Der erkannte Ton wird im Flaggenregister rFlags mit der gesetzten Flagge bDtct signalisiert. Nur wenn diese Flagge am Ende des letzten Netzwerks nicht gesetzt ist, wird der Ton dann stumm geschaltet.

Da jedes Widerstandnetzwerk bei der Dreier-Variante nur zwanzig verschiedenen Tönen entspricht, muss bei jeder abgeschlossenen Netzwerksbehandlung die Tontabelle um 20 Töne nach oben verschoben werden. Das geschieht im Doppelregister XH:XL, das jeweils die Verschiebung der Tontabelle enthält. Mit dem Ende des letzten Netzwerks wird XH:XL wieder auf Null gesetzt.

Zusätzlich zum Flussdiagramm braucht man nur noch die Initiierung des ADC und dessen Interrupt-Service-Routine AdcIsr: für das Aufsummieren der ADC-Werte. Sind die Werte aufsummiert, wird die Flagge bAdc im Flaggenregister rFlags gesetzt, damit die Umwandlung außerhalb der Interrupt-Service-Routine erfolgt.

TC1 sollte beim Start in den CTC-Modus versetzt werden. Es reicht dazu aus, die Konfigurationsregister entsprechend einzustellen (z. B. mit 100 als Compare-Match in R1:R0, mit dem Clear-Wert und dem CTC-Modus-Bit für TCCR0A in R2 sowie mit einem Vorteiler von 1 in TCCR0B in R3. Es reicht dann, den TC1 mit dem Vorteiler von 1 und dem gesetztem OCIE1A-Bit zu starten. Die Umschaltung in den CTC-Modus erfolgt dann beim ersten Interrupt des Zählers automatisch, wenn die Konfigurationsregister in R0 bis R3 entsprechend gesetzt sind.

Der Parameter cAdcClkP stellt den ADC-Takt-Vorteiler auf einen angenehmen Wert ein. Der Wert ist abhängig vom Prozessortakt, von der Aufsummierung in cAdcCnt (vorzugsweise 64) und der gewünschten Reaktionszeit auf Tastendrücke.

Nicht abgebildet ist hier der Init der Hardware und die ADC-Complete-Service-Routine. Die sollte den ADC-Wert zum Registerpaar rAdcH:rAdcL hinzu addieren und den Zähler rAdcCnt dekrementieren. Wenn der dann Null ist, muss die Flagge bAdc gesetzt werden. Falls nicht, wird einfach die nächste ADC-Wandlung gestartet.

Das ist es dann auch schon. Ich wünsche gutes Gelingen beim Anschluss der Keyboard-Tasten und viele schöne Melodien.

Seitenanfang Hardware Töne Quarze Widerstände Software


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