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

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

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

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

выставляет флаги "H", "Z" и перезагрузка
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 652
Зарегистрирован: Вс ноя 13, 2011 16:42:05
Откуда: Украина

Сообщение C@at »

Если после сброса перезагружается это нормально.
Если после сброса НЕперезагружается тогда вопрос почему, у вас вроде как, все правильно.
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Как я понял вы пишите на си, но с вставками из ассемблера? Если так, то что мешает сделать так:

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

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

wdt_enable(WDTO_8S);
wdt_reset();
Значение у define, как вы понимаете, может быть и другим.
Главное вовремя сбрасывать таймер, чтоб он не сбросил контроллер.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

это первый мой проект на atmega8
асемблерные вставки потому что пишу по примерам других и по статьям, противоречащим друг другу
долго парился с синтаксисом прерываний
у меня не шло пока просто не прописал вектор [7] как только разрешал прерывания все перегружалось в определенный момент

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

Почему он должен перегружаться? Почему это нормально?
ведь написано везде, что сбрасывают его, чтобы не было перезагрузки???
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение 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 журнал и так далее.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Реклама
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

я сбрасываю по прерыванию таймера Т0

ПОЧЕМУ В AVR STUDIO ПРИ ОТЛАДКЕ ПЕРЕЗАГРУЗКА - НОРМА
как тогда дальше отлаживать программу?
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

А инициализацию Собачки можете показать?
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

в этих регистрах, по-моему ничего нет
я только водел что при WDR - выставляется Z-флаг
потом у меня идет:
x=x+1; - тутже выставляутся флаги H,C и ...
перезагрузка
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

сейчас не могу, все дома
я дома буду поздно
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

при инициализации все как в литературе avr studio показывае, что записываются 1 во все бита, а потом только 1 в 0,1,2
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Отключите WatchDog так:

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

WDTCR |= (1<<WDCE);
WDTCR &= ~(1<<WDE);
WDTCR = 0x00;
 
После этого надо проверить, перезагрузится ли МК или нет.
Флаг C - это флаг переноса. Если результат операции вылазит за пределы 8 бит, то выставится этот флаг.
Флаг H - тоже флаг переноса (Half Carry Flag) - они отвечают за математику.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Почитайте здесь
http://www.nongnu.org/avr-libc/user-man ... chdog.html
и перевод на русский, хотя и очень корявый
http://avr-libc.narod.ru/group__avr__watchdog.html

лучше учитесь сразу использовать те библиотеки, которые дает Atmel. Понимать как работает надо, зачем работает надо, но если есть готовые и оптимизированные библиотеки... Кстати, ваш код с ними будет намного меньше, нагляднее и лучше удобочитаемым.
Опытный кот
Сообщения: 758
Зарегистрирован: Вс фев 10, 2013 15:26:00

Сообщение nirq »

vovk69 писал(а):выставляет флаги "H", "Z" и перезагрузка
Замени на просто NOP.

Документ называется "AVR Instruction Set", файл называется doc0856.pdf, про каждую инструкцию там расписано: какие флаги и как она не меняет. Это оригинальная информация от производителя микросхемы, без посредников.
Как бы намёк.
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Вообще, собачий таймер добавляется вконце. То есть, когда программа написана и отлажена.
Да и не вижу смысла сбрасывать таймер в прерывании другого таймера. Так программа не будет защищена от зависаний.
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Вымогатель припоя
Аватара пользователя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Сообщение eess9 »

Лучше всего сбрасывай таймер в бесконечном цикле основной функции main.
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

с таймером начал возиться, потому, что при отладке разрешил прерывания и начались перезагрузки - подумал, что из-за сторожевого таймера

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

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

при отладке без прерыванию - работает
с прерываниями - перезагрузается
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

отключил сторожевой таймер

при переполнении T0 делает то что пописано или, если все вытираю ничего не делает, а после выхода
из [7] прерывания - перезагрузка
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

и почему-то после выхода флаг пбщего разрешения прерывания не устанавливается
Друг Кота
Аватара пользователя
Сообщения: 4468
Зарегистрирован: Вс янв 24, 2010 19:19:52
Откуда: Главный Улей России (Moscow)

Сообщение DX168B »

Тогда покажите обработчик прерывания. И какой у Вас компилятор?
I am DX168B and this is my favourite forum on internet!
Контактная информация:
Первый раз сказал Мяу!
Аватара пользователя
Сообщения: 23
Зарегистрирован: Пн май 27, 2013 14:13:32

Сообщение vovk69 »

я отклютил таймер
записал 0 в 0бит и все заработало,в соседней ветке насоветовали

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

Вернуться в «AVR»