Модернизируем программу мигающую светодиодом в программу генератор звука. Фактически, программа мигающая светодиодом — это генератор прямоугольных импульсов инфра-низкой частоты. А нам нужно написать программу генерирующую сигнал в звуковом диапазоне 20 Гц ÷ 20000 Гц.

Пишем программу генератор звука для микроконтроллера ATtiny13. Эта программа, так же, будет работать и на других микроконтроллерах серии ATtiny или ATMega фирмы ATMEL. Только, не забудьте подключить в свою программу, соответствующий вашему микроконтроллеру, inc файл.

Исходная программа blink. Обратите внимание, время задержки между включением/выключением светодиода определяется 3-х  байтовым числом R23:R25:R24 и может быть определена в пределах от 65536 до 16777216 циклов.

.includepath "inc/" 
.include "tn13def.inc" 

.EQU pin=4 
            sbi DDRB, pin 

loop:       sbi PORTB, pin 
            ldi r23, 1 
            rcall delaytime 

            cbi PORTB, pin 
            ldi r23, 20 
            rcall delaytime 

            rjmp loop 

; Подпрограммы 
delaytime:                      ; Задержка 
            sbiw r25:r24,1 
            sbci r23,0 
            brcc delaytime 
            ret

 Модернизируем программу blink, таким образом, что бы длительность задержки определялась 2-х байтовым числом, а не 3-х байтовым, как в предыдущем листинге.

.includepath "inc/" 
.include "tn13def.inc" 

.EQU pin=4 
            sbi DDRB, pin 

loop:       sbi PORTB, pin 
;            ldi r23, 1 
            rcall delaytime 

            cbi PORTB, pin 
;            ldi r23, 20 
            rcall delaytime 

            rjmp loop 

; Подпрограммы 
delaytime:                      ; Задержка 
            sbiw r25:r24,1 
;            sbci r23,0 
            brcc delaytime 
            ret

Удалим из программы лишние строки. 

.includepath "inc/" 
.include "tn13def.inc" 

.EQU pin=4 
            sbi DDRB, pin 

loop:       sbi PORTB, pin 
            rcall delaytime 
            cbi PORTB, pin 
            rcall delaytime 
            rjmp loop 

; Подпрограммы 
delaytime:                      ; Задержка 
            sbiw r25:r24,1 
            brcc delaytime 
            ret

 Частота звука получилась слишком низкой. Для повышения частоты генератора нам необходимо еще уменьшить время задержки в цикле. То есть вычитать 1 из числа меньшего чем 65536. Длительность задержки будем загружать в регистровую пару X.

.includepath "inc/" 
.include "tn13def.inc" 

.EQU pin=4 
            sbi DDRB, pin 
            ldi XL, 79 
            ldi XH, 5 

loop:       movw YL, XL 
            sbi PORTB, pin 
            rcall delaytime 

            movw YL, XL 
            cbi PORTB, pin 
            rcall delaytime 

            rjmp loop 

; Подпрограммы 
delaytime:                      ; Задержка 
            sbiw YH:YL,1 
            brcc delaytime 
            ret

Удаляем подпрограмму.

.includepath "inc/" 
.include "tn13def.inc" 

.EQU pin=4 
            sbi DDRB, pin 
            ldi XL, 79 
            ldi XH, 5 

loop:       movw YL, XL 
            sbi PORTB, pin 
;            rcall delaytime 
half1:                      ; Задержка 
            sbiw YH:YL,1 
            brcc half1 

            movw YL, XL 
            cbi PORTB, pin 
;            rcall delaytime 
half2:                      ; Задержка 
            sbiw YH:YL,1 
            brcc half2 
            rjmp loop

Выравниваем длительность полу периодов звуковых колебаний.

.includepath "inc/" 
.include "tn13def.inc" 

.EQU pin=4 
            sbi DDRB, pin 
            ldi XL, 79 
            ldi XH, 5 

play:       movw YL, XL 
            sbi PORTB, pin 
half1:      sbiw YH:YL,1 
            brcc half1 
            nop 
            nop 
            movw YL, XL 
            cbi PORTB, pin 
half2:      sbiw YH:YL,1 
            brcc half2 
            rjmp play

Скомпилиуйте эту программу и загрузите прошивку в микроконтроллер. Проверить работоспособность программы можно, подключив через усилитель динамик на порт PB4 (3-я ножка микроконтроллера ATtiny13).