Цитата(Neutron @ Jun 24 2008, 11:17)

Помогите пожалуйста!
Никак не могу запустить прерывание по watchdog на Tiny2313. Сбросы работают а прерывания ни в какую.

Мне нужно чтобы при малом потреблении во время спячки прерывания происходили с частотой ~20 Гц.
Заинтересовала тема, написал тестовую программку, все заработало как и должно
Сперва прочитайте в даташите все про ВДТ, а не только описание регистра управления
Если после этого в моей программе что-то будет непонятно, обращайтесь
объясню более подробно.
Код
; логика работы тестовой программы
; 1. Инициализировать необходимые регистры
; 2. По прерыванию от ВДТ инвертировать PD1
; 3. По выходу из режима СЛИП инвертировать PD1
; 4. Выполнять пункты 2 и 3 пока есть питание и нет сброса
; Таймаут ВДТ 32 мс.
; в результате получаем на ноге PD1 (3 нога котроллера)
; меандр с периодом прблизительно 64 мс, на ноге PD2 меандр
; с тем же периодом, но в противофазе отностильно первого
.include "tn2313def.inc"
.org 0
rjmp start
.org WDTaddr; Watchdog Timer Overflow
sbi pind, pd1; переворачиваем значение на ноге
reti
.org 0x20;
start:
;стек
ldi r16, low(RAMEND)
out spl, r16
; настраиваем нужные пины на выход
clr r16
sbr r16, (1<<pd2)|(1<<pd1)
out ddrd, r16
; инициализируем ватч дог таймер
; Turn off global interrupt
cli
; Reset Watchdog Timer
wdr
; Clear WDRF in MCUSR
in r16, MCUSR
cbr r16, (1<<WDRF)
out MCUSR, r16
; записываем логические единицы to WDCE and WDE
; это необходимо для дальнейших операций с регистром WDTCSR
; Write logical one to WDCE and WDE
; Keep old prescaler setting to prevent unintentional time-out
in r16, WDTCSR
ori r16, (1<<WDCE) | (1<<WDE)
out WDTCSR, r16; с этого момента до записи в регистр новых значений
; должно пройти не более четырех тактов
; Сбрасываем флаг прерываний ВДТ, разрешаем прерывания от ВДТ
; устанавливаем необходимый коэффициент деления
sbr r16, (1<<wdif)|(1<<WDIE)|(1<<WDP0)
; запрещаем сброс от ВДТ
cbr r16, (1<<WDE)
; (вообще желательно конечно здесь производить запись в r16 одной
; командой например ldi r16, const, но что-то было лень считать константу)
; собственно применяем изменения
out WDTCSR, r16
; вскидываем бит на нужной ноге
sbi portd, pd2
; устанавливаем слип мод и разрешаем слип
in r16, mcucr
sbr r16, (1<<SE)|(1<<SM1)
out mcucr, r16
sei
met1:
sleep ; засыпаем
sbi pind, pd2; "переворачиваем" значение на ноге
rjmp met1; бесконечный цикл
Извиняюсь за безобразное оформление кода, на скорую руку делал, поэтму мне должны быть скидки