В одном из режимов работы сторожевого таймера (Watchdog) ATtiny13 по истечении времени ожидания возникает прерывание 8 "Тайм-аут сторожевого таймера". Это прерывание можно использовать, например, для ограничения времени выполнения циклического участка программы.
;****************************************************************************** ;************* Генератор звука на таймере/счетчике ТО ATtiny13 **************** ;***** Created: 2015-03-18 02:04 ******** Site: http://integrator.adior.ru **** ;****************************************************************************** .includepath "/home/dior/AVR" ; Папка с файлами заголовками .include "tn13def.inc" ; Используем ATtiny13 ;============================================================================== ; Макросы для предделителя таймера/счетчика T0 .macro prescal0 ldi r22, 0 ; Таймер/счетчик остановлен .endm .macro prescal1 ldi r22, 1 ; Предделитель на 1 .endm .macro prescal2 ldi r22, 2 ; Предделитель на 8 .endm .macro prescal3 ldi r22, 3 ; Предделитель на 64 .endm .macro prescal4 ldi r22, 4 ; Предделитель на 256 .endm .macro prescal5 ldi r22, 5 ; Предделитель на 1024 .endm ; Макросы для установки периода сторожевого таймера .macro watchdog0 ldi r20, 64 ; Период сторожевого таймера 16 мс .endm .macro watchdog1 ldi r20, 65 ; Период сторожевого таймера 32 мс .endm .macro watchdog2 ldi r20, 66 ; Период сторожевого таймера 64 мс .endm .macro watchdog3 ldi r20, 67 ; Период сторожевого таймера 125 мс .endm .macro watchdog4 ldi r20, 68 ; Период сторожевого таймера 250 мс .endm .macro watchdog5 ldi r20, 69 ; Период сторожевого таймера 500 мс .endm .macro watchdog6 ldi r20, 70 ; Период сторожевого таймера 1000 мс .endm .macro watchdog7 ldi r20, 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, DDB0 ; PB0 будет работать на выход ldi r23, 66 ; Установка битов COM0A0, WGM01 out TCCR0A, r23 ; Подключение таймера/счетчика к выводу PB0/OC0A ldi r19, 24 ; Установка WDE и WDCE (разрешение изменения конфигурации watchdog) main: prescal3 ; Установка предделителя таймера/счетчика ldi r23, 255 ; Установка значения частоты сигнала watchdog6 ; Выбор длительности звучания rcall play prescal0 ; Таймер/счетчик будет остановлен rcall play stop: rjmp stop ; Бесконечный цикл ;============================================================================== ; Подпрограммы, обработчики прерываний play: out WDTCR, r19 ; Разрешение изменения конфигурации watchdog out WDTCR, r20 ; Установка периода сторожевого таймера sei ; Разрешить прерывания out TCCR0B, r22 ; Установка предделителя таймера/счетчика out OCR0A, r23 ; Загрузка значения частоты сигнала ldi r21, 0 ; R21 будет использоваться как условие цикла loop: tst r21 ; проверка регистра R21 breq loop ; цикл пока R21=0, в ожидании прерывания сторожевого таймера ret ; Возврат из подпрограммы watchdog: ; Тайм-аут сторожевого таймера ldi r21, 1 ; R22=1 условие выхода из цикла reti ; Возврат из прерывания ;============================================================================== ; Задействованы регистры: ; R23 значение частоты сигнала f=Fclk/2N(1+R23), где N - коэффициент деления предделителя ; R22 значение для предделителя таймера/счетчика ; R21 условие цикла ; R20 время задержки сторожевого таймера ; R19 разрешение изменения конфигурации watchdog ; Компилировать 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
В этой программе таймер/счетчик генерирует низкочастотный сигнал, который можно услышать подключив динамик к выводу PB0/OC0A микроконтроллера ATtiny13. Выполнение программы зацикливается командой breq loop. По истечению тайм-аута сторожевого таймера возникает прерывание. Выполняется программа обработчик прерывания watchdog в которой в регистр R21 помещается значение, являющееся условием выхода из цикла breq loop. Завершается выполнение обработчика прерывания, подпрограммы play и продолжается выполнение основной программы main. Следующая команда программы main устанавливает параметры для выключения генератора низкой частоты.