'**************************************************************************
'* Name : Timer-Musik
'* Function : First Steps Example
'* Hardware : aTeVaL Evaluation Board - http://www.ehajo.de
'**************************************************************************
'* Compiler : lunaAVR 2013.r4 (or newer)
'**************************************************************************
'* Author : rgf, avr@myluna.de
'* Date/Version: 16.08.2013
'* www : http://avr.myluna.de
'**************************************************************************
' µC-Belegung am Beispiel Atmega328p
' Summer: PortD.7 !Die Lötbrücke "SPKR" auf der Lötseite muss geschlossen sein!
'**************************************************************************
avr.device = atmega328p 'Controller-Typ festlegen
avr.clock = 8000000 'Dem Compiler mitteilen mit welcher Taktrate der Controller läuft
avr.stack = 64 'Den Programmstack einstellen
'Den Port-Pin des Summers mit einem Bezeichner
'versehen. Dies zur besseren Lesbarkeit im Quelltext
#define SUMMER as PortD.7
'Diese Werte berechnen sich aus "8MHz / Frequenz des Tones / 2"
'Sollte ein anderer CPU-Takt verwendet werden muessen
'die Werte neu berechnet werden.
#define TON_C as 15152
#define TON_CIS as 14545
#define TON_D as 13468
#define TON_ES as 12618
#define TON_E as 12121
#define TON_F as 11364
#define TON_FIS as 10899
#define TON_G as 10101
#define TON_GIS as 9479
#define TON_A as 9091
#define TON_B as 8421
#define TON_H as 8081
#define TON_CC as 7576
#define TON_CCIS as 7273
#define TON_DD as 6734
#define TON_EES as 6309
#define TON_EE as 6061
#define TON_FF as 5682
#define TON_FFIS as 5450
#define TON_GG as 5051
#define TON_GGIS as 4740
#define TON_AA as 4546
#define TON_BB as 4211
#define TON_HH as 4041
SUMMER.mode = output,low 'Summer als Ausgang
'Den Timer1 Konfigurieren
'Taktteiler des Timers einstellen auf 1:1 (8 Mhz)
Timer1.Clock = 1
'Compare-Interrupt aktivieren
Timer1.CmpA.Isr = timer1_compare
'CTC-Mode aktivieren (Zähler setzt sich selbsttätig zurück)
Timer1.CmpA.Clear.enable
' Outputcompare-Register setzen, Ton A
Timer1.CmpA.Value = TON_C
' globale Variablen
dim i as byte 'Laufvariable
'Globale Interrupts einschalten
Avr.Interrupts.Enable
for i=0 to 37
' Fuer alle Noten im Datensatz
' Compare-Wert entsprechend Eintrag setzen
Timer1.CmpA.Value = tonleiter.WordValue(melodie.ByteValue(i)*2)
'Timer einschalten
Timer1.CmpA.Enable
' Warten damit die Note klingen kann...
waitms dauer.ByteValue(i)*300 ' *300 klingt ganz gut bei dem Lied
' Timer kurz aus- und wieder einschalten damit gleiche Noten
' hintereinander unterschieden werden koennen
Timer1.CmpA.Disable
waitms 2
next
'Lied ende, Timer ausschalten
Timer1.CmpA.Disable
'Hauptschleife
do
'nix...
loop
isr timer1_compare
SUMMER.toggle
endisr
' In diesem Datensatz stehen die Werte fuer den CTC-Counter
' Jeder Eintrag ist Wortbreit (16 Bit), daher müssen wir den Index * 2
' nehmen wenn wir einen Eintrag mit tonleiter.WordValue() lesen wollen
data tonleiter
.dw TON_C // 0
.dw TON_CIS // 1
.dw TON_D // 2
.dw TON_ES // 3
.dw TON_E // 4
.dw TON_F // 5
.dw TON_FIS // 6
.dw TON_G // 7
.dw TON_GIS // 8
.dw TON_A // 9
.dw TON_B // 10
.dw TON_H // 11
.dw TON_CC // 12
.dw TON_CCIS // 13
.dw TON_DD // 14
.dw TON_EES // 15
.dw TON_EE // 16
.dw TON_FF // 17
.dw TON_FFIS // 18
.dw TON_GG // 19
.dw TON_GGIS // 20
.dw TON_AA // 21
.dw TON_BB // 22
.dw TON_HH // 23
enddata
' Melodie definieren, in diesem Fall
data melodie
.db 14 // Sand-
.db 14 // mann
.db 11 // lie-
.db 12 // ber
.db 14 // Sand-
.db 14 // mann
.db 11 // es
.db 11 // ist
.db 12 // noch
.db 9 // nicht
.db 11 // so
.db 7 // weit!
.db 7 // Wir
.db 9 // sen-
.db 11 // den
.db 9 // erst
.db 11 // den
.db 7 // A-
.db 4 // bend-
.db 6 // ...
.db 7 // gruß,
.db 9 // eh
.db 7 // ...
.db 6 // je-
.db 9 // des
.db 7 // Kind
.db 9 // ins
.db 11 // Bett-
.db 12 // chen
.db 14 // muss.
.db 11 // Du
.db 12 // ...
.db 9 // hast
.db 7 // ge-
.db 9 // wiss
.db 4 // noch
.db 6 // ...
.db 7 // Zeit.
enddata
' Die Dauer der Noten definieren, 1 = 1/8-Note, 2 = 1/4 usw.
data dauer
.db 2,2,1,1,2,2,2,3,1,1,1,4,2,3,1,1,1,2,1,1,4,1,1,1,1,1,1,1,1,4,1,1,1,1,2,1,1,6
enddata