Следующий музыкальный автомат генерирует звук выполняя в цикле декремент счетного регистра (общего назначения) программно. Длительностью нот в этом автомате управляет сторожевой таймер watchdog.

Прошивка для ATtiny13:

;******************************************************************************
;******* La Peregrinacion звучит на порту PB2 микроконтроллера ATtiny13 *******
;***** Created: 2015-02-10 01:05 ******** Site: http://integrator.adior.ru ****
;******************************************************************************
.includepath "/home/dior/AVR"		; Папка с файлами заголовками         
.include "tn13def.inc"			; Используем ATtiny13                 
;==============================================================================
; На PB3 подключить динамик.

;==============================================================================
; Макросы для установки длительности ноты
	.macro len128
		ldi r24, 64		; 16 мс
	.endm
	.macro len64
		ldi r24, 65		; 32 мс
	.endm
	.macro len32
		ldi r24, 66		; 64 мс
	.endm
	.macro len16
		ldi r24, 67		; 125 мс
	.endm
	.macro len8
		ldi r24, 68		; 250 мс
	.endm
	.macro len4
		ldi r24, 69		; 500 мс
	.endm
	.macro len2
		ldi r24, 70		; 1000 мс
	.endm
	.macro len1
		ldi r24, 71		; 2000 мс
	.endm
;==============================================================================
	.cseg
	.org $000
		rjmp reset		; 0 начало программы
		reti			; 1 Внешнее прерывание 0
		reti			; 2 Прерывание по изменению состояния выводов
		reti			; 3 Переполнение таймера/счетчика ТО
		reti			; 4 EEPROM готово
		reti			; 5 Аналоговый компаратор
		reti			; 6 Совпадение А таймера/счетчика ТО
		reti			; 7 Совпадение В таймера/счетчика ТО
		rjmp watchdog		; 8 Тайм-аут сторожевого таймера
		reti			; 9 Преобразование АЦП завершено
reset:
		ldi r23, RAMEND		; Загрузить в R23 адрес последней ячейки памяти
		out SPL, r23		; Инициализация стека
		sbi DDRB, DDB3		; PB3 будет работать на выход
		sbi PORTB, PORTB3	; PB3 установить в 1.
		in r23, PORTB		; Загрузить в буфер R23 состояние порта B
		ldi r25, 24		; Установка WDE и WDCE (разрешение изменения конфигурации watchdog)
main:					; В МИРЕ ЖИВОТНЫХ
;ми2
		ldi XL, 131		; Высота ноты (младший байт)
		ldi XH, 7		; Высота ноты (старший байт)
		len8			; Длительность ноты
		rcall duratone		; Вызов подпрограммы синтезатор ноты
;ре2
		ldi XL, 111
		ldi XH, 8
		rcall duratone
;до2
		ldi XL, 120
		ldi XH, 9
		rcall duratone
;ре2
		ldi XL, 111
		ldi XH, 8
		rcall duratone
;ми2
		ldi XL, 131
		ldi XH, 7
		rcall duratone
;ми2----
		len4
		rcall duratone
;фа2
		ldi XL, 23
		rcall duratone
;до2
		ldi XL, 120
		ldi XH, 9
		len8
		rcall duratone
;до2----
		len4
		rcall duratone
;си1
		ldi XL, 8
		ldi XH, 10
		rcall duratone
;ми2----
		ldi XL, 131
		ldi XH, 7
		len2
		rcall duratone
;до2----
		ldi XL, 120
		ldi XH, 9
		len8
		rcall duratone
;си1
		ldi XL, 8
		ldi XH, 10
		rcall duratone
;ля1
		ldi XL, 67
		ldi XH, 11
		rcall duratone
;си1
		ldi XL, 8
		ldi XH, 10
		rcall duratone
;до2
		ldi XL, 120
		ldi XH, 9
		rcall duratone
;до2----
		len4
		rcall duratone
;ре2
		ldi XL, 111
		ldi XH, 8
		rcall duratone
;ля1
		ldi XL, 67
		ldi XH, 11
		len8
		rcall duratone
;ля1----
		len4
		rcall duratone
;#соль1
		ldi XL, 238
		rcall duratone
;до2----
		ldi XL, 120
		ldi XH, 9
		len2
		rcall duratone
;ми2----
		ldi XL, 131
		ldi XH, 7
		len8
		rcall duratone
;ре2
		ldi XL, 111
		ldi XH, 8
		rcall duratone
;до2
		ldi XL, 120
		ldi XH, 9
		rcall duratone
;ре2
		ldi XL, 111
		ldi XH, 8
		rcall duratone
;ми2
		ldi XL, 131
		ldi XH, 7
		rcall duratone
;ми2----
		len4
		rcall duratone
;фа2
		ldi XL, 23
		rcall duratone
;фа2
		len8
		rcall duratone
;соль2----
		ldi XL, 81
		ldi XH, 6
		len4
		rcall duratone
;ре2
		ldi XL, 111
		ldi XH, 8
		rcall duratone
;ми2----
		ldi XL, 131
		ldi XH, 7
		len2
		rcall duratone
;до2----
		ldi XL, 120
		ldi XH, 9
		len8
		rcall duratone
;си1
		ldi XL, 8
		ldi XH, 10
		rcall duratone
;ля1
		ldi XL, 67
		ldi XH, 11
		rcall duratone
;си1
		ldi XL, 8
		ldi XH, 10
		rcall duratone
;до2
		ldi XL, 120
		ldi XH, 9
		rcall duratone
;до2----
		len4
		rcall duratone
;ре2
		ldi XL, 111
		ldi XH, 8
		rcall duratone
;ля1
		ldi XL, 67
		ldi XH, 11
		len8
		rcall duratone
;ля1----
		len4
		rcall duratone
;#соль1
		ldi XL, 238
		rcall duratone
;ля1----
		ldi XL, 67
		len2
		rcall duratone
;ля1----
		len2
		rcall duratone

stop:		rjmp stop		; Останов или бесконечный цикл

;==============================================================================
; Подпрограммы, обработчики прерываний

watchdog:
		pop r21			; Снять со стека адрес последней подпрограммы
		pop r21			; чтобы вернуться в главную программу
		reti			; Возврат из прерывания

duratone:				; Подпрограмма синтезатор ноты
		out WDTCR, r25		; Разрешение изменения конфигурации watchdog
		wdr			; сброс сторожевого таймера
		out WDTCR, r24		; Установка периода сторожевого таймера
		sei			; Разрешить прерывания
		rcall play		; Вызов подпрограммы генератор тона
		cli			; Запретить прерывания
		ret			; Возврат из подпрограммы

play:					; Подпрограмма генератор тона
		movw YL, XL		; ╔Загрузить в счетчик Y длительность полупериода из X
		swap r23		; ║Поменять местами полубайты в r23
		out PORTB, r23		; ║Инвертировать сигнал на PB2
halfcycle:	sbiw YH:YL,1		; ║╔Y=Y-1 (65535...0)
		brcc halfcycle		; ║╚Повторять пока не было переноса
		rjmp play		; ╚Повторять в ожидании прерывания
stoptone:	ret			; Возврат из подпрограммы
;==============================================================================
; Задействованы регистры
; Y : YL=R28, YH=R29 счетчик полупериода сигнала
; X : XL=R26, XH=R27 буфер, хранит длительность полупериода для счетчика Y 
; R25 разрешение изменения конфигурации watchdog
; R24 время задержки сторожевого таймера
; R23 буфер порта ввода вывода PORTB
; R21 буфер стека

; F=1200000/(n+2)
; n=1200000/f - 2
; где n=X=XH*256+XL

;==============================================================================
; Компилировать avra test.s
; Загрузить avrdude -C/home/dior/AVR/avrdude.conf -v -v -v -v -pattiny13 -cstk500v1 -P/dev/ttyUSB0 -b19200 -Uflash:w:test.s.hex:i
; Фьюзы avrdude -C/home/dior/AVR/avrdude.conf -v -v -v -v -pattiny13 -cstk500v1 -P/dev/ttyUSB0 -b19200 -e -Uhfuse:w:0xff:m -Ulfuse:w:0x7a:m

Для кодирования нот в музыкальный автомат на ATtiny13 понадобится таблица соответствия нотам частоты звуковых колебаний. В нашей таблице мы уже рассчитали значения для регистров XH и XL микроконтроллера ATtiny13. Значение n для регистра XH:XL рассчитано по формуле:

Так как в формуле вместо стандартного коэффициента 27,5 мы поставили 26 ноты немного транспонировались вниз, но за то мы получили меньшие погрешности частоты между нотами относительно друг друга.

3 октава Частота n XH XL
H си 74 1869,1588785047 640 2 128
A#/Hb   73 1762,1145374449 679 2 167
A ля 72 1664,3550624133 719 2 207
G#/Ab   71 1570,6806282723 762 2 250
G соль 70 1483,3127317676 807 3 39
F#/Gb   69 1398,6013986014 856 3 88
F фа 68 1320,1320132013 907 3 139
E ми 67 1246,1059190031 961 3 193
D#/Eb   66 1176,4705882353 1018 3 250
D ре 65 1110,0832562442 1079 4 55
C#/Db   64 1048,0349344978 1143 4 119
C до 63 989,2827699918 1211 4 187
H си 62 933,8521400778 1283 5 3
A#/Hb   61 881,7046289493 1359 5 79
A ля 60 832,1775312067 1440 5 160
G#/Ab   59 785,3403141361 1526 5 246
G соль 58 741,1982705374 1617 6 81
F#/Gb   57 699,7084548105 1713 6 177
F фа 56 660,4292790314 1815 7 23
E ми 55 623,3766233766 1923 7 131
D#/Eb   54 588,2352941176 2038 7 246
D ре 53 555,2984729292 2159 8 111
C#/Db   52 524,0174672489 2288 8 240
C до 51 494,6413849959 2424 9 120
H си 50 466,9260700389 2568 10 8
A#/Hb   49 440,6904149835 2721 10 161
A ля 48 415,9445407279 2883 11 67
G#/Ab   47 392,6701570681 3054 11 238
G соль 46 370,5991352687 3236 12 164
F#/Gb   45 349,8542274052 3428 13 100
F фа 44 330,2146395157 3632 14 48
E ми 43 311,6883116883 3848 15 8
D#/Eb   42 294,1897523903 4077 15 237
D ре 41 277,6492364646 4320 16 224
C#/Db   40 262,0659532649 4577 17 225
C до 39 247,3716759431 4849 18 241
H си 38 233,4630350195 5138 20 18
A#/Hb   37 220,3856749311 5443 21 67
A ля 36 208,0083203328 5767 22 135
G#/Ab   35 196,335078534 6110 23 222
G соль 34 185,2995676343 6474 25 74
F#/Gb   33 174,90161784 6859 26 203
F фа 32 165,0846058605 7267 28 99
E ми 31 155,8239189716 7699 30 19
D#/Eb   30 147,0768476529 8157 31 221
D ре 29 138,8246182323 8642 33 194
C#/Db   28 131,0329766325 9156 35 196
C до 27 123,6730907967 9701 37 229
Малая октава Частота n XH XL

La Peregrinaction