Страница 1 из 2

после сброса стор. таймера atmega8 программа перегружается

Добавлено: Пт июл 19, 2013 14:05:27
vovk69
помогите!
после сброса стор. таймера atmega8 программа перегружается

сбрасывал:
#asm("wdr")
и
#asm
WDR
#endasm

выставляет флаги "H", "Z" и перезагрузка

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 16:33:55
C@at
Если после сброса перезагружается это нормально.
Если после сброса НЕперезагружается тогда вопрос почему, у вас вроде как, все правильно.

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 16:42:14
eess9
Как я понял вы пишите на си, но с вставками из ассемблера? Если так, то что мешает сделать так:

Код: Выделить всё

#include <avr/wdt.h>
#define 	WDTO_8S   9

wdt_enable(WDTO_8S);
wdt_reset();
Значение у define, как вы понимаете, может быть и другим.
Главное вовремя сбрасывать таймер, чтоб он не сбросил контроллер.

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 17:02:39
vovk69
это первый мой проект на atmega8
асемблерные вставки потому что пишу по примерам других и по статьям, противоречащим друг другу
долго парился с синтаксисом прерываний
у меня не шло пока просто не прописал вектор [7] как только разрешал прерывания все перегружалось в определенный момент

Подумал, что это из-за сторожевого таймера
с ним тоже ерунда такая...

Почему он должен перегружаться? Почему это нормально?
ведь написано везде, что сбрасывают его, чтобы не было перезагрузки???

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 17:06:15
DX168B
Я в IAR делал так

Где-то в заголовочном файле (main.h)

Код: Выделить всё

inline void wdr(void)
{
     asm("wdr");
}
 
Далее применяю в программе:

Код: Выделить всё

.......
..
wdr();
....
 
Это подходит не только для IAR но и для GCC (AVR Studio & WinAVR)
Для CV AVR не в курсе, так как не пользуюсь, но наверное там будут отличия только в формате ассемблерной вставки.
Что-то вроде

Код: Выделить всё

inline void wdr(void)
{
#asm
     WDR
#endasm
}
 
Напомню про СобачийТаймер.
Это таймер, который тикает либо от отдельного источника тактовых сигналов, либо от общего.
Как только он прокрутит цикл (переполнится), он дернет где-то внутри линию общего сброса МК
Как в следствии, МК перезагрузится.
Чтобы МК не ребутился, надо СобачийТаймер сбрасывать периодически в программе.
Если вдруг программа повиснет и СобачийТаймер не сбросит, то МК перезагрузится.
Это нужно для предохранения девайса от зависаний.
Где-то в регистрах системы (MCUCR или MCUCSR и прочих) есть биты, по которым можно выяснить причину сброса.
Есть события, типа
POWER ON RESET
EXT LINE RESET
WatchDog Reset
и прочие.
По ним можно отработать ситуацию, типа плюнуть пакет с ошибко в UART или записать в EEPROM журнал и так далее.

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 17:17:04
vovk69
я сбрасываю по прерыванию таймера Т0

ПОЧЕМУ В AVR STUDIO ПРИ ОТЛАДКЕ ПЕРЕЗАГРУЗКА - НОРМА
как тогда дальше отлаживать программу?

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 17:20:38
DX168B
А инициализацию Собачки можете показать?

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 17:23:55
vovk69
в этих регистрах, по-моему ничего нет
я только водел что при WDR - выставляется Z-флаг
потом у меня идет:
x=x+1; - тутже выставляутся флаги H,C и ...
перезагрузка

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 17:25:23
vovk69
сейчас не могу, все дома
я дома буду поздно

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 17:27:11
vovk69
при инициализации все как в литературе avr studio показывае, что записываются 1 во все бита, а потом только 1 в 0,1,2

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 17:36:11
DX168B
Отключите WatchDog так:

Код: Выделить всё

WDTCR |= (1<<WDCE);
WDTCR &= ~(1<<WDE);
WDTCR = 0x00;
 
После этого надо проверить, перезагрузится ли МК или нет.
Флаг C - это флаг переноса. Если результат операции вылазит за пределы 8 бит, то выставится этот флаг.
Флаг H - тоже флаг переноса (Half Carry Flag) - они отвечают за математику.

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 17:49:50
eess9
Почитайте здесь
http://www.nongnu.org/avr-libc/user-man ... chdog.html
и перевод на русский, хотя и очень корявый
http://avr-libc.narod.ru/group__avr__watchdog.html

лучше учитесь сразу использовать те библиотеки, которые дает Atmel. Понимать как работает надо, зачем работает надо, но если есть готовые и оптимизированные библиотеки... Кстати, ваш код с ними будет намного меньше, нагляднее и лучше удобочитаемым.

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 20:00:29
nirq
vovk69 писал(а):выставляет флаги "H", "Z" и перезагрузка
Замени на просто NOP.

Документ называется "AVR Instruction Set", файл называется doc0856.pdf, про каждую инструкцию там расписано: какие флаги и как она не меняет. Это оригинальная информация от производителя микросхемы, без посредников.
Как бы намёк.

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пт июл 19, 2013 21:01:43
DX168B
Вообще, собачий таймер добавляется вконце. То есть, когда программа написана и отлажена.
Да и не вижу смысла сбрасывать таймер в прерывании другого таймера. Так программа не будет защищена от зависаний.

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Сб июл 20, 2013 10:23:25
eess9
Лучше всего сбрасывай таймер в бесконечном цикле основной функции main.

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Пн июл 22, 2013 10:44:29
vovk69
с таймером начал возиться, потому, что при отладке разрешил прерывания и начались перезагрузки - подумал, что из-за сторожевого таймера

Но прочитав ВАШИ советы и рекомендации, думаю не в нем дело

флаги "H" и "C " не могут быть результатом переполнения таймеров Т0 и Т2?

при отладке без прерыванию - работает
с прерываниями - перезагрузается

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Вт июл 23, 2013 09:48:04
vovk69
отключил сторожевой таймер

при переполнении T0 делает то что пописано или, если все вытираю ничего не делает, а после выхода
из [7] прерывания - перезагрузка

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Вт июл 23, 2013 09:55:43
vovk69
и почему-то после выхода флаг пбщего разрешения прерывания не устанавливается

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Ср июл 24, 2013 10:50:48
DX168B
Тогда покажите обработчик прерывания. И какой у Вас компилятор?

Re: после сброса стор. таймера atmega8 программа перегружает

Добавлено: Ср июл 24, 2013 15:01:17
vovk69
я отклютил таймер
записал 0 в 0бит и все заработало,в соседней ветке насоветовали

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