Подскажите, у atmega8 бывают иногда сбои, может это быть из-за питания или что то в программе, так как параллельно её стоит один мотор и ШИМ с AVR управляет вторым мотором. Запитано все от блока 24В.
У atmega8 бывают иногда сбои
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
Добрый день!
Подскажите, у atmega8 бывают иногда сбои, может это быть из-за питания или что то в программе, так как параллельно её стоит один мотор и ШИМ с AVR управляет вторым мотором. Запитано все от блока 24В.
Подскажите, у atmega8 бывают иногда сбои, может это быть из-за питания или что то в программе, так как параллельно её стоит один мотор и ШИМ с AVR управляет вторым мотором. Запитано все от блока 24В.
- Реклама
На это можно ответить только ознакомившись с программой и схемой включения, причем - лучше с разводкой платы, так как бывают и там подводные камни. Только это, как правило, занимает много времени, но может у кого-то и будет свободное время.
А на то, что имеем, можно сказать, что бывают сбои и при некачественном питании, и, естественно, при кривом ПО.
А на то, что имеем, можно сказать, что бывают сбои и при некачественном питании, и, естественно, при кривом ПО.
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
Код: Выделить всё
#include <mega8.h> //частота 4МГц
#include <delay.h>
unsigned char blinkFlag = 0;
unsigned char blinkFlag1 = 0;
unsigned char blinkFlag2 = 0;
void blink() {
PORTB.0=1;
delay_ms(111);
PORTB.0=0;
delay_ms(111);
}
void blink1(){
PORTB.0=1;
delay_ms(100);
PORTB.0=0;
delay_ms(100);
}
void blink2(){
PORTB.0=1;
delay_ms(312);
PORTB.0=0;
delay_ms(312);
}
void main(void)
{
int data;
float V;
PORTB=0x00;
DDRB=0x0D;
PORTC=0x04;
DDRC=0x00;
TCCR1A=0x21;
TCCR1B=0x0C;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0xA6;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x40;
TIMSK=0x00;
ACSR=0x80;
SFIOR=0x00;
ADCSRA=0x85;
delay_ms(10000);
OCR1BL=0xFA;
TCCR2=0x6E;
delay_ms(45000);
while (1)
{
if (PINC.2==1)
{
delay_ms(20);
ADMUX=0;
ADCSRA |= 0x40;
data = ADCW;
V =data*0.0048828;
if (V < 3.1)
{
OCR1BL=0xEB;
TCCR2=0x6E;
blinkFlag = 0;
blinkFlag1 = 0;
blinkFlag2 = 1;
}
else if (V >= 3.1)
{
if (V > 4.65)
{
TCCR2=0x00;
OCR1BL=0xEB;
blinkFlag = 1;
blinkFlag1 = 0;
blinkFlag2 = 0;
}
else if (V < 4.35)
{
TCCR2=0x00;
OCR1BL=0xCC;
blinkFlag = 0;
blinkFlag1 = 1;
blinkFlag2 = 0;
}
}
}
if (PINC.2==0)
{
TCCR2=0x00;
OCR1BL=0xC0;
blinkFlag = 0;
blinkFlag1 = 0;
blinkFlag2 = 0;
}
if(blinkFlag)
blink();
if (blinkFlag1)
blink1();
if (blinkFlag2)
blink2();
};
} Код: Выделить всё
if (PINC.2==0)Но у меня все началось сначала, как будто кто то перегрузил
А зачем столько лишних операций с флагами? Можно же сделать сразу:
Или это только часть кода и флаги будут использоваться в других блоках?
P.S.: Я с Си знаком поверхностно, серьезных вещей на нем не писал. В основном Delphi и для контроллеров - Ассемблер, так что, может что-то и не так понял из кода, но в принципе, криминала не увидел.
А фьюзы правильно выставлены? В частности, сторожевой таймер не включен?
Схема питания не показана.
Код: Выделить всё
while (1)
{
if (PINC.2==1)
{
delay_ms(20);
ADMUX=0;
ADCSRA |= 0x40;
data = ADCW;
V =data*0.0048828;
if (V < 3.1)
{
OCR1BL=0xEB;
TCCR2=0x6E;
blink2();
}
else if (V >= 3.1)
{
TCCR2=0x00;
if (V > 4.65)
{
OCR1BL=0xEB;
blink();
}
else if (V < 4.35)
{
OCR1BL=0xCC;
blink1();
}
}
}
if (PINC.2==0)
{
TCCR2=0x00;
OCR1BL=0xC0;
}
};
}P.S.: Я с Си знаком поверхностно, серьезных вещей на нем не писал. В основном Delphi и для контроллеров - Ассемблер, так что, может что-то и не так понял из кода, но в принципе, криминала не увидел.
А фьюзы правильно выставлены? В частности, сторожевой таймер не включен?
Схема питания не показана.
Это конечно скорей всего даже не по питанию произошло, а наводка на вывод сброса. Надо тщательно просмотреть разводку платы и экранировать от внешних полей.
И еще, я бы убрал арифметику с плавающей запятой из программы - лучше посчитать константы приведя их к целым числам это сделает компилятор один раз при компиляции программы а не контроллер каждый раз выполняя тяжёлые операции умножения и сравнения.
И еще, я бы убрал арифметику с плавающей запятой из программы - лучше посчитать константы приведя их к целым числам это сделает компилятор один раз при компиляции программы а не контроллер каждый раз выполняя тяжёлые операции умножения и сравнения.
- Реклама
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
Все может быть, по этому и говорил, что надо смотреть и схему. По поводу арифметики согласен все 100. 
С If-ами тоже надо оптимизировать. Если V<3.1, то вторая проверка не нужна, ясно же, что если V не меньше 3.1, значит точно больше или равно.
С If-ами тоже надо оптимизировать. Если V<3.1, то вторая проверка не нужна, ясно же, что если V не меньше 3.1, значит точно больше или равно.
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
Плату пока еще не разводил, все спаяно на макетке (все вкуче).Надо тщательно просмотреть разводку платы и экранировать от внешних полей.
Не совсем понял про арифметику? тут смысл такой: на АЦП приходит сигнал с датчика температуры (К1019ЧТ1) и AVR управляет подачей топлива и моторами. Все работает как нужно, но иногда происходит сбой какой-тоИ еще, я бы убрал арифметику с плавающей запятой из программы - лучше посчитать константы приведя их к целым числам
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
С If-ми был такой вариант, потом зачем то переделал, получается зря"Vladlog"
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
В этой программе установленный флаг не означает установку бита в 0? А то выходит, что сторожевой таймер включен и систематически перезагружает контроллер.kk042fjv писал(а):Фьюзы выставлял таким образом.
Это все хорошо, но на самой плате, совсем рядом, практически на ногах питания контроллера, есть доп. конденсатор?
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
Конденсатора нету, т.е. между 7 и 8 выводом поставить конденсатор?на самой плате, совсем рядом, практически на ногах питания контроллера, есть доп. конденсатор?
Я не зря спросил про программу. Посмотрите к ней инструкцию, как она выставляет биты. Сам бит, судя по даташиту, должен быть установлен в 1.kk042fjv писал(а):галочку где WTDON, то сторожевой таймер отключится?
Да.kk042fjv писал(а):поставить конденсатор?
Это одна из Ваших первых разработок на контроллерах?
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
Да. Контроллеры изучаю недавно, изучаю самостоятельно по урокам на http://avr-start.ru/Это одна из Ваших первых разработок на контроллерах?
А такая программа чтоб сам себе поставил ТЗ и выполнил то это первая программа, но она работает как мне надо.
Там же на скриншоте все прекрасно видно. Птица = 0, т.е. бит включен. Так что собака там вырублена, и судя по коду, програмно она тоже не запущена.Vladlog писал(а):Я не зря спросил про программу. Посмотрите к ней инструкцию, как она выставляет биты.
А если есть подозрения на наводки на ногу сброса, то ему можно внешнюю цепь сброса приспособить из резистора на Vpp и кондера на Gnd.
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
Сделал я пару экспериментов:
1) выставил фьюз, поставил птицу на WDTON, команду обнуления не стал ставить, программа даже двух минут не работала, сбрасывался микроконтроллер.
2) вернул фьюз на место, подключил питание к другому источнику питания гонял минут 20 ни одного сбоя не произошло
1) выставил фьюз, поставил птицу на WDTON, команду обнуления не стал ставить, программа даже двух минут не работала, сбрасывался микроконтроллер.
2) вернул фьюз на место, подключил питание к другому источнику питания гонял минут 20 ни одного сбоя не произошло
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42
- Сообщения: 261
- Зарегистрирован: Ср авг 01, 2012 10:45:42



