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 Frequenzteiler und ATtiny25

Quarzfrequenzoszillator und Tonleiterteiler mit ATtiny25

Dieses Teil spielt Musiktöne mit einem quarzgetriebenen ATtiny25. Es kann mit entweder 8, 15, 22, 29, 36, 43, 50 oder 57 verschiedenen Tönen (zwischen einer und acht Oktaven) der Tonleiter aufwarten. Die Töne werden mit acht und bis zu 57 Tasten ausgewählt.

Wer lieber einen AVR mit 16-Bit-Timer/Counter verwenden will, findet eine entsprechende Beschreibung für den ATtiny24 hier.

Die gewünschte Konfiguration kann mit der LibreOffice-Calc-Datei hier erfolgen, die alle nötigen Berechnungen vornimmt und mit der die Rechenergebnisse in den Assembler-Quellcode kopiert werden können. Die Zeichnungen auf dieser Seite können der LibreOffice-Draw-Datei hier entnommen werden.

Hardware Töne Quarze Widerstände Software

Die Hardware

Das Schaltbild des Tonleiterabspielers Das ist schon alles, was man dazu braucht:
  1. Ein Quarz Q taktet den ATtiny25.
  2. Ein Widerstandsnetzwerk mit Tasten und Widerständen wählt den abzuspielenden Ton aus. Bis zu 57 Tasten können an dem einen ADC-Pin angeschlossen werden. Die aus dem Spannungsteiler resultierenden Spannungen werden am ADC1-Eingang gemessen. Die Spannung am ADC1 ist U = Ubetr * R0 / (R0 + Rn), was zu ADC-Werten zwischen 0 (keine Taste gedrückt) bis ADC = 1023 * R0 / (R0 + RN), mit RN als dem N-ten Widerstand, führt. Die Referenzspannung wird aus der Betriebsspannung des ATtiny25 bezogen, die im Rahmen der Spezifikation beliebig sein kann (z. B. 3,3 oder 5,0 V). Man beachte allerdings, dass bei Quarzen ab 10MHz die Betriebsspannung bei 4,5V und darüber liegen muss! Die Toleranzen der Widerstände sollten bei 3 Oktaven 2%, darüber bei 1% liegen. Wenn nur eine oder zwei Oktaven bespielt werden sollen, kommen die auch mit 5% klar.
  3. Die Tonfrequenz wird am OC0A-Ausgangs-Pin ausgegeben und kann, über den Gleichspannungs-abtrennenden Elko direkt einen kleinen Lautsprecher ansteuern. Der Jumper J1 trennt den Elko und den Lautsprecher beim Programmieren über die ISP6-Schnittstelle vom MOSI-Pin ab, damit die Programmierimpulse nicht gestört werden.


Seitenanfang Hardware Töne Quarze Widerstände Software

Konfigurieren der Töne

Toene, die gespielt werden koennen Die Auswahl der spielbaren Töne wird in der ersten Tabelle namens "Noten" in der LibreOffice-Calc-Datei hier vorgenommen.

Diese Tabelle kennt alle Musiknoten im hörbaren Bereich, mit den Noten a1m (weiter oben in Spalte A) bis d7 (weiter unten) und ihre Frequenzen in Hz in Spalte B. Zuerst sollte die Anzahl zu spielender Oktaven in der Ausklappzelle A4 ausgewählt werden. Wenn Du hier 1 Oktave auswählst, können acht verschiedene Töne abgespielt werden. Es beginnt mit dem Ton a1 mit 440 Hz, der letzte ist dann a2 mit 880 Hz. Wenn der Einzel-Oktaven-Spieler mit dem Ton a3 beginnen soll, muss in Zelle C27 befindliche Eins mit der Formel in der Nachbarschaft überschrieben werden und die Eins in die Zelle in Spalte C hinter die Note a3 geschrieben werden. Die nachfolgenden sieben Noten kriegen ihre Nummerierung dann automatisch.

Bitte beachten, dass die Nummerierung der ersten Note (hier: 22) mit der Eins in Zeile 6 beginnt. Die Zeilennummer ist um 5 größer. Rechts neben den Oktaven werden die Parameter für den Export in andere Tabellen aufbereitet.

Seitenanfang Hardware Töne Quarze Widerstände Software

Konfigurieren des Quarzes

Die Quarze zur Auswahl Die Tabelle Quarze in der LibreOffice-Calc-Datei hier enthält alle kommerziell verfügbaren Quarze mit ihrer Fequenz in Hz in Spalte A. Die Zeile 6 der Tabelle enthält alle Tasten (in diesem Fall 22), die Zeile 7 gibt die Soll-Frequenz bei dieser Taste an.

Die angezeigten Zahlen sind die notwendigen Teilerwerte, damit der Quarz in Spalte A bei dieser Sollfrequenz in Zeile 7 ankommt. Für einen Uhrenquarz mit 32,768 kHz und eine Tonfrequenz von 440 Hz ist dieser Teiler die Hälfte von 32.768.000 / 440 = 74,473, nämlich 37,236, denn der OC0A-Pin teilt beim Torkeln die CTC-Frequenz durch Zwei.

Wenn der Quarz in der Tabelle QuellCode ausgewählt ist, dann erscheint er in der Tabelle in grün (hier ist es der 18MHz-Quarz).

Berechnung der Vorteilerwerte Aus den Teilerfaktoren wird in dieser Tabelle Vorteiler der nötige Vorteilerwert ermittelt. Er kann 1, 8, 64, 256 oder 1.024 sein, in Abhängigkeit vom notwendigen Teiler. In diesem Fall kommen bei hohen Quarzfrequenzen und niedrigen Tonfrequenzen 256 heraus, umgekehrt ergeben sich 64. Im oberen Teil der Tabellen kommen auch 1 und 8 vor.

Berechnung der Compare-A-Werte fuer CTC-Betrieb Das nächste Rechenblatt, Ctc, berechnet die notwendigen CTC- Compare-A-Vergleichswerte für TC0. Diese können direkt in das Compare-A-Vergleichsregister geschrieben werden, da die Eins bereits abgezogen ist.

Berechnung der Ist-Frequenzen Aus der Quarzfrequenz, dem Vorteilerwert und dem CTC-Wert berechnet das Tabellenblatt f_Ist dir resultierende Frequenz. Diese weichen in der Regel vom Sollwert etwas ab.

Hier trifft der 18MHz-Quarz keine der Sollfrequenzen, die Abweichungen sind allerdings recht gering.

Frequenzabweichungen in Prozent Das nächste Tabellenblatt, Delta, berechnet die Abweichung von der Sollfrequenz in Prozent. Abweichungen oberhalb eines Prozents sind in rot markiert (hier: keine).

Diese Abweichungen werden quadriert, über alle Tasten hinweg aufsummiert, daraus die Wurzel gezogen und durch die Anzahl Tasten geteilt, was zu der Kennzahl in Spalte B führt. Das Minimum in dieser Spalte in Zelle B6 ermöglicht es, den am besten geeigneten Quarz mit den geringsten Abweichungen zu identifizieren (hier: der 18MHz-Quarz). Gibt man in Zelle A7 eine Abweichung vor (hier: 20%), dann werden diese Quarze in Spalte B in gelb markiert (hier: der 18,432MHz-Quarz).

Hier sei noch darauf hingewiesen, dass die einfache Summe der Abweichungen anstelle der quadrierten Abweichungen zu einer anderen Reihenfolge führt. Es sei ferner darauf hingewiesen, dass bei Änderungen der Anzahl an Oktaven ebenfalls andere Reihenfolgen resultieren.

Markiert: Abweichungen ueber 1% Abweichungen oberhalb von 1% sind rot markiert, wie hier ein Blick in den oberen Teil der Tabelle zeigt.

Quellcode-Tabelle fuer den gewaehlten Quarz In der Tabelle QuellCode kann man seinen Lieblingsquarz (der nicht unbedingt der mit den niedrigsten Abweichungen sein muss) auswählen, mit dem Ausklappfeld in Zelle B3. Die wichtigsten Eigenschaften dieses Quarzes erscheinen dann für jede Taste von 1 bis N einzeln. Daraus macht die Spalte G dann eine kopierbare Assembler-Tabelle.

Die Tabelle besteht aus je einer Zeile pro Taste (hier: 22). Das erste Byte gibt den Vorteiler an (in Assembler-Schreibweise), der Wert muss in das TCCR0B-Register. Das zweite Byte gibt den CTC-Vergleichswert an, er kommt in das Compare-A-Register OCR0A.

Um die Tabelle zu kopieren muss der gesamte gelb markierte Bereich ausgewählt werden, mit Strg-C in die Zwischenablage kopiert und mit Strg-V in den Quellcode eingefügt werden.

Zum Programmieren wird das Registerpaar Z mit zwei LDI auf die zu spielende Note gestellt (= 2 * NoteTable + 2 * Notennummer), mit LPM register,Z+ und OUT TCCR0B,register der Vorteiler eingestellt und mit LPM register,Z sowie OUT OCR0A,register der Vergleichswert geschrieben. Damit der Ausgang OC0A torkelt, muss mit
LDI register,(1<<COM0A0)|(1<<WGM01) ; Torkeln OC0A, CTC-Modus
OUT TCCR0A,register ; in Kontroll-Registerport A

selbiges noch eingeschaltet werden. Damit das Ändern dieser Werte immer nur zu Beginn jeder TC0-Phase erfolgt, kann es ratsam sein, diese Werte in Register zu schreiben und innerhalb einer Interrupt-Service-Routine des TC0-Compare-A in die Portregister zu schreiben. Dazu siehe mehr in der Software-Beschreibung.

Seitenanfang Hardware Töne Quarze Widerstände Software

Konfigurieren der Widerstände

Berechnung der Widerstaende Die Berechnung der Widerstände wird in der Tabelle Widerstaende der LibreOffice-Calc-Datei hier vorgenommen. In Abhängigkeit von der Anzahl Oktaven wird den Tasten 1 bis N ein ADC-Wert in Spalte D zugeordnet. Je mehr Tasten zuzuordnen sind, desto geringer sind die Abstände. Da sich die Toleranz der Widerstände in der Mitte stärker bemerkbar macht, liefert das Tabellenblatt WiderstandsSkalierung eine entsprechend angepasste Tabelle in Spalte C (siehe weiter unten).

Aus dem ADC-Wert jeder Taste in Spalte D kann man mit der Betriebsspannung den Spannungswert jeder Taste in Spalte B errechnen.

Der größere Einfluss der Widerstandstoleranz kann man aus der Spalte I erkennen. Diese bildet die Differenz aus dem oberen ADC-Wert (wenn Rn an der oberen Toleranzgrenze und R0 an der unteren Toleranzgrenze liegt) AdcBis+1 und dem untersten ADC-Wert AdcVon: wie man erkennt, braucht die Mitte maximal 22 ADC-Einheiten Bandbreite pro Taste, während oben und unten in der Tabelle weniger Abstand vonnöten ist. Genau das gleicht die Tabelle WiderstandsSkalierung aus. Ohne diesen Ausgleich wäre es nicht möglich, so viele Tasten auf einmal (bis zu 57) zu unterscheiden.

Die Differenzwerte in Spalte C werden im Blatt WiderstandsSkalierung produziert. Deren Summe sollte zwischen 990 und 999 liegen, damit der größtmögliche ADC-Bereich verwendet wird. Beim Wechsel der Anzahl Oktaven muss diese Skalierung angepasst werden. Das macht man in der Zelle G5, die darunter angegebenen Empfehlungen sind erprobte Faktoren.

Die folgenden Einstellungen sind ferner im Blatt Widerstaende möglich. Der Widerstand nach Null, R0, kann geändert werden. Das macht dann Sinn, wenn der voreingestellte Wert von 4k7 unpassend sein sollte. Das ist der Fall, wenn acht Oktaven zu bedienen sind. Dann lautet die Empfehlung in Zeile 2 auf 8k2. Das erweitert die Bandbreite der Widerstände, so dass es nicht zu Überlappungen kommt (Zelle J5 wird negativ und rötet sich). Auch mit den Parametern Widerstandsreihe (E12 oder E24) und der Toleranz kann man ein wenig herumspielen. Wem die konservative Annahme, dass beide Widerstände im ungünstigsten Extrembereich liegen, zu vorsichtig ist, gibt hier statt 1% lieber 0,5% ein. Oder sucht sich Widerstände mit engerer Toleranz (z. B. 0,1%) heraus. Damit kann man sogar 8 1/2 Oktaven noch hinkriegen.

Aus der nominellen Spannung in Spalte B berechnet Spalte E einen theoretischen Widerstandswert. Dieser wird in Spalte F einem Widerstandswert aus der gewählten Reihe (E12 oder E24) angenähert. Mit den beiden Werten R0 und Rn ermitteln die beiden Spalten G und H die Extremwerte auf Basis der eingestellten Toleranz. Die Werte der Spalte H sind um Eins erhöht, so dass beim Vergleich des ADC-Wertes mit dieser Größe dann ein Carry auftritt, wenn der ADC-Wert kleiner ist und damit die gedrückte Taste gefunden ist).

Die Spalte J berechnet den Unterschied zwischen dem höchsten Wert dieser Zeile mit dem niedrigsten Wert der nächsten Zeile. Ist diese Differenz negativ, dann sind die beiden Tastenspannungen überlappend und das Delta wird rot. Zelle J5 stellt das Minimum fest und wird ebenfalls rot, wenn Überlappungen auftreten.

Die Spalte K stellt die ADC-Tabelle zum Übertragen in den Quellcode bereit (gelb hinterlegte Zeile markieren, Strg-C zum Kopieren in die Zwischenablage, mit Strg-V einfügen in den Quellcode). Die Tabelle enthält die Untergrenze sowie die Obergrenze (plus Eins) der ADC-Werte der einzelnen Tasten und gibt im Kommentar auch die Größe des jeweiligen Widerstands an. Mit dem Algorithmus in der Software-Abteilung kann man sich durch die bis zu 114 Stück 16-Bit-Werte hangeln, um die gedrückte Taste herauszufinden. Passen die ADC-Werte nicht in einen der gelisteten Bereiche (nAdc < als die nächste Untergrenze), sollte der Ton abgestellt werden.

Die Tabelle fuer 64 aufsummierte Messungen Wenn Dein ADC-Mess-Algorithmus immer erst 64 Messungen aufsummiert, damit Deine Mimik nicht auf einzelne Messartifakte hereinfällt, trägst Du diese Anzahl Messungen in die Zelle K3 ein. Die Tabelle enthält dann entsprechend multiplizierte Vielfache.

Darstellung der Widerstaende In der Tabelle WiderstandsTabelle gibt es dann eine etwas kompaktere Zusammenstellung aller Widerstände, die benötigt werden, um diese z. B. in einem Online-Shop zu bestellen.

Seitenanfang Hardware Töne Quarze Widerstände Software

Software

Flussdiagramm der Software Die Software kann mit diesem Diagramm leicht selbst geschrieben werden.

Gezeigt ist die Umwandlung der ADC-Messungen in gedrückte Tasten, das Holen der TC0-Parameter aus der Flash-Tabelle und die Übernahme dieser Werte in der TC0-CompareA-Interrupt-Service-Routine. Nicht gezeigt ist das Initiieren des Stapels, des Einstellen des OC0A-Ausganges als Ausgang, des Starten des Zählers TC0, das Starten der ersten ADC-Wandlung und die ADCC-Interrupt-Service-Routine, die auch die bAdc-Flagge im Flaggenregister rFlag setzen sollte (die dann außerhalb der Service-Routine abgearbeitet werden muss).

TC0 sollte zu Beginn in den CTC-Modus gebracht werden, das Torkeln von OC0A ausgeschaltet und der Compare-Match-A-Interrupt eingeschaltet werden. Die Register R0 bis R2 sind mit geeigneten Voreinstellungen zu versehen (z. B. mit OC0A auf Clear, 255 im Compare-A-Register und einem Vorteiler von 64).

Der Parameter cAdcClkP sollte ebenfalls auf einen geeigneten Wert zwischen 0 und (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0) eingestellt werden. Der Wert muss aus der Quarzfrequenz, der Anzahl aufsummierter Messungen und aus der maximalen Verzögerung zwischen Tastendruck und Ton-Start errechnet werden.

Es sind noch viele Varianten denkbar. So ist z. B. der Pin PB1 noch frei, wer also einen Umschalter von den unteren vier Oktaven auf die oberen vier haben will, hat hier noch Gestaltungsmöglichkeiten. Wem es unangenehm ist, dass immer nur eine Taste gedrückt werden darf, baut sich für jede Oktave einen eigenen Generator und schaltet die Ausgangssignale elektrisch zusammen und auf den Eingang eines NF-Verstärkers. Man kann auch für jeden einzelnen Ton einen ATtiny25 investieren, dann kann man beliebig viele Tasten miteinander kombinieren. Dann braucht man aber auch keine Widerstandsmimik.

Das war es schon. Viel Erfolg beim Anhören Deines hauseigenen Keyboards.

Seitenanfang Hardware Töne Quarze Widerstände Software


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