Pfad:AVR-DE => Anwendungen => Eieruhr
Eieruhr klein Anwendungen von
AVR-Einchip-Prozessoren AT90S, ATtiny, ATmega und ATxmega
Eieruhr mit ATtiny24 und rot/grünen LEDs
Logo

Eieruhr mit ATtiny24

Gezippte Version dieser Seite (468 kB)


Eieruhr tn24 Eine Anwendung des 14-poligen Microcontrollers ATtiny24 mit den folgenden Eigenschaften:

0 Überblick

  1. Hardware
  2. Aufbau
  3. Software

1 Hardware

1.1 Schaltbild

Die Schaltung arbeitet mit zwei in Reihe geschalteten AAA-Batterien bei 3 Volt Betriebsspannung. Wer mit einer anderen Stromquelle arbeiten möchte, passt die beiden 56 Ω-Widerstände entsprechend an. Die Formel zur Berechnung der Widerstände ist (Strom in mA, max. 25):
R (Ω) = 1.000 * (UB - 2,0) / ILED

Die Steuerung der Eieruhr übernimmt ein ATtiny24 in einem 14-poligen DIL-Gehäuse. Der I/O-Port A steuert die LEDs an und ist an die Pins 2 bis 9 einer 10-poligen Steckerverbindung angeschlossen. Über ein kurzes Stück Flachbandkabel sind die Kathoden der roten LED und die Anoden der grünen LED an diese Pins angelötet.

Die Anoden der roten LEDs und die Kathoden der grünen LEDs sind zu je vier miteinander verbunden und als CL (Common Low, L1 bis L4) und CH (Common High, L5 bis L8) über den 10-poligen Stecker an die I/O-Portpins PB1 und PB0 geführt.

Der Lautsprecher (hier 8 Ω) ist über einen Elko mit 47 µF an den OC0A-Ausgang des ATtiny24 angeschlossen.

Die Betriebsspannung wird mit einem 100 nF-Keramikkondensator von Schaltspitzen des Prozessors sauber gehalten.

Die Programmierung des Prozessors erfolgt über den Stecker der ISP6-Schnittstelle.

Eieruhr Schaltbild

1.2 Stückliste

Die benötigten elektronischen Teile sind in der Stückliste zusammengestellt. Die angegebenen Preise entsprechen dem Stand von Januar 2018.

Eieruhr Stückliste

Zusätzlich sind an mechanischem Material zwei Plexiglasscheiben, vier Abstandshalter M2,5 mit 20 mm Länge, vier Abstandshalter M3 mit 45 mm Länge, vier Gummifüße sowie vier Schrauben M2,5, vier Muttern M2,5 und acht Schrauben M3. Vom Batteriehalter zum Schalter und von diesem zur Platine sowie für den Anschluss des Lautsprechers an die Platine sind drei kurze Stücke zweiadrige Litze nötig. Für den Schutz der Anschlüsse sind einige kurze Stücke Schrumpfschlauch zu empfehlen.

Seitenanfang Hardware Aufbau Software


2 Aufbau

2.1 Gedruckte Platine

Eieruhr Platine Eieruhr Bestückungsplan Die Bauteile finden auf einer 40*50 mm großen Platine Platz. Fünf Brücken sind mit Draht zu bestücken.

Die zur Bestückung fertige Platine.

Eieruhr Platine Bohrseite Eieruhr Platine Leitseite

2.2 Mechanischer Aufbau

Eieruhr obere Plexiglasabdeckung Eieruhr untere Plexiglasabdeckung Zur Montage wurden zwei Plexiglassscheiben ausgesägt. Die obere Scheibe wurde mit Bohrungen für die LEDs, die Platinenbefestigung, den Schalter (hier nicht eingezeichnet) und für die Befestigung der unteren Scheibe versehen. Die LEDs wurden in die 5 mm-Bohrungen gedrückt und die je vier Anoden der roten LEDs (= längerer Anschluss der LED) mit Draht verbunden. Die zehn Anschlüsse zur Buchse wurden durch Auftrennen des Flachbandkabels an deren Enden an die LEDs angelötet.

Seitenanfang Hardware Aufbau Software



3 Software

3.1 Programmablauf

Der Quellcode ist in AVR-Assembler geschrieben und kann hier im HTML-Format im Browser angezeigt werden.

Im Folgenden ist die Funktionsweise des interrupt-gesteuerten Programmes näher beschrieben.

3.1.1 Uhr und LED-Multiplex

Die erforderliche Uhr und die Steuerung der LEDs ist mit dem 16-Bit-Timer TC1 realisiert.

Eieruhr TC1 Timer Mux Minuten

Der 16-Bit-Timer wird mit dem internen RC-Oszillator-Signal (8 MHz-RC-Oszillator, Taktvorteiler 8 mit gesetzter CLKDIV8-Fuse, Default-Einstellung, Takt 1 MHz) und einem Vorteiler von 1 getaktet. Er arbeitet im CTC-Modus und wird nach 5.000 Takten rückgesetzt. Damit wird die Multiplex- Frequenz von 1.000.000 / 5.000 = 200 Hz erzeugt und der Compare-Match-A-Interrupt ausgeführt.

Beim Compare Match werden zunächst alle I/O-Pins von Port A als Eingänge geschaltet und die LEDs damit ausgeschaltet. Dann wird das Multiplex-Register rMux in der binären Abfolge 0001.0001, 0010.0010, 0100.0100 und 1000.1000 jeweils um eine Position links geschoben. Dieses Register schaltet das Richtungsregister von Port A auf die jeweils aktiven beiden LEDs.

Fällt beim Linsschieben eine Eins in das Carry, ist ein Multiplex-Durchlauf beendet und beginnt mit 0001.0001 von neuem. Damit wird auch der Zaehler rMuxCnt von 50 an abwaerts gezaehlt. Erreicht dieser Null, ist eine Sekunde um und rSec wird von 60 an abwaerts gezählt. Erreicht rSec Null, ist eine Minute um. Dann wird eine binäre Null von links in den Minutenzähler rMin geschoben, der mit 0b1111.1111 beginnt. Fällt beim Linksschieben eine Null ins Carry wird rMin mit 0xFF neu begonnen (Neustart). Außerdem wird bei jeder Minute die Flagge bMin gesetzt, außerhalb des Interrupts wird dann die nächste Melodieausgabe angestossen.

Innerhalb des TC1-Compare-Match-Int werden rMux und rMin UND-verknüpft. Ist dabei eines der oberen vier Bits gesetzt (rote LED an), wird der Ausgang CH (=PB0) auf Null gesetzt, andernfalls auf Eins. Selbiges erfolgt mit den vier unteren Bits und dem Ausgang CL (=PB1).

3.1.2 Musik

Die Musik wird mit dem Timer TC0 und dem I/O-Bit OC0A (=PB3) erzeugt. TC0 arbeitet als CTC und gibt zu erzeugende Notenfrequenzen durch Togglen des OC0A-Ausgangs aus bzw. schaltet den Lautsprecher bei auszugebenden Pausen aus.

3.1.2.1 Timertabelle mit Noten

Die Tonhöhe ergibt sich aus dem eingestellten Vorteiler (256 bei sehr niedrigen, 64 bei niedrigen, 8 bei höheren und 1 bei sehr hohen Tönen) und dem für jede Note spezifisch festgelegten Compare-Match-A-Wert. Die 70 verschiedenen spielbaren Noten sind in der Timertabelle im Flash abgelegt. Jede Note besteht aus vier Bytes:
  1. dem Compare-Match-A-Wert,
  2. ,
  3. dem einzustellenden Vorteiler-Wert,
  4. dem niedrigerwertigen Byte, das der Anzahl an CTC-Durchläufen für eine die Dauer einer 1/16-tel Note entspricht (1/16-tel Sekunde), und
  5. dessen höherwertiges Byte.
Die Dauer, über die eine Note zu spielen ist, wird bei jedem CTC0-Compare-Match-Interrupt im Doppelregister rCntH:rCntL (R25:R24) im 16-Bit-Modus abwärts gezählt. Wird dabei Null erreicht, wird die Flagge bTO gesetzt. Dies bewirkt, dass außerhalb der Interrupt-Service-Routine die nächste Note oder Pause ermittelt und gespielt wird. Ist die Melodie beendet, werden die TC0-Interrupts ausgeschaltet und der Ausgang OC0A auf Clear (inaktiv, Null) gestellt.

Ist eine Pause zu spielen, wird die Note #70 gespielt, mit einem Vorteiler von 256 und einem Compare-Match-Wert von 243 und einem einmaligen Durchlauf, aber der Ausgang OC0A wird dabei auf Clear eingestellt. Dies entspricht einer Dauer von 256 * (243 + 1) / 1.000.000 ) = 62,464 ms, also einer Sechzehntel Sekunde.

Sind längere als 1/16-tel Noten zu spielen, wird der Basiswert der CTC-Durchlaufanzahl entsprechend oft aufsummiert, woraus sich eine entsprechende Verlängerung der Noten- bzw. Pausendauer ergibt.

3.1.2.2 Notendefinitionen

Um das Schreiben von Melodien zu erleichtern, ist jeder der 70 spielbaren Noten ein Kürzel zugeordnet. Diese Zuordnung erfolgt in der Notentabelle.

Alle Notenkürzel beginnen mit dem Buchstaben n. Da in Assembler zwischen Klein- und Großbuchstaben nicht unterschieden wird und um das Verwenden von ' zu umgehen, mussten die Notenkennungen etwas anders organisiert werden.

Sie beginnt mit der Note A'' (27,5 Hz). Das Kuerzel nA2m gibt an, dass es sich um die Note A'' in der zweitniedrigeren (m) Oktave handelt. Die nächsthöhere Oktave, Note C', ist mit einem nC1m gekennzeichnet. Die Note C in der nächsthöheren Oktave ist mit nCm bezeichnet. Die Noten a bis c tragen kein m, die nächsten Oktaven laufen von 1 bis 7.

Für die Pause ist p definiert.

3.1.2.3 Musikstücke

Die zu spielenden Musikstücke sind in Form von Tabellen mit den Labeln Melodie0 bis Melodie8 im Flash abgelegt. Die mit zwei multiplizierten Anfangsadressen der neun Melodien sind in MeldodieTab abgelegt, um die Zuordnung der einzelnen Melodien zum Minutenstand zu ermöglichen.

Jede Melodie besteht aus
  1. einem Byte mit einer Notennummer (z.B. nc für die Note c mit f=130 Hz), gefolgt von
  2. dem Multiplikator für deren Dauer in 1/16-tel Noten (minimal 1, maximal 20 für eine Notendauer von 1,25 s bei der Note nf7 bzw. 255 oder 16 s bei den niedrigeren Noten,
  3. Pausen mit dem Kuerzel p, gefolgt von dem Multiplikator für die Pausendauer in 1/16-tel Sekunden (maximal 255),
  4. einem oder zwei Bytes 0xFF oder Ende, das das Abspielen der Melodie beendet.
Gespeichert sind folgende Melodien:
  1. Ode an die Freude (Beethoven)
  2. Marmor, Stein und Eisen bricht (Drafi Deutscher),
  3. When I'm sixty four (Beatles)
  4. Smoke on the water (Deep Purple)
  5. The wall (Pink Floyd)
  6. Emanuela (Fettes Brot)
  7. Morsecode für "Jürgen"
  8. Die Internationale
  9. Die Tonleiter von A'' bis d'''''''
Eieruhr Notenschluessel Eieruhr Notendauern Bei der Umwandlung wurde der links abgebildete Notenschlüssel und die rechts abgebildete Notendauer verwendet.

Für Originalgetreuheit wird vom Autor keinerlei Garantie übernommen.

3.2 Quellcode

Der Assembler-Quellcode ist hier, im Browser anzeigbarer Code hier.

Seitenanfang Hardware Aufbau Software




Lob, Tadel, Fehlermeldungen, Genöle und Geschimpfe oder Spam bitte über das Kommentarformular an mich.

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