|
Опять WatchDog Timer, Atmega64 |
|
|
|
Jan 23 2013, 16:46
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
В коде программы команд сброса сторожевого таймера нет вообще, инициилизирую WD-таймер, хочу увидеть, как каждые 2 секунды будет моргать экран и инициализироваться меню, однако, после инициализации WD-таймера ничего не происходит. Что я упустил? Процессор Atmega64 Fusebits: WDTON=1 MC103=1 Код void WatchDogStart() { #asm("wdr") //на всякий случай сбросить сторожевой таймер WDTCR=0x1F; //WDCE=1, WDE=1, делитель 2 сек. WDTCR=0x0F; //WDCE=0, WDE=1, }
void WatchDogStop() { #asm("wdr") //сбросить сторожевой таймер WDTCR = 0x1F; //выключить сторожевой таймер WDTCR = 0x00; }
Сообщение отредактировал IgorKossak - Jan 23 2013, 19:56
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
Jan 23 2013, 17:16
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(AndreyVN @ Jan 23 2013, 18:46)  Что я упустил? Возможно компилятор выдал код, который выполняется слишком долго. Смотрите в дизассемблере или в симуляторе, выполняются ли требования по быстродействию. Цитата(AndreyVN @ Jan 23 2013, 18:46)  Процессор Atmega64 Fusebits: WDTON=1 MC103=1 Что вы понимаете под MC103=1? Процессор в режиме совместимости или нет? PS. Можно поробывать убрать команду сброса таймера и посмотреть будет ли тогда сбрасываться.
|
|
|
|
|
Jan 23 2013, 18:41
|

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

|
Цитата(AndreyVN @ Jan 23 2013, 20:46)  Что я упустил? Упустили значения битов WDP при установке WDCE и WDE. Посмотрите как это сделано в примере от Atmel Цитата /* Write logical one to WDCE and WDE */ WDTCR |= (1<<WDCE) | (1<<WDE); Ой, не зря это они так сделали !
|
|
|
|
|
Jan 24 2013, 04:14
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Цитата(Палыч @ Jan 23 2013, 21:41)  Упустили значения битов WDP при установке WDCE и WDE. Посмотрите как это сделано в примере от Atmel Ой, не зря это они так сделали ! Насколько я понял из описания, бит WDCE=1 разрешает изменение состояния "собаки" и сбрасывается аппаратно через 4 цикла. То есть, мой вариант манипуляции с WDTCR, вроде должен быть работоспособен. Попробую как Вы советуете... Цитата Что вы понимаете под MC103=1? Процессор в режиме совместимости или нет? Fusebits активируются нулевым уровнем. Единичка соответствует значению Unprogrammed.
|
|
|
|
|
Jan 24 2013, 04:14
|
Местный
  
Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940

|
Не парьтесь и воспользуйтесь "avr\wdt.h" : CODE ... #include <avr\wdt.h> ... ... wdt_reset(); wdt_enable(WDTO_2S); ... И по барабану, какой там AVR-процессор! И желательно включать Watchdog во Fuse-битах (включается нулем)
Сообщение отредактировал alexeyv - Jan 24 2013, 04:15
|
|
|
|
|
Jan 24 2013, 15:59
|

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

|
Цитата(AndreyVN @ Jan 24 2013, 08:14)  Насколько я понял из описания, бит WDCE=1 разрешает изменение состояния "собаки" и сбрасывается аппаратно через 4 цикла. То есть, мой вариант манипуляции с WDTCR, вроде должен быть работоспособен. Да, должен быть работоспособен... Тогда, вариант один - между двумя обращениями к регистру WDTCR проходит более 4 тактов: либо транслятор так "криво" код генерит, либо мешают разрешенные прерывания. Кстати, макросы, которые советует alexeyv, и время обращения к WDTCR выдерживают правильное и от прерываний во время своего выполнения защищены.
|
|
|
|
|
Jan 25 2013, 09:04
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Цитата(Палыч @ Jan 24 2013, 19:59)  Да, должен быть работоспособен... Тогда, вариант один - между двумя обращениями к регистру WDTCR проходит более 4 тактов: либо транслятор так "криво" код генерит, либо мешают разрешенные прерывания. Кстати, макросы, которые советует alexeyv, и время обращения к WDTCR выдерживают правильное и от прерываний во время своего выполнения защищены. Лазил по документам Atmel, советуют перед последовательностью присвоений WDTCR=0x1F; WDTCR=0x0F; запретить оптимизацию кода, иначе компилятор может две команды в одну слепить. Однако, пока ничего не получилось, не заводится WDT. Работает только вариант включения WDT через Fusebits WDTON=0. Тут все работает на ура, собачий таймер стартует по включению питания экран моргает как бешеный. Но меня этот режим не устраивает, мне надо включать таймер, только в том случае, если регистратор запущен на длительный режим сбора данных. В остальное время услуги собаки не требуются. У меня в CodeVision библиотеки wdt.h нет. Можно её где-то скачать? Цитата И желательно включать Watchdog во Fuse-битах (включается нулем) Эта фраза не понятна, в Fusebits можно выбрать разные режимы безопасности, но во всех режимах можно включить WDT командой или последовательностью команд. Может помимо WDTON и MC103 есть еще какой-то Fusebits, влияющий на работу WD-таймера, который я не заметил?
|
|
|
|
|
Jan 25 2013, 11:24
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
QUOTE (AndreyVN @ Jan 25 2013, 11:04)  советуют перед последовательностью присвоений WDTCR=0x1F; WDTCR=0x0F; запретить оптимизацию кода, иначе компилятор может две команды в одну слепить. Покажите, где такая чушь написана? Не имеет права компилятор такое делать. QUOTE (AndreyVN @ Jan 25 2013, 11:04)  Однако, пока ничего не получилось, не заводится WDT. Покажите листинг вашей функции WatchDogStart().
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jan 25 2013, 15:54
|
Знающий
   
Группа: Свой
Сообщений: 754
Регистрация: 29-06-06
Из: Volgograd
Пользователь №: 18 458

|
Цитата(Сергей Борщ @ Jan 25 2013, 14:24)  Покажите, где такая чушь написана? Не имеет права компилятор такое делать. Покажите листинг вашей функции WatchDogStart(). "Слепить две в одну"- я добавил от себя, а код внизу и совет по поводу отключения оптимизации попался в документах Atmel, где именно уже не вспомню. Код //FuseBits: WDTON=1 MC103=1 void WatchDogStart() { StringPrepare("WDT On"); Scroll(); ScrollUpdate(); #asm("wdr") //сбросить сторожевой таймер #pragma optsize- WDTCR=0x1F; WDTCR=0x0F; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif }
|
|
|
|
|
Feb 14 2013, 12:33
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 11-10-06
Пользователь №: 21 205

|
День добрый! Есть программка в которой с помощью WDT осуществляется RESET. Есть 2 HEX файла одного и того же исходника полученные в CodeVision. Первый с оптимизацией по размеру, второй по скорости. Программируем загрузчиком chip45boot2. При загрузки первого файла, WDT не хочет делать RESET, а при загрузке 2го все работает. Если заливать софт через программатор, то работают оба. Господа, может есть у кого какие соображения??? Какая тут может быть связь.?  Подскажите плиз.
|
|
|
|
|
Feb 14 2013, 15:29
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 11-10-06
Пользователь №: 21 205

|
Видимо нет. Память aplication залитая программатором или загрузчиком идентична. (сверена после программирования) В варианте с загрузчиком, если изменить фьюс BOOTRST при котором старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть), все работает.
|
|
|
|
|
Feb 14 2013, 16:04
|
Гуру
     
Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322

|
Цитата(artic @ Feb 14 2013, 17:29)  В варианте с загрузчиком, если изменить фьюс BOOTRST при котором старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть), все работает. Возможно в загрузчике выполняются какие-то манипуляции с WDT. Цитата(artic @ Feb 14 2013, 17:29)  если изменить фьюс BOOTRST при котором старт начнется с нулевого адреса а не с адреса загрузчика (как оно и должно быть). Ну. если вам не нужен загрузчик - "как оно и должно быть" - то и не шейте его...раз всё работает. PS. В каком состоянии остальные байты фузов (там их три). Гадать можно долго.
|
|
|
|
|
Feb 14 2013, 16:29
|

Профессионал
    
Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581

|
Цитата(AndreyVN @ Jan 25 2013, 19:54)  "Слепить две в одну"- я добавил от себя, а код внизу и совет по поводу отключения оптимизации попался в документах Atmel, где именно уже не вспомню. если мне склероз не изменяет, то все в апнотах Атмела как раз наоборот было сказано - включать оптимизацию, чтобы код был наиболее коротким, чтобы между записями не было промежуточных команд, т.е. не оказалось больше 4 тактов. и, если не ошибаюсь, прерывания тоже не помешает запретить на это время с той же целью - не допустить паузы между записями в регистр WDTCR
--------------------
Я бы взял частями... но мне надо сразу.
|
|
|
|
|
Feb 14 2013, 16:30
|
Участник

Группа: Участник
Сообщений: 16
Регистрация: 11-10-06
Пользователь №: 21 205

|
Загрузчик выключает WDT. Как раз с загрузчиком и должно быть. Программируются биты BOOTRST BOOTSZ0 BOOTSZ1 ну и биты для работы с кварцем. Все остальное не запрограммировано. ATmega88.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|