|
Помогите разобраться с WDT |
|
|
|
May 31 2006, 10:35
|

Местный
  
Группа: Свой
Сообщений: 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; }; } если я правильно понимаю свето диод должен перемаргивать, ведь я не обнуляю счетчик. Но он все время горит В чем прикол ???
|
|
|
|
|
May 31 2006, 10:57
|

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

|
Ваша программа не доходит до Код TOCH_MEMORY_LED_ON; , так как Код delay_ms(500); более длительная задержка по сравнению с периодом WDT. Он ресетит ранее чем Вы измените состояние порта. Корректнее данную задачу решать с помощью прерываний по таймеру. В кожевижн должен быть пример, посмотрите. \cavr\example\Led
|
|
|
|
|
May 31 2006, 11:15
|
Местный
  
Группа: Свой
Сообщений: 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++){} Успехов.
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
|
May 31 2006, 11:20
|

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

|
МНЕ ЭТО НУЖНО НЕ ДЛЯ МОРГАНИЯ, просто в один прекрасны момент я понял что собака не работает и начал с преметива. итак попробую объяснить 1. ремлю строку Код TOCH_MEMORY_LED_ON; результат светодиод не горит. 2. следующие изменения Код // delay_ms(500); TOCH_MEMORY_LED_ON; Результат - судорожное перемаргивание светодиода но если код не изменять то диод светиться постоянно.
|
|
|
|
|
May 31 2006, 11:32
|

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

|
то что delay_ms() wdr обнуляет не знал, точнее не задумывался  , но Цитата(otrog @ May 31 2006, 14:15)  Код PORTB=0x01; ....... unsigned int i; for(i=0;i<0xFFFF;i++){} То же видимых результатов не даст - слишком короткий импульс на гашение СД-а , разве что на осцилографе можно будет увидеть. Да и лучше так не делать. ИМХО лучше все таки через прерывания, или так, если надобно ток светодиодом поморгать: Код .... while(1) { delay_ms(500) PORTB ^= 0x01; }
|
|
|
|
|
May 31 2006, 11:35
|

Местный
  
Группа: Свой
Сообщений: 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; а вот за пояснения по делай огромное спасибо. Мне вот интересно как можно подвесить мк чтоб проверить работает собака или нет
|
|
|
|
|
May 31 2006, 11:44
|

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

|
Цитата(S_agent @ May 31 2006, 15:35)  2 TamTam. Это говорит о том что wdt исправен  именно так воспользовавшись вашим примеро Код unsigned int i; for(i=0;i<0xFFFF;i++) { TOCH_MEMORY_LED_ON; } я увидел долгожданное диод всеравно перемаргивает что говорит о том что мк ресетится и последний вопрос по WDT а можноли както записывать кудато сколько раз сработал WDT ???
|
|
|
|
|
May 31 2006, 12:14
|

Местный
  
Группа: Свой
Сообщений: 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 и как туда писать, добавить строку инкремента в момент загрузки проца, или можно както перед его ресетом ??? Желательно кусок кода
|
|
|
|
|
May 31 2006, 13:08
|

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

|
Цитата(TamTam @ May 31 2006, 15:14)  А можно по подробнее, если я не ошибаюсь то __no_init это по яровски или нет, Юзаю CVAVR и как туда писать, добавить строку инкремента в момент загрузки проца, или можно както перед его ресетом ???
Желательно кусок кода CVAVR не использую, но в документации на компилятор должно быть написано как обьявить неинициализируемые переменные. Перед ресетом??? А как это можно спрогнозировать? Что касается "куда вставить", то это как можно раньше. Например в самом начале функции main, в том месте, которое выполняется только один раз. Ну а лучше всего - до выполнения внутренней функции C_Startup в функции low_level_init (названия опять же из IAR, но в CVAVR должны быть аналогичные).
|
|
|
|
|
Jun 1 2006, 07:43
|
Местный
  
Группа: Свой
Сообщений: 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; Тогда светиться не будет.
--------------------
Истина рождается в спорах; но когда страсти кипят, истина испаряется.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|