реклама на сайте
подробности

 
 
> Прерывание в Tiny по WDT
Neutron
сообщение Jun 24 2008, 07:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 1-10-07
Пользователь №: 30 960



Помогите пожалуйста!
Никак не могу запустить прерывание по watchdog на Tiny2313. Сбросы работают а прерывания ни в какую. help.gif Мне нужно чтобы при малом потреблении во время спячки прерывания происходили с частотой ~20 Гц.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
smac
сообщение Jun 24 2008, 14:36
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 2-06-08
Из: Москва
Пользователь №: 38 003



Цитата(Neutron @ Jun 24 2008, 11:17) *
Помогите пожалуйста!
Никак не могу запустить прерывание по watchdog на Tiny2313. Сбросы работают а прерывания ни в какую. help.gif Мне нужно чтобы при малом потреблении во время спячки прерывания происходили с частотой ~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; бесконечный цикл


Извиняюсь за безобразное оформление кода, на скорую руку делал, поэтму мне должны быть скидки smile.gif
Go to the top of the page
 
+Quote Post
Neutron
сообщение Jun 25 2008, 09:23
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 1-10-07
Пользователь №: 30 960



Спасибо, smac, за ответ. Прерывания действительно заработали!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 07:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01373 секунд с 7
ELECTRONIX ©2004-2016