Следующая программа может пригодиться при конструировании устройств со звуковым сигналом.

Перед нами стоит задача выдать на одну из ножек микроконтроллера сигнал звуковой частоты и ограничить его звучание одной секундой.

;******************************************************************************
;******** Генератор звуковой частоты с таймером длительности звучания *********
;***** Created: 2015-02-04 00:05 ******** Site: http://integrator.adior.ru ****
;******************************************************************************
.includepath "/home/dior/AVR"		; Папка с файлами заголовками         
.include "tn13def.inc"			; Используем ATtiny13                 
;==============================================================================
;		rjmp reset		; начало программы
reset:
		ldi r23, RAMEND		; Загрузить в R23 адрес последней ячейки памяти
		out SPL, r23		; Инициализация стека
		sbi DDRB, DDB0		; PB0 будет работать на выход
		sbi DDRB, DDB4		; PB4 будет работать на выход
		ldi r23, 16		; Загрузить в R23 16
		out PORTB, r23		; PB4 установить уровень 1

main:
		ldi r25, 4		; Загрузить в регистр R25 длительность звучания
		ldi XL, 255		; Длительность полупериода (младший байт)
		ldi XH, 5		; Длительность полупериода (старший байт)
		rcall duratone		; Вызов подпрограммы генерации ноты

		cbi PORTB, PORTB0	; PB0 установить уровень 0
		cbi PORTB, PORTB4	; PB4 установить уровень 0
stop:		rjmp stop		; Останов или бесконечный цикл

; Подпрограммы

duratone:				; Подпрограмма генератор тона с таймером
					; Длительность таймера R25
					; Высота тона (точнее, длительность полупериода) XH:XL
		movw YL, XL		; ╔Загрузить в счетчик Y длительность полупериода из X
		swap r23		; ║Поменять местами полубайты в r23
		out PORTB, r23		; ║инвертировать сигналы на PB0 и PB4
halfcycle:	sbiw YH:YL,1		; ║╔Y=Y-1 (65535...0)
		brcc halfcycle		; ║╚Повторять пока не было переноса
		sbiw r25:r24,1		; ║R25:R24=R24:R24-1
		brcc duratone		; ╚Повторять пока не было переноса
		ret			; Возврат из подпрограммы


; Задействованы регистры R23, R24, R25, R26, R27, R28, R29

; Компилировать 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

У нас получилась программа, которая выдает меандр звуковой частоты на 2 ножки PB0 и PB4. Причем, сигнал на ножках в противофазе.

Проверить работу программы просто, необходимо подключить динамик или бузер через резистор сопротивлением 140 Ом на один из выводов PB0 или PB4 микроконтроллера, второй вывод динамика необходимо подключить к общему проводу.

Вам может пригодиться статья Компиляция программы на Assembler и прошивка микроконтроллера.