Страница 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)
Далее применяю в программе:
Это подходит не только для IAR но и для GCC (AVR Studio & WinAVR)
Для CV AVR не в курсе, так как не пользуюсь, но наверное там будут отличия только в формате ассемблерной вставки.
Что-то вроде
Напомню про СобачийТаймер.
Это таймер, который тикает либо от отдельного источника тактовых сигналов, либо от общего.
Как только он прокрутит цикл (переполнится), он дернет где-то внутри линию общего сброса МК
Как в следствии, МК перезагрузится.
Чтобы МК не ребутился, надо СобачийТаймер сбрасывать периодически в программе.
Если вдруг программа повиснет и СобачийТаймер не сбросит, то МК перезагрузится.
Это нужно для предохранения девайса от зависаний.
Где-то в регистрах системы (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бит и все заработало,в соседней ветке насоветовали
можно ли использовать предделитель таймера если тактирую от внутреннего генератора?