|
|
  |
Внутренний Watchdog Timer на ATmega32, Непойму, но помоему, "собака" сбрасывает контроллер. |
|
|
|
Jul 25 2007, 07:21
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 20-02-07
Пользователь №: 25 515

|
Приветствую. Подскажите пожалуйста.
Имеем ATmega32. программу в Асемблере, AVR Studio4.
Гоняем программу в симуляторе. Примерно через полсекунды происходит сброс Методом научного тыка определил, что виновна "собака", т.к. если запретить ее работу, то все фунциклирует. С другой стороны, если всю программу упростить, оставив только обработку прерываний от таймера, то разрешенный WDT опять все сбрасывает примерно через полсекунды (странно, ведь WDT настроен на 2,1 сек).. Не могу понять откуда просачивается сброс. - пререывание по таймеру 100 Гц.
timer1: push tmp1 push tmp2 in tmp1,SREG push tmp1
call timer1_set call wdt_set
pop tmp1 out SREG,tmp1 pop tmp2 pop tmp1
reti
- в прерывании вызываю подпрограмму перезагрузки таймера - вызываю подпрограмму сброса WDT и его инициализации ;=================================== timer1_set: ldi tmp1,0b00000100 ;TOIE =1 разрешение прерываний от таймера out TIMSK,tmp1
ldi tmp1,0x00 ;откл. таймера1 от выводов процессора out TCCR1A,tmp1
ldi tmp1,0b00000010 ;предделитель на 8 out TCCR1B,tmp1
ldi tmp1,tmr1h ;зарузка таймера out TCNT1H,tmp1 ldi tmp1,tmr1l out TCNT1L,tmp1 ret ;===================================
wdt_set:
wdr ;сброс внутреннего WDT
ldi tmp1,0b00011111 ;инициализация внутр. WDT, разрешение работы, период 2,1 сек при питании 5 Вольт. out wdtcr,tmp1
ret ;===================================
Подскажите пожалуйста, в чем еще может быть загвоздка?
|
|
|
|
|
Jul 25 2007, 08:32
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Инициализацию "собаки" надо делать один раз вначале программы, примерно вот в этом месте: Код RESET: CLI LDI TMP1,LOW(RAMEND) ;указатель стека на последний адрес внутренней SRAM OUT SPL,TMP1 LDI TMP1,HIGH(RAMEND) ;указатель стека на последний адрес внутренней SRAM
ldi tmp1,0b00011111;инициализация внутр. WDT, разрешение работы, период 2,1 сек при питании 5 Вольт. out wdtcr,tmp1 а прерывание сделать так: Код timer1: wdr push tmp1 in tmp1,SREG push tmp1
ldi tmp1,0b00000100;TOIE =1 разрешение прерываний от таймера out TIMSK,tmp1
ldi tmp1,0x00;откл. таймера1 от выводов процессора out TCCR1A,tmp1
ldi tmp1,0b00000010;предделитель на 8 out TCCR1B,tmp1
ldi tmp1,tmr1h;зарузка таймера out TCNT1H,tmp1
ldi tmp1,tmr1l out TCNT1L,tmp1
pop tmp1 out SREG,tmp1 pop tmp1
reti Кроме того WDR должно стоять в каждом бесконечном цикле вроде: Код metka: WDR RJMP metka Удачи!
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Jul 25 2007, 08:36
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Подскажите пожалуйста, в чем еще может быть загвоздка? [/quote] Если метка Timer1 это обработка прерывания таймера, то зачем вы в таймере постоянно переустанавливаете настройки таймера и собаки?
Для перезагрузки таймера достаточно делать:
ldi tmp1,tmr1h ;зарузка таймера out TCNT1H,tmp1 ldi tmp1,tmr1l out TCNT1L,tmp1
А установку таймера и собаки желательно делать в начале выполнения всей программы. Сброс же собаки
wdr ;сброс внутреннего WDT
наверное желательно делать в главном цикле, а не в прерывании, т.к. прерывание возникнет независимо от того висит программа или нет.
|
|
|
|
|
Jul 25 2007, 09:11
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 8-01-07
Из: Одесса
Пользователь №: 24 196

|
Цитата(IEC @ Jul 25 2007, 11:36)  Подскажите пожалуйста, в чем еще может быть загвоздка?
Если метка Timer1 это обработка прерывания таймера, то зачем вы в таймере постоянно переустанавливаете настройки таймера и собаки?
Для перезагрузки таймера достаточно делать:
ldi tmp1,tmr1h ;зарузка таймера out TCNT1H,tmp1 ldi tmp1,tmr1l out TCNT1L,tmp1
А установку таймера и собаки желательно делать в начале выполнения всей программы. Сброс же собаки
wdr ;сброс внутреннего WDT
наверное желательно делать в главном цикле, а не в прерывании, т.к. прерывание возникнет независимо от того висит программа или нет. Для каждого контролируемого прерывания выделяем флаг. При проходе прерывания флаг устанавливаем. В главном цикле (с задержкой)контролируем все ли флаги установлены. Если все делаем WDR. При таком варианте невозможно зависание ни в главного цикла, ни прерывания. Сбрасываем флаги.
--------------------
Опыт - это та чудесная штука, которая позволяет вам узнать ошибку, когда вы ее повторите.
|
|
|
|
|
Jul 25 2007, 09:24
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Цитата(satellite-plus @ Jul 25 2007, 12:11)  Для каждого контролируемого прерывания выделяем флаг. При проходе прерывания флаг устанавливаем. В главном цикле (с задержкой)контролируем все ли флаги установлены. Если все делаем WDR. При таком варианте невозможно зависание ни в главного цикла, ни прерывания. Сбрасываем флаги. А память на флаги зачем портить и еще тратить на проверку? Где бы программа не зависла (в прерывании или в главном цикле), если она в течении контрольного времени не пройдет точку WDR то будет перезапущена!
|
|
|
|
|
Jul 25 2007, 09:51
|
Участник

Группа: Участник
Сообщений: 51
Регистрация: 8-01-07
Из: Одесса
Пользователь №: 24 196

|
Цитата(IEC @ Jul 25 2007, 12:24)  А память на флаги зачем портить и еще тратить на проверку? Где бы программа не зависла (в прерывании или в главном цикле), если она в течении контрольного времени не пройдет точку WDR то будет перезапущена! Программа может работать и при этом отвалится прерывание(по помехе сбросится бит в регистре отвечающим за это). Программа будет тупо молотить в главном цикле.
--------------------
Опыт - это та чудесная штука, которая позволяет вам узнать ошибку, когда вы ее повторите.
|
|
|
|
|
Jul 25 2007, 10:08
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Цитата(satellite-plus @ Jul 25 2007, 12:51)  Программа может работать и при этом отвалится прерывание(по помехе сбросится бит в регистре отвечающим за это). Программа будет тупо молотить в главном цикле. А как часто в Вашей практике "отваливалось" прерывание?
|
|
|
|
|
Jul 25 2007, 10:26
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 20-02-07
Пользователь №: 25 515

|
Спасибо всем откликнувшимся.
Но проблема-то не в том где лучше, а где хуже делать сброс WDT, с этим все понятно - сколько людей, столько и мнений.
Проблема в том, что при запуске симулятора происходит сборос, скорее всего, по WDT, после, если быть точным, 2097152 шага программы, что при 4МГц соответствует 0,524288 секунды. А WDT настроен на 2,1 сек. T.е. фактически "собака" не успевает переполниться... Но сброс на лицо. отключаем WDT - сброса нет.
Сдается мне, что симулятор глючит . Попробовал вместо ATmega32 выбрать ATmega323. Вроде все работает. Установил последнюю доступную версию AVR Studio 4.12 SP4 (до этого стояла SP2) там таже самая история.
Возможны глюки в симуляторе? Или все же я дурак? Блин, ну ошибиться-то негде.
|
|
|
|
|
Jul 25 2007, 10:33
|
Местный
  
Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598

|
Цитата(Alex2578 @ Jul 25 2007, 13:26)  Спасибо всем откликнувшимся.
Но проблема-то не в том где лучше, а где хуже делать сброс WDT, с этим все понятно - сколько людей, столько и мнений.
Проблема в том, что при запуске симулятора происходит сборос, скорее всего, по WDT, после, если быть точным, 2097152 шага программы, что при 4МГц соответствует 0,524288 секунды. А WDT настроен на 2,1 сек. T.е. фактически "собака" не успевает переполниться... Но сброс на лицо. отключаем WDT - сброса нет. Сдается мне, что симулятор глючит . Попробовал вместо ATmega32 выбрать ATmega323. Вроде все работает. Установил последнюю доступную версию AVR Studio 4.12 SP4 (до этого стояла SP2) там таже самая история.
Возможны глюки в симуляторе? Или все же я дурак? Блин, ну ошибиться-то негде. А попробуйте поставить не последнюю а раннюю версию AVRStulbo. В моей практике это сильно помогало. А лучше прошить проэкт в кристал, в начале программы дергать ногой и посмотреть - сбрасывается камень или нет.
|
|
|
|
|
Jul 25 2007, 10:48
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Цитата(Alex2578 @ Jul 25 2007, 13:26)  Сдается мне, что симулятор глючит . Попробовал вместо ATmega32 выбрать ATmega323. Вроде все работает. Установил последнюю доступную версию AVR Studio 4.12 SP4 (до этого стояла SP2) там таже самая история. Может я чего и не понял, но если идет речь о симуляторе Студии, то читаем хелп: Цитата Watchdog The Watchdog is not supported on all devices. See Device specific issues. When a watchdog reset occurs, the program will not always stop at breakpoints on the reset vector. The watchdog timer assumes a clock speed of 1MHz, timing will not be correct at other clock settings. Из чего следует, что симулятор Студии не поддерживает "собаку"  . Или я не прав?
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Jul 25 2007, 13:22
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 20-02-07
Пользователь №: 25 515

|
Полазил по хелпу AVRStudio4 SP4, действительно много где, в т.ч. и на ATmega3ХХХ WDT не симулируется. А вот на ATmega32 такого примечания нет, соответственно, должон симулироваться.
Видимо так и получается, на 323-й Меге программа симулировалась, т.к. ей WDT жить не мешал, а на 32-й Меге WDT постоянно дергался... Ну вот почему он дергался????
В общем так или иначе, добил я кусок программы, зашил его в железо. РАБОТАЕТ!!! А симулироваться при выборе ATmega32 не хочет. Видимо, всеже недоработка симулятора....
|
|
|
|
|
Jul 25 2007, 13:50
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Я обычно при отладке программы (даже на железе) вставляю код: Код ;- ОСТАНОВИТЬ СТОРОЖЕВОЙ ТАЙМЕР WDR LDI TMP1,0xFF OUT WDTCR,TMP1 ;настроить сторожевой таймер CBR TMP1,1<<WDE OUT WDTCR,TMP1 и только в окончательной редакции программы настраиваю "собаку"
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Jul 26 2007, 05:11
|
Участник

Группа: Участник
Сообщений: 50
Регистрация: 20-02-07
Пользователь №: 25 515

|
Цитата(defunct @ Jul 25 2007, 18:01)  Нашли что в симуляторе проверять... Вы б еще пожаловались что в симуляторе скачки питания не отрабатываются, и сброса по BOD нет. Ну зачем же язвить? Это и не было самой целью проверки. Просто в процессе вылез боком этот Reset, и потребовалось немало времени, чтобы понять, что это WDT виновен, а потом еще столько же времени, чтобы убедиться что это глюк симулятора.
|
|
|
|
|
Jul 26 2007, 11:23
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Alex2578 @ Jul 26 2007, 08:11)  Это и не было самой целью проверки. Просто в процессе вылез боком этот Reset, и потребовалось немало времени, чтобы понять, что это WDT виновен, Я так полагаю вы написали программу для симулятора изначально и в нем же и проверяли, отсюда и потери времени. Цитата Методом научного тыка определил, что виновна "собака", т.к. если запретить ее работу, то все фунциклирует. С другой стороны, если всю программу упростить, оставив только обработку прерываний от таймера, то разрешенный WDT опять все сбрасывает примерно через полсекунды (странно, ведь WDT настроен на 2,1 сек).. Пишите и проверяйте сразу в железе. Не будет потерь времени. Когда отлаживаете программу, WDT вообще не надо включать, он только мешает.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|