|
|
  |
Не обнуляется счётчик Сторожевого таймера |
|
|
|
Jul 4 2011, 18:56
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Здравствуйте ! Подскажите, пожалуйста, может быть есть кто сталкивался с подобной проблемой программирования на СИ в WinAVR или AVRstudio 4.15 AvrGCC. Вобщем не могу понять в чем причина сбрасывания микроконтроллера (после прошивки) при раскомментировании строки инициализации Сторожевого таймера в функции "AtMega128_PHR_RegulatorInit();" Для сброса сторожевого таймера использую стандартную функцию "wdt_reset();" из файла <avr/wdt.h>:rolleyes: Весь проект в папке "AvrStudio4.15". Не пойму в чем дело. Как будто функция не сбрасывает сторожевой таймер И то же самое происходит при использовании стандартных фунций из файла <util/delay.h> когда начинаешь их использовать в основном файле программы "PH_Regulator_PHR_04_02.c" такие функции как _delay_ms();, _delay_us();. Причем подобные проблемы возникают и в WinAVR... то же самое. Для того что бы открыть проект в WivAVR нужно просто открыть файл "PH_Regulator_PHR_04_02.c" в архиве с проектом. Если кто сталкивался подскажите в чём дело. Сам чувствую, что проблема из-за софта для программирования или что то не правильно подключил в исходниках.
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 6 2011, 16:58
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Цитата(Палыч @ Jul 5 2011, 11:32)  Как сброс WDT по Вашему мнению должен работать, если 1. Вызов wdt_reset() закоментирован 2. Даже, если его раскоментировать: находится этот вызов в функции ZumerOut (другого вызова я не нашёл); функция ZumerOut ни откуда не вызывается, поэтому сброса WDT не производится. Да нет, как бы это сказать правильнее... Вобщем если в функции "AtMega128_PHR_RegulatorInit();" раскоментировать любую ещё одну строку или две то микроконтроллер сбрасывается и начинает выполнение кода снова. Как будто стек что ли забивается или ещё что. Очень похоже на сброс от ватчдога, но на днях разобрался что он не причём. Вобщем каждый день сижу часов по пять и никак не въеду. На настоящий момент код выглядит вот так..  Как бы сказать, получается, что не могу набить потолще функцию "AtMega128_PHR_RegulatorInit();" не понимаю чем глюк обусловлен Вот этот рисунок посмотрите плиз там сам пример и вопрос.
Сообщение отредактировал MaksimYrievich - Jul 6 2011, 16:43
Эскизы прикрепленных изображений
|
|
|
|
|
Jul 6 2011, 19:29
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Нет не заметил. Или не понял о чём вы говорите. Инициализация сторожевого таймера происходит в главной функции и происходит после выполнения подпрограмм инициализации микроконтроллера и дисплея и МК до нее просто не доходит. Я же выше писал точнее рисунком показывал где заканчивается выполнение программы. Выполнение программы микроконтроллером заканчивается внутри функции "DisplayInit();". Причём так как указано в сообщении №3. Там рисунок и на нем указана проблема, для примера. Просто обратите внимание на порядок выполнения подпрограммы "DisplayInit();". Создается впечатление, что при выходе из подпрограммы "ComDispInit() " микроконтроллер сразу переходит на ресет. Вот версия проекта которая в отладке не сбрасывается. Вы правы подпрограмма "ZumerOut" слишком длинная и я в нее внес просто сброс сторожевого таймера и всё стало ништяк. Но это всё не решает более серьёзной, обозначенной выше проблемы Палыч...
|
|
|
|
|
Jul 6 2011, 19:44
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Цитата(Палыч @ Jul 6 2011, 23:40)  разбиритесь с тем, что нужно сделать для нормальной работы функций _delay_; Палыч, а что Вам не нравится про _делай_. Может быть я действительно что то не учёл или не знаю или не так подключил из файлов. Поясните пожалуйста, что Вы имеете конкретно ввиду?
|
|
|
|
|
Jul 6 2011, 20:01
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(MaksimYrievich @ Jul 6 2011, 23:44)  что Вам не нравится про _делай_ Могу только Вас процитировать Цитата то же самое происходит при использовании стандартных фунций ... _delay_ms();, _delay_us();. Как я себе понимаю, Вы не разобрались с правильным их использованием, и они отмеряют совсем не то время, что задано. Я не знаю точно, как в gcc правильно использовать эти функции (и поэтому подсказать не могу)... Но, например, для правильной их работы необходимо сообщить транслятору частоту тактового генератора - я не заметил: где это Вы делаете?
|
|
|
|
|
Jul 6 2011, 20:13
|
Частый гость
 
Группа: Участник
Сообщений: 79
Регистрация: 10-08-09
Пользователь №: 51 828

|
Цитата(Палыч @ Jul 7 2011, 00:01)  Я не знаю точно, как в gcc правильно использовать эти функции (и поэтому подсказать не могу)... Но, например, для правильной их работы необходимо сообщить транслятору частоту тактового генератора - я не заметил: где это Вы делаете? А в чём Вы работаете? А то я уже устал с этим WinAVR и AVRStudio. Кошмар какой то не победимый!. Кстати при явном объявлении частоты проца ничего не изменяется - я пробовал, только лишняя ругань появляется о переопределении частоты МК. Частота мной выставляется в опциях компилятора.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|