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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Помогите разобраться с WDT
TamTam
сообщение May 31 2006, 10:35
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Если я все правильно понима то данная строка
Код
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;
      };
}


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

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

В чем прикол ???
Go to the top of the page
 
+Quote Post
S_agent
сообщение May 31 2006, 10:57
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-10-05
Из: Ukraine, Kiev
Пользователь №: 9 300



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

, так как
Код
delay_ms(500);
более длительная задержка по сравнению с периодом WDT. Он ресетит ранее чем Вы измените состояние порта.
Корректнее данную задачу решать с помощью прерываний по таймеру.
В кожевижн должен быть пример, посмотрите.
\cavr\example\Led
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение May 31 2006, 11:01
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Если предполагать, что светодиод подключен анодом на +5, то PORTB=0
дает ответ.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
otrog
сообщение May 31 2006, 11:15
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(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++){}

Успехов.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
TamTam
сообщение May 31 2006, 11:20
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



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

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

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


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

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

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


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

но если код не изменять то диод светиться постоянно.
Go to the top of the page
 
+Quote Post
S_agent
сообщение May 31 2006, 11:32
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-10-05
Из: Ukraine, Kiev
Пользователь №: 9 300



то что 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;
}
Go to the top of the page
 
+Quote Post
TamTam
сообщение May 31 2006, 11:35
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Цитата(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;


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

Мне вот интересно как можно подвесить мк чтоб проверить работает собака или нет
Go to the top of the page
 
+Quote Post
S_agent
сообщение May 31 2006, 11:35
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-10-05
Из: Ukraine, Kiev
Пользователь №: 9 300



2 TamTam.
Это говорит о том что wdt исправен smile.gif
Go to the top of the page
 
+Quote Post
TamTam
сообщение May 31 2006, 11:44
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Цитата(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 ???
Go to the top of the page
 
+Quote Post
Pyku_He_oTTyda
сообщение May 31 2006, 11:48
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 751
Регистрация: 4-08-05
Из: Великие Луки
Пользователь №: 7 360



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


Интересно, я этого не знал, что delay сбрасывает WDT, хотя по логике вещей так и должно быть


--------------------
Андрей Смирнов
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 31 2006, 11:54
Сообщение #11


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(TamTam @ May 31 2006, 14:44) *
... а можноли както записывать кудато сколько раз сработал WDT ???

Обьявить __no_init переменную, и всякий раз при рестарте её инкрементировать.
Причину рестарта (в том числе и по вотчдогу) можно выяснить прочитав регистр MCUCSR (это в ATmega128, а как в Вашем случае - не знаю).
Go to the top of the page
 
+Quote Post
TamTam
сообщение May 31 2006, 12:14
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 293
Регистрация: 14-03-06
Пользователь №: 15 254



Цитата(IgorKossak @ May 31 2006, 15:54) *
Цитата(TamTam @ May 31 2006, 14:44) *

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

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


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

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


Желательно кусок кода
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 31 2006, 13:08
Сообщение #13


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

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

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

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

Что касается "куда вставить", то это как можно раньше. Например в самом начале функции main, в том месте, которое выполняется только один раз. Ну а лучше всего - до выполнения внутренней функции C_Startup в функции low_level_init (названия опять же из IAR, но в CVAVR должны быть аналогичные).
Go to the top of the page
 
+Quote Post
otrog
сообщение Jun 1 2006, 07:43
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 232
Регистрация: 22-02-06
Из: Воронеж
Пользователь №: 14 589



Цитата(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;

Тогда светиться не будет.


--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Jun 1 2006, 11:33
Сообщение #15


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



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

Если же устройство может быть обесточено, то такую переменную можно держать во внутренней\внешней ЕЕПРОМ или другой энергонезависимой памяти.
Go to the top of the page
 
+Quote Post

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

 


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


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