Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с WDT
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
TamTam
Если я все правильно понима то данная строка
Код
WDTCR=0x08;
Код
WDTCR=0x08;

включает WDT \ 8 от частоты

Запускаю CVAVR , и в визарде создаю новый проджект, ниже код
Код
#include <90s2313.h>
#include <delay.h>

// Declare your global variables here
#define TOCH_MEMORY_LED_ON      PORTB |= (1<<0);           // Включить индикатор (подключенный к PB0)
#define TOCH_MEMORY_LED_OFF     PORTB &= ~(1<<0);          // Выключить индикатор (подключенный к PB0)
#define TOCH_MEMORY_LED_INV     PORTB ^= (1<<0);           // Инверсия индекатора (подключенный к PB0)

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0
PORTB=0x00;
DDRB=0x01;

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/16k
WDTCR=0x08;

while (1)
      {
      // Place your code here
      delay_ms(500);
                          TOCH_MEMORY_LED_ON;
      };
}


если я правильно понимаю свето диод должен перемаргивать, ведь я не обнуляю счетчик.

Но он все время горит

В чем прикол ???
S_agent
Ваша программа не доходит до
Код
TOCH_MEMORY_LED_ON;

, так как
Код
delay_ms(500);
более длительная задержка по сравнению с периодом WDT. Он ресетит ранее чем Вы измените состояние порта.
Корректнее данную задачу решать с помощью прерываний по таймеру.
В кожевижн должен быть пример, посмотрите.
\cavr\example\Led
beer_warrior
Если предполагать, что светодиод подключен анодом на +5, то PORTB=0
дает ответ.
otrog
Цитата(S_agent @ May 31 2006, 14:57) *
Ваша программа не доходит до
Код
TOCH_MEMORY_LED_ON;

, так как
Код
delay_ms(500);
более длительная задержка по сравнению с периодом WDT. Он ресетит ранее чем Вы измените состояние порта.

Если посмотреть ассемблерный листинг, сгенерированный CV-м, то видно что в функциях delay происходит сброс WDT-а.

А прикол в том, что нужно написать
Код
PORTB=0x01;

А вместо
Код
delay_ms(500);

Использовать например
Код
unsigned int i;
for(i=0;i<0xFFFF;i++){}

Успехов.
TamTam
МНЕ ЭТО НУЖНО НЕ ДЛЯ МОРГАНИЯ, просто в один прекрасны момент я понял что собака не работает и начал с преметива.

итак попробую объяснить

1. ремлю строку
Код
  TOCH_MEMORY_LED_ON;


результат светодиод не горит.

2. следующие изменения

Код
//      delay_ms(500);
                          TOCH_MEMORY_LED_ON;


Результат - судорожное перемаргивание светодиода

но если код не изменять то диод светиться постоянно.
S_agent
то что delay_ms() wdr обнуляет не знал, точнее не задумывался smile.gif , но
Цитата(otrog @ May 31 2006, 14:15) *
Код
PORTB=0x01;
.......
unsigned int i;
for(i=0;i<0xFFFF;i++){}

То же видимых результатов не даст - слишком короткий импульс на гашение СД-а , разве что на осцилографе можно будет увидеть. Да и лучше так не делать.

ИМХО лучше все таки через прерывания, или так, если надобно ток светодиодом поморгать:
Код
....
while(1)
{
  delay_ms(500)
  PORTB ^= 0x01;
}
TamTam
Цитата(otrog @ May 31 2006, 15:15) *
Цитата(S_agent @ May 31 2006, 14:57) *

Ваша программа не доходит до
Код
TOCH_MEMORY_LED_ON;

, так как
Код
delay_ms(500);
более длительная задержка по сравнению с периодом WDT. Он ресетит ранее чем Вы измените состояние порта.

Если посмотреть ассемблерный листинг, сгенерированный CV-м, то видно что в функциях delay происходит сброс WDT-а.

А прикол в том, что нужно написать
Код
PORTB=0x01;

А вместо
Код
delay_ms(500);

Использовать например
Код
unsigned int i;
for(i=0;i<0xFFFF;i++){}

Успехов.



кстати строка
Код
TOCH_MEMORY_LED_ON;

// Описана в дефайне и делает роде самое что и

PORTB=0x01;


а вот за пояснения по делай огромное спасибо.

Мне вот интересно как можно подвесить мк чтоб проверить работает собака или нет
S_agent
2 TamTam.
Это говорит о том что wdt исправен smile.gif
TamTam
Цитата(S_agent @ May 31 2006, 15:35) *
2 TamTam.
Это говорит о том что wdt исправен smile.gif

именно так

воспользовавшись вашим примеро
Код
unsigned int i;
for(i=0;i<0xFFFF;i++)
{
                          TOCH_MEMORY_LED_ON;
}


я увидел долгожданное диод всеравно перемаргивает что говорит о том что мк ресетится





и последний вопрос по WDT а можноли както записывать кудато сколько раз сработал WDT ???
Pyku_He_oTTyda
Цитата
Если посмотреть ассемблерный листинг, сгенерированный CV-м, то видно что в функциях delay происходит сброс WDT-а.


Интересно, я этого не знал, что delay сбрасывает WDT, хотя по логике вещей так и должно быть
IgorKossak
Цитата(TamTam @ May 31 2006, 14:44) *
... а можноли както записывать кудато сколько раз сработал WDT ???

Обьявить __no_init переменную, и всякий раз при рестарте её инкрементировать.
Причину рестарта (в том числе и по вотчдогу) можно выяснить прочитав регистр MCUCSR (это в ATmega128, а как в Вашем случае - не знаю).
TamTam
Цитата(IgorKossak @ May 31 2006, 15:54) *
Цитата(TamTam @ May 31 2006, 14:44) *

... а можноли както записывать кудато сколько раз сработал WDT ???

Обьявить __no_init переменную, и всякий раз при рестарте её инкрементировать.
Причину рестарта (в том числе и по вотчдогу) можно выяснить прочитав регистр MCUCSR (это в ATmega128, а как в Вашем случае - не знаю).


А можно по подробнее, если я не ошибаюсь то __no_init это по яровски или нет, Юзаю CVAVR

и как туда писать, добавить строку инкремента в момент загрузки проца, или можно както перед его ресетом ???


Желательно кусок кода
IgorKossak
Цитата(TamTam @ May 31 2006, 15:14) *
А можно по подробнее, если я не ошибаюсь то __no_init это по яровски или нет, Юзаю CVAVR
и как туда писать, добавить строку инкремента в момент загрузки проца, или можно както перед его ресетом ???

Желательно кусок кода

CVAVR не использую, но в документации на компилятор должно быть написано как обьявить неинициализируемые переменные.

Перед ресетом??? А как это можно спрогнозировать? wink.gif

Что касается "куда вставить", то это как можно раньше. Например в самом начале функции main, в том месте, которое выполняется только один раз. Ну а лучше всего - до выполнения внутренней функции C_Startup в функции low_level_init (названия опять же из IAR, но в CVAVR должны быть аналогичные).
otrog
Цитата(IgorKossak @ May 31 2006, 15:54) *
Цитата(TamTam @ May 31 2006, 14:44) *

... а можноли както записывать кудато сколько раз сработал WDT ???

Обьявить __no_init переменную, и всякий раз при рестарте её инкрементировать.
Причину рестарта (в том числе и по вотчдогу) можно выяснить прочитав регистр MCUCSR (это в ATmega128, а как в Вашем случае - не знаю).

Насколько я знаю, при подаче питания на ОЗУ, в его ячейках будет мусор. Поэтому компилятор обнуляет все ячейки после старта, если они конкретно не заданы. Если использовать неинициализированную переменную, то после подачи питпния в ней будет произвольное число. Дабы это подавить можно использовать что-то типа контрольной переменной, значение которой поставлено в строгую зависимость от контролируемой переменной. Например XOR-ить.
А при старте программы XOR-нуть контролируемую переменную и сравнить с контролирующей. Если не совпали, значит или первое включение или нарушена целостность данных. Ну а дальше действовать по усмотрению.

ПС В CV так и не нашел как обьявить __no_init переменную.

Цитата(TamTam @ May 31 2006, 15:44) *
воспользовавшись вашим примеро
Код
unsigned int i;
for(i=0;i<0xFFFF;i++)
{
                          TOCH_MEMORY_LED_ON;
}

я увидел долгожданное диод всеравно перемаргивает что говорит о том что мк ресетится

Нужно сделать:
Код
  for(i=0;i<0xFFFF;i++){}
  TOCH_MEMORY_LED_ON;

Тогда светиться не будет.
IgorKossak
Речь шла не о подаче питания, а о рестарте по вотчдогу.

Если же устройство может быть обесточено, то такую переменную можно держать во внутренней\внешней ЕЕПРОМ или другой энергонезависимой памяти.
otrog
Цитата(IgorKossak @ Jun 1 2006, 15:33) *
Речь шла не о подаче питания, а о рестарте по вотчдогу.

Но когда-то же оно было включено. Именно эту ситуацию надо обрабатывать.
IgorKossak
Цитата(otrog @ Jun 1 2006, 14:46) *
Цитата(IgorKossak @ Jun 1 2006, 15:33) *

Речь шла не о подаче питания, а о рестарте по вотчдогу.

Но когда-то же оно было включено. Именно эту ситуацию надо обрабатывать.

Если контролировать эту переменную надо не автоматически, а, скажем так, визуально, например, выводя её значение на LCD или в UART, то этими же средствами можно и задать начальное значение (сбросить).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.