;MELODIE_GENERATOR-5 ;Erstellung eines AMV im Ton-Bereich ;8bit=1byte reichen aus für ca. 3 Oktaven ! ;Tonlänge über Timer_Interrupt ;Verwendung des Boot-Programms ;Piezo an PB3 ;ww1 gibt den Tonwert an ;hierfür können die Konstanten verwendet werden ;zugrundeliegende Rechnung: ;Tonwert=3.6/(Frequ[Ton] x 0,1 x 853,333333E-06) ;Ermittelt zuvor mit PRG "MELODIE_EICHUNG-141007" ;Preload für TNTC0 (Es wird in 1/16 aufgelöst): ;PRELOAD=256-(1,2M/1024/(Minutentakt[Hz]/60x16) ;"db.[beliebiger Wert],0" beendet das .db-Feld (Laenge=0) .include "tn13def.inc" .def Sicher = r16 .def Sicher_ITR = r17 .def A = r18 ;Hilfsregister .def Preload = r19 .def Ton = r20 ;Tonhöhe .def Laenge = r21 ;Tonlänge .def Bogen = r22 ;nächster Ton verbunden..? ;### TON-DEFINITIONEN ##################################### .equ e3 = 255 .equ f3 = 241 .equ fis3 = 228 .equ g3 = 215 .equ gis3 = 203 .equ a3 = 192 .equ ais3 = 181 .equ h3 = 171 .equ c4 = 161 .equ cis4 = 152 .equ d4 = 143 .equ dis4 = 136 .equ e4 = 128 .equ f4 = 121 .equ fis4 = 114 .equ g4 = 108 .equ gis4 = 102 .equ a4 = 96 ;440 Hz .equ ais4 = 91 .equ h4 = 85 .equ c5 = 81 .equ cis5 = 76 .equ d5 = 72 .equ dis5 = 68 .equ e5 = 64 .equ f5 = 60 .equ fis5 = 57 .equ g5 = 54 .equ gis5 = 51 .equ a5 = 48 .equ ais5 = 45 .equ h5 = 43 .equ c6 = 40 .equ cis6 = 38 .equ d6 = 36 .equ dis6 = 34 .equ e6 = 32 .equ f6 = 30 .equ fis6 = 29 .equ g6 = 27 .equ gis6 = 25 .equ a6 = 24 .equ ais6 = 23 .equ h6 = 21 .equ c7 = 20 .equ pause = 0 .equ link = 1 ;zur Markierung von Haltebögen ;### TONLÄNGEN - DEFINITIONEN ############################# .equ t1p = 24 ;Ganze punktiert .equ t1 = 16 ;Ganze .equ t2p = 12 ;Halbe punktiert .equ t2 = 8 ;Halbe .equ t4p = 6 ;Viertel punktiert .equ t4 = 4 ;Viertel .equ t8p = 3 ;Achtel punktiert .equ t8 = 2 ;Achtel .equ t16 = 1 ;Sechzehntel .equ ende = 0 ;beendet Melodie ;######################################################### rjmp ANFANG .org 0x0003 rjmp TIM0_OVF ;Timer-Interrupt ANFANG: ldi Preload,110 ;gem.og. Formel für 30/min ldi Bogen,0 ;1. Ton nicht verbunden sbi ddrb,3 ;PB3=Ausgang für Piezo ldi ZL,LOW(MELODIE*2) ;Adresse von Label MELODIE ldi ZH,HIGH(MELODIE*2) SCHLEIFE: cli lpm Ton,Z+ ;holt aktuellen Ton mit Länge lpm Laenge,Z+ cpi Ton,1 ;1: => nächster Ton wird verbunden brne TEST_ENDE ldi Bogen,1 rjmp SCHLEIFE TEST_ENDE: tst Laenge ;wenn Laenge=0, dann Melodie-Ende! breq ANFANG ;Melodie ganz wiederholen out TCNT0,Preload ;Preload in ITR-Zähler ldi A,5 out TCCR0B,A ;Start mit Vorteiler/1024 ldi A,2 out TIMSK0,A ;TimerOverflowInterruptEnable start! sei ;ITR aktivieren VERBINDUNG: cpi Bogen,1 ;wenn Bogen=1 (=link), breq TEST_PAUSE ;dann ohne Pause verbinden ldi Bogen,20 TRENNUNG: ;Variable Bogen wird umdefiniert rcall WAIT_1 ;sehr kurze Pause zur Tontrennung dec Bogen brne TRENNUNG TEST_PAUSE: clr Bogen ;Bogen <- 0 tst Ton ;Pause, wenn Ton=0 brne SPIELE_TON SPIELE_PAUSE: tst Laenge brne SPIELE_PAUSE rjmp SCHLEIFE ;nächsten Ton holen SPIELE_TON: rcall WAIT_1 sbi portb,3 rcall WAIT_1 cbi portb,3 tst Laenge ;ist LAENGE <= 0 ? brne SPIELE_TON rjmp SCHLEIFE ;nächsten Ton holen ;========================================================== WAIT_1: ;In der Nähe der Ton-Schleife !!! in Sicher,SREG mov A,Ton LOOP_TON: rcall WAIT_2 dec A brne LOOP_TON out SREG,Sicher ret ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - WAIT_2: ;MUSS unbedingt direkt unter nop ;WAIT_1 stehen !!! nop ;(wegen Ton-Timing) nop ;ggf noch nop's weg wegen ITR nop ret ;========================================================== TIM0_OVF: ;Timer-ITR für Ton-/Pausenlänge in Sicher_ITR,SREG out TCNT0,Preload dec Laenge TIM0_ENDE: out SREG,Sicher_ITR reti ;---------------------------------------------------------- MELODIE: ;"Guten Abend, gut' Nacht" .db fis4,t8,fis4,t8,a4,t4p,fis4,t8,fis4,t4,a4,t4 .db pause,t4,fis4,t8,link,0,a4,t8,d5,t4,cis5,t4p,h4,t8 .db h4,t4,link,0,a4,t4,e4,t8,link,0,fis4,t8,g4,t4 .db e4,t4,e4,t8,link,0,fis4,t8,g4,t4,pause,t4,e4,t8 .db link,0,g4,t8,cis5,t8,link,0,h4,t8,a4,t4,cis5,t4 .db d5,t4,pause,t4,d4,t8,d4,t8,d5,t2,h4,t8,g4,t8,a4,t2 .db fis4,t8,d4,t8,g4,t4,a4,t4,h4,t4,a4,t2,d4,t8 .db d4,t8,d5,t2,h4,t8,g4,t8 .db a4,t2,fis4,t8,d4,t8,g4,t4,fis4,t4,e4,t4,d4,t2 .db ende,ende