Перейти к содержанию

"зависает" Мк Attiny 2313


-=FISHER=-

Рекомендуемые сообщения

Приветствую всех!

Какие причины могут быть "зависания" МК. Пример: простейший бегущий огонь, посредством битовых сдвигов работает некорректно. То бежит с одинаковым ритмом, то раз и остановился на одном диоде и горит какое то время потом опять пробежал пару бит и опять горит, и всё в таком духе...В протеусе к слову, всё бегает прекрасно.

Вопрос к знатокам, перечислите пожалуйста возможные причины такого поведения МК.

Заранее благодарю всех откликнувшихся. Голову уже сломал.....

Вот схема

post-188855-0-60401400-1472268630_thumb.jpg

Вот прошивка

#include <tiny2313.h>
#include <delay.h>
typedef unsigned char byte;
unsigned char trig, var_no, i, b, flag, flag1, flag2;
int count, LONG, WAIT;
eeprom byte memory_var;
eeprom int memory_speed;
// Port B initialization

void main(void)
{
PORTB=0x00;
DDRB=0b11111111;
PORTD=0b00000001;
DDRD=0x00;

if(memory_var) // если режим выбран ранее
{
if (memory_var==0xFF)
{
var_no=1;
}
else
{
var_no=memory_var; // пишем последнее запомненное состояние на выход
}
}

if(memory_speed) // если скорость выбрана ранее
{
if (memory_speed==0xFFFF)
{
LONG=70;
}
else
{
LONG=memory_speed; // пишем последнее запомненное состояние на выход
}
}

// ****************************** НАСТРОЙКА ТАЙМЕРА ПО ПЕРЕПОЛНЕНИЮ И ПРЕРЫВАНИЯ *****************************************

TCCR0B=(0<<WGM02) | (0<<CS02) | (1<<CS01) | (1<<CS00); // инициализация работы таймера
TCNT0=0x45; // выставляем счетчик
TIMSK=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
ACSR=	 (1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);
#asm("sei") // разрешаем прерывания
i=1;
trig=0;
count=0;
b=1;
WAIT=10;
}

void zero_var(void) //функция сброса переменных в первоначальное занчение
{
flag=1;
trig=0;
count=0;
i=1;
b=1;
}

// ******************** ПРЕРЫВАНИЕ по переполнению, срабатывает 100 раз в секунду*************************

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0=0x45; // выставляем счетчик

switch (var_no) //ВЫБОР РЕЖИМОВ
{

case 1: //ПЕРВЫЙ РЕЖИМ
{
	 if (trig==0)
	 {
	 PORTB=0x01;
	 trig=1;
	 }
	 else
	 {
		 if(count<LONG)count++;
			 if(count==LONG)
			 {
			 PORTB = (1<<i);
			 i++;
				 if(i>8)
				 {
				 i=1;
				 trig=0;
				 }
			 count=0;
			 }
	 }
break;
}

case 2: //ВТОРОЙ РЕЖИМ
{
	 if (trig==0)
	 {
	 if (b==1)PORTB=0b00000000;
	 i--;
	 trig=1;
	 }
	 else
	 {
		 if(count<LONG)count++;
			 if(count==LONG)
			 {
			 if (b==1)
			 {
			 PORTB |= (1<<i);
			 i++;
				 if(i>7)
				 {
				 i=1;
				 trig=0;
				 b=0;
				 }
			 }
			 else
			 {
			 PORTB = (PORTB<<1);
			 i++;
				 if(i>7)
				 {
				 i=1;
				 trig=0;
				 b=1;
				 }
			 }
			 count=0;
			 }
	 }
break;
}

case 3: //ТРЕТИЙ РЕЖИМ
{
	 if (trig==0)
	 {
	 if (b==1)PORTB=0b00000000;
	 i--;
	 trig=1;
	 }
	 else
	 {
		 if(count<LONG)count++;
			 if(count==LONG)
			 {
			 if (b==1)
			 {
			 PORTB |= (1<<i);
			 i++;
				 if(i>7)
				 {
				 i=1;
				 trig=0;
				 b=0;
				 }
			 }
			 else
			 {
			 PORTB = ~(PORTB);
			 i++;
				 if(i>4)
				 {
				 i=1;
				 trig=0;
				 b=1;
				 }
			 }
			 count=0;
			 }
	 }
break;
} //конец case 3



} //конец свича

//******************************************************ОБРАБОТКА НАЖАТИЯ КНОПОК***************************************************

if (PIND.1==0) // КНОПКА СМЕНЫ РЕЖИМОВ
{
if (flag==0) //если кнопка нажата впервые
{
zero_var();
var_no++;
if (var_no==4)var_no=1;
memory_var=var_no;
}
}
else
{
if (flag)
{
flag++;
if (flag>WAIT)flag=0; // ОБРАБОТКА АНТИДРЕБЕЗГА
}
}

if (PIND.2==0) // КНОПКА ЗАМЕДЛЕНИЯ
{
if (flag2==0) // если кнопка нажата впервые
{
flag2=1;
LONG=(LONG+10);
if (LONG>1000)
{
LONG=400;
}
memory_speed=LONG;
zero_var();
}
}
else
{
if (flag2)
{
flag2++;
if (flag2>WAIT)flag2=0; // ОБРАБОТКА АНТИДРЕБЕЗГА
}
}

if (PIND.3==0) // КНОПКА УСКОРЕНИЯ
{
if (flag1==0) //если кнопка нажата впервые
{
flag1=1;
LONG=(LONG-10);
if (LONG<10)
{
LONG=10;
}
memory_speed=LONG;
zero_var();
}
}
else
{
if (flag1)
{
flag1++;
if (flag1>WAIT)flag1=0; // ОБРАБОТКА АНТИДРЕБЕЗГА
}
}
} //конец прерывания

Изменено пользователем -=FISHER=-

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

- в конце main() должен быть бесконечный цикл while(1) {}

- и наверно case лучше вынести из прерывания, а в прерывании только менять флаги (отсчёт временных интервалов микания) + обработка кнопок + непосредственно запись в порт (без условий, что писать должно формироваться в main)

Ссылка на комментарий
Поделиться на другие сайты

- в конце main() должен быть бесконечный цикл while(1) {}

Думаете причина только в кривом коде? Но протеус всё проглатывает на ура. Может всё же в схеме чего то не хватает?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

в схеме вроде всё нормально

я бы только увеличил номинал резисторов R1-R3 до 10 кОм или убрал их и подтянул входа средствами контроллера (PULL-UP)

думаю, что виноват код, в схеме так не накосячить

а зачем эта строчка?

ACSR = (1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIS1) | (0<<ACIS0);

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

в схеме вроде всё нормально

думаю, что виноват код, в схеме так не накосячить

А может быть причиной длинные провода (~2 метров), отходящие от платы управления, до линейки со светодиодами? И то что ножка ресет в воздухе?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Из-за reset может быть, мы ставим на reset mcp100, чтобы не испортить содержимое eeprom (при плавном снижении напряжения питания) и не используем адрес 0 eeprom

если провода от транзисторов 2 м, то не страшно (у вас там 12 В), да и до транзисторов не страшно, но не нужно

Ссылка на комментарий
Поделиться на другие сайты

Из-за reset может быть, мы ставим на reset mcp100, чтобы не испортить содержимое eeprom (при плавном снижении напряжения питания

пожалуйста, поясните, что конкретно значит mcp100?

Устранить.

Подскажите пожалуйста, как лучше и проще это сделать?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

http://ww1.microchip...eDoc/11187f.pdf

можно подключить и резистор ко входу Reset, но могут быть проблемы связанные с порчей eeprom и даже flash, при условии что у вас по питанию стоит конденсатор большой ёмкости (2200 мкФ). В этом случае напряжение питания будет плавно снижаться, а контроллер будет продолжать работать. Чтобы этого не было ставят "мониторы питания", один из них mcp100. При снижении напряжения питания до 4.5 В на вход Reset контроллера придёт лог.0 и контроллер прекратит работу.

post-202228-0-66547200-1472292991.jpg

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте, помимо проблем в коде, могут быть и аппаратные проблемы:

1. Ногу RESET подключают через резистор 1-10 кОм к плюсу питания.

2. Отдельный супервизор питания не нужен, он есть в самом контроллере, эта тема обсуждалась в предыдущем вашем сообщении, активируйте встроенный супервизор установкой соответствующих фьюзов.

3. И самая главная проблема, которая ставит большинство людей в тупик - непосредственно рядом с контроллером по питанию необходимо ставить керамический конденсатор емкостью 0.1-1.0 мкФ. Для чего он нужен: во-первых хоть у вас стоит электролит на 1000 мкФ, хоть на 10 000 мкФ - он все равно плохо фильтрует высокочастотные помехи (у него очень большая индуктивность и большое ESR на высоких частотах), во-вторых если электролит расположен далеко от контроллера (а даже 10 см это уже очень далеко), длинные провода питания начинают помимо своей основной функции (то есть передача энергии) выполнять еще и паразитные функции, в частности паразитного дросселя (и за счет этого напряжение на контроллере прыгает в зависимости от потребляемого тока, такие прыжки кратковременны, но достаточны чтобы повредить содержимое регистров общего назначения и регистров оперативной памяти (sram) и как результат сбить работу контроллера) и функцию паразитного трансформатора, ловя все высокочастотные помехи которые только возможно поймать.

В некоторых особо тяжелых случаях также ставится диод развязывающий питание контроллера от питания остальной части схемы, то есть питание через диод поступает на контроллер, электролит и керамику, в случае мощной нагрузки, которой управляет контроллер, возможна просадка напряжения питания и в этой ситуации диод закрывается, а контроллер кратковременно (микро и миллисекунды) питается от стабильного напряжения с электролита, отфильтрованного по высокочастотным помехам керамикой.

Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте, помимо проблем в коде, могут быть и аппаратные проблемы:

1. Ногу RESET подключают через резистор 1-10 кОм к плюсу питания.

2. Отдельный супервизор питания не нужен, он есть в самом контроллере, эта тема обсуждалась в предыдущем вашем сообщении, активируйте встроенный супервизор установкой соответствующих фьюзов.

3. И самая главная проблема, которая ставит большинство людей в тупик

Спасибо большое за развернутый ответ! У меня по питанию стоит смд конденсатор на 10 мкФ, примерно в 10 мм от контроллера. Изучив все возможные проблемы, думаю начать с меньшего и подтянуть ресет, к питанию резистором. А дальше если не поможет, то включить супервизор питания МК.

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Всё таки решил высказать своё мнение по поводу встроенного сброса микроконтроллера по питанию (BODLEVEL):

монитор питания (внешний или внутренний) устанавливается для того, чтобы сохранить данные микроконтроллера (flash, eeprom) от повреждения. Если мы используем встроенный в микроконтроллер монитор питания, то нужно понимать, что включение его, а также установка напряжения срабатывания, задаётся при программировании fuses. Т.е. при повреждении flash или eeprom также могут повредиться и fuses (хотя и с меньшей вероятностью). Получается что то вроде "запасные ключи от сейфа находятся в самом сейфе". Для себя я решил, что использование внешнего аппаратного монитора питания предпочтительнее (ну, по крайней мере, спокойнее). Ну и дополнительно нет привязки к типу микроконтроллера, да и работу внешнего монитора питания всегда можно проконтролировать прибором.

Наверно предпочтительнее ставить внешний монитор питания при жёстких условия работы, для домашних условий вполне хватит и резистора, включение внутреннего монитора питания тоже не помешает.

Изменено пользователем dm37
Ссылка на комментарий
Поделиться на другие сайты

Вы конечно правы, но правы в том случае когда идет запись во внутреннюю энергонезависимую память. Фьюзы при обычных помехах повредиться не могут, по той простой причине что программа не осуществляет в них запись при своей работе, они устанавливаются изначально при программировании контроллера.

Самая главная проблема при помехах (если мы не используем в программе запись в энергонезависимую память) - это повреждение данных в регистрах общего назначения, регистрах ввода-вывода и оперативной памяти (sram), причем именно повреждение данных (когда например происходит копирование из одного регистра в другой, и произошла внезапная просадка напряжения или пришла помеха), то есть с регистром ничего не случилось, он остался по прежнему работоспособен, но значение в исходном регистре из которого копировали и значение регистра в который копировали - отличаются. Как результат - программа может повести себя непредсказуемо, возможны зависания или внезапные изменения режимов работы, но встроенный монитор питания по прежнему остается работоспособен и выполняет свою функцию.

Кстати, внешним монитором напряжения вы по крайней мере eeprom не сохраните. Дело в том что при подаче низкого уровня на reset, происходит сброс, но если происходит запись в eeprom, то сброс микроконтроллера откладывается до окончания записи, но помехи и просадки напряжения в это время никуда не исчезают и продолжают действовать, возможно повреждая данные.

Ссылка на комментарий
Поделиться на другие сайты

Возможно, но у нас портилась flash при просадке питания (по крайней мере я так предполагал), а во flash уже точно никто ничего не пишет. А fuses и flash, по программированию, примерно одинаковые. Вот и принял решение не использовать внутренний монитор питания. Но это только моё отношение к мониторам питания и я ничего не имею против внутреннего монитора питания. Схемотехника и условия эксплуатации у всех разные.

Ссылка на комментарий
Поделиться на другие сайты

установка напряжения срабатывания, задаётся при программировании fuses. Т.е. при повреждении flash или eeprom также могут повредиться и fuses
Запись фузов из программы просто невозможна. Как бы ни испортились регистры или память при помехах, команда перезаписи фузов не вызовется никогда, просто потому что ее нет. Иначе такими контроллерами было бы невозможно пользоваться, ведь фузами задаются наиболее опасные вещи - использование ресета в качестве ноги ввода-вывода, отключение ISP, выбор источника тактового сигнала.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

то COKPOWEHEU

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

Мне кажется, что разделение flash и fuses совсем в другом: отделить настройки от самого кода. Один раз определил конфигурацию чипа в зависимости от схемотехники, потом только меняй код. MSP430 настройку тактирования, вроде программно выполняет (запустился на внутреннем генераторе, поменял настройки тактирования и работает. Наверно это связано с более гибким управлением энергопотреблением).

Способ прошивки flash и fuses, со стороны программатора, одинаковый. Или вы считаете, что порча flash не так страшна как порча fuses?

Если не ошибаюсь в интернете давно ходят разговоры о сбросе fuses как раз при помощи повышенного напряжения (помехи). Не знаю насколько это правда, никогда этим не занимался.

Ссылка на комментарий
Поделиться на другие сайты

Возможно, но у нас портилась flash при просадке питания (по крайней мере я так предполагал), а во flash уже точно никто ничего не пишет............................................................

Возможно у вас портилась FLASH, но команда для записи в эту память есть, а именно команда SPM, данная команда используется при самопрограммировании контроллера.

По поводу вашего последнего - "Почему вы решили, что память (любая) должна портиться только при наличии команд для этого?" - я об этом уже говорил в посте номер 15.

По поводу того что ходят разговоры о сбросе фьюзов при помощи повышенного напряжения (помехи) - так в том то и дело что это разговоры, вы пожалуйста приведите факты, а то что-то услышали и не разобравшись рассказываете. По этому поводу я вам могу факты привести, а именно есть такие замечательные контроллеры ATTINY4, (5, 9, 10), у них в отличие от других ATTINY и ATMEGA есть возможность сброса фьюзов путем подачи кратковременно 12 вольт на RESET, но в том то и дело что тут мы целенаправленно подаем конкретное напряжение на конкретную ногу микроконтроллера определенное время (здесь разговор идет именно не о помехе, а о целенаправленном процессе). У ATTINY2313 максимум что могут сделать 12 вольт на ноге RESET - это перевести ее в режим программирования, но при этом ни какая программа зашитая в нее не выполняется, а изначально в посте номер 1 была поставлена проблема что программа выполняется неадекватно.

Ссылка на комментарий
Поделиться на другие сайты

to Alex Ferrum,

то, что вы пишете я это знаю и не отрицаю (делал когда то автономный программатор для AVR, выкладывал в своё время на telesys.ru)

Я лишь сказал, что выработал для себя защиту flash, eeprom и fuses через внешний монитор питания, не более. Защита микроконтроллера средствами самого микроконтроллера мне не очень нравиться.

Вы же не можете гарантировать, что при плохих условиях не может испортиться память (те же fuses), вот и страхуемся кто как может.

Ссылка на комментарий
Поделиться на другие сайты

2. Отдельный супервизор питания не нужен, он есть в самом контроллере, эта тема обсуждалась в предыдущем вашем сообщении, активируйте встроенный супервизор установкой соответствующих фьюзов.

А есть ли разница, какое значение напряжения выставлять в BODLEVEL, "лучше" самое высое или самое низкое?

Мы все учились по-немногу, чему-нибудь и как-нибудь...

Ссылка на комментарий
Поделиться на другие сайты

Поддерживаю, при питании от сети (то есть от блока питания который включен в сеть) просадка напряжения может возникать вследствие выключения блока питания или какой либо помехи, а даже если напряжение при просадке выше минимального напряжения питания контроллера все равно может произойти сбой в работе микроконтроллера из-за того что просадка в этом случае происходит резко, поэтому надо ставить срабатывание на самом высоком напряжении. При питании от батареи, резкой просадки быть не может (за исключением случаев когда к данной батареи подключена мощная нагрузка, которая включившись может вызвать эту самую просадку), в этом случае монитор напряжения устанавливается на самое низкое напряжение и сброс (выключение) контроллер, когда батарея полностью сядет.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...