В этой статье мы приводим листинг программы для ATtiny13 на ассемблере. В этой программе таймер счетчик ATtiny13 используется для отсчета длительности полупериода звукового сигнала. Уровень сигнала на выводе PB3 микроконтроллера инвертируется по прерыванию таймера/счетчика.

;******************************************************************************
;********** Прерывание 3 Переполнение таймера/счетчика ТО ATtiny13 ************
;***** Created: 2015-03-18 02:04 ******** Site: http://integrator.adior.ru ****
;******************************************************************************
.includepath "/home/dior/AVR"		; Папка с файлами заголовками         
.include "tn13def.inc"			; Используем ATtiny13                 
;==============================================================================
	.macro prescal0
		ldi r23, 0		; Таймер/счетчик остановлен
		out TCCR0B, r23		; Установка предделителя таймера/счетчика
	.endm
	.macro prescal1
		ldi r23, 1		; Предделитель на 1
		out TCCR0B, r23		; Установка предделителя таймера/счетчика
	.endm
	.macro prescal2
		ldi r23, 2		; Предделитель на 8
		out TCCR0B, r23		; Установка предделителя таймера/счетчика
	.endm
	.macro prescal3
		ldi r23, 3		; Предделитель на 64
		out TCCR0B, r23		; Установка предделителя таймера/счетчика
	.endm
	.macro prescal4
		ldi r23, 4		; Предделитель на 256
		out TCCR0B, r23		; Установка предделителя таймера/счетчика
	.endm
	.macro prescal5
		ldi r23, 5		; Предделитель на 1024
		out TCCR0B, r23		; Установка предделителя таймера/счетчика
	.endm
;==============================================================================
	.cseg
	.org $000
		rjmp reset		; 0 начало программы
		reti			; 1 Внешнее прерывание 0
		reti			; 2 Прерывание по изменению состояния выводов
		rjmp timer		; 3 Переполнение таймера/счетчика ТО
		reti			; 4 EEPROM готово
		reti			; 5 Аналоговый компаратор
		reti			; 6 Совпадение А таймера/счетчика ТО
		reti			; 7 Совпадение В таймера/счетчика ТО
		reti			; 8 Тайм-аут сторожевого таймера
		reti			; 9 Преобразование АЦП завершено
reset:
		ldi r23, RAMEND		; Загрузить в R23 адрес последней ячейки памяти
		out SPL, r23		; Инициализация стека
		ldi r23, 2		; Установка бита
		out TIMSK0, r23		; Разрешить прерывание по переполнению таймера/счетчика ТО
		prescal3		; Установка предделителя таймера счетчика
		sei			; Разрешить прерывания
main:
		sbi DDRB, DDB3		; PB3 будет работать на выход
		sbi PORTB, PORTB3	; PB3 установить уровень 1
		in r23, PORTB		; Загрузить в R23 PORTB

stop:		rjmp stop		; Цикл в ожидании прерывания

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

timer:					; Прерывание по переполнению таймера/счетчика ТО
		swap r23		; Поменять местами полубайты в r23
		out PORTB, r23		; Инвертировать сигнал на PB2
		reti			; Возврат из прерывания

;==============================================================================
; Задействованы регистры R23

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

Выбор частоты звукового сигнала осуществляется изменением коэффициента деления предделителя таймера счетчика. С помощью регистра TCCR0B коэффициент деления тактовой частоты микроконтроллера для таймера счетчика может быть выбран из следующих значений 1, 8, 64, 256, 1024.

Подробнее об таймер/счетчике ATtiny13 можно прочитать в статье Таймер - счетчик T0 микроконтроллера ATtiny13.