Timer-Ton

timer-ton.luna
'**************************************************************************
'* Name        : Timer-Ton
'* 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!
' Taste1:  PortD.2
' Taste2:	PortD.3
'**************************************************************************
 
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
 
'Die Port-Pins der Taster und des Summers mit einem Bezeichner
'versehen. Dies zur besseren Lesbarkeit im Quelltext
#define SUMMER as PortD.7
#define TASTE1 as PortD.2
#define TASTE2 as PortD.3
 
'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
TASTE1.mode	= input,pullup	'Taste1 als Eingang, Pullup einschalten
TASTE2.mode	= input,pullup	'Taste2 als Eingang, Pullup einschalten
 
'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, hier fuer Ton A
' Um einen anderen Ton auszugeben muss man hier
' einen anderen Wert aus den Defines eintragen
Timer1.CmpA.Value = TON_C
 
'Globale Interrupts einschalten
Avr.Interrupts.Enable
 
'Hauptschleife
do
  if TASTE1=0 then
    'Taste 1 wurde gedrueckt, Ton starten
    Timer1.CmpA.enable
  end if
  if TASTE2=0 then
    'Taste 2 wurde gedrueckt, Ton aus
    Timer1.CmpA.disable
  end if
loop
 
isr timer1_compare
  SUMMER.toggle
endisr