У atmega8 бывают иногда сбои

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Добрый день!
Подскажите, у atmega8 бывают иногда сбои, может это быть из-за питания или что то в программе, так как параллельно её стоит один мотор и ШИМ с AVR управляет вторым мотором. Запитано все от блока 24В.
Реклама
Это не хвост, это антенна
Сообщения: 1428
Зарегистрирован: Ср фев 25, 2009 04:32:44
Откуда: Находка

Сообщение Vladlog »

На это можно ответить только ознакомившись с программой и схемой включения, причем - лучше с разводкой платы, так как бывают и там подводные камни. Только это, как правило, занимает много времени, но может у кого-то и будет свободное время.
А на то, что имеем, можно сказать, что бывают сбои и при некачественном питании, и, естественно, при кривом ПО.
Изображение
Реклама
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

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

#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)
был выключен. Все должно быть выключено кроме OCR1BL=0xC0;
Но у меня все началось сначала, как будто кто то перегрузил
Это не хвост, это антенна
Сообщения: 1428
Зарегистрирован: Ср фев 25, 2009 04:32:44
Откуда: Находка

Сообщение Vladlog »

А зачем столько лишних операций с флагами? Можно же сделать сразу:

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

 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 и для контроллеров - Ассемблер, так что, может что-то и не так понял из кода, но в принципе, криминала не увидел.
А фьюзы правильно выставлены? В частности, сторожевой таймер не включен?
Схема питания не показана.
Изображение
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

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

И еще, я бы убрал арифметику с плавающей запятой из программы - лучше посчитать константы приведя их к целым числам это сделает компилятор один раз при компиляции программы а не контроллер каждый раз выполняя тяжёлые операции умножения и сравнения.
Контактная информация:
Реклама
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

"Vladlog"
Изображение
Фьюзы выставлял таким образом.
В коде я конечно хочу лишнее убрать, попробуем и с вашим вариантом поработать.
Реклама
Это не хвост, это антенна
Сообщения: 1428
Зарегистрирован: Ср фев 25, 2009 04:32:44
Откуда: Находка

Сообщение Vladlog »

Все может быть, по этому и говорил, что надо смотреть и схему. По поводу арифметики согласен все 100. :)
С If-ами тоже надо оптимизировать. Если V<3.1, то вторая проверка не нужна, ясно же, что если V не меньше 3.1, значит точно больше или равно. :)
Изображение
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Надо тщательно просмотреть разводку платы и экранировать от внешних полей.
Плату пока еще не разводил, все спаяно на макетке (все вкуче).
И еще, я бы убрал арифметику с плавающей запятой из программы - лучше посчитать константы приведя их к целым числам
Не совсем понял про арифметику? тут смысл такой: на АЦП приходит сигнал с датчика температуры (К1019ЧТ1) и AVR управляет подачей топлива и моторами. Все работает как нужно, но иногда происходит сбой какой-то
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

"Vladlog"
С If-ми был такой вариант, потом зачем то переделал, получается зря
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Изображение
питание вот так паял
Это не хвост, это антенна
Сообщения: 1428
Зарегистрирован: Ср фев 25, 2009 04:32:44
Откуда: Находка

Сообщение Vladlog »

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

Это все хорошо, но на самой плате, совсем рядом, практически на ногах питания контроллера, есть доп. конденсатор?
Изображение
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Если я поставлю галочку где WTDON, то сторожевой таймер отключится?
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

на самой плате, совсем рядом, практически на ногах питания контроллера, есть доп. конденсатор?
Конденсатора нету, т.е. между 7 и 8 выводом поставить конденсатор?
Это не хвост, это антенна
Сообщения: 1428
Зарегистрирован: Ср фев 25, 2009 04:32:44
Откуда: Находка

Сообщение Vladlog »

kk042fjv писал(а):галочку где WTDON, то сторожевой таймер отключится?
Я не зря спросил про программу. Посмотрите к ней инструкцию, как она выставляет биты. Сам бит, судя по даташиту, должен быть установлен в 1.
kk042fjv писал(а):поставить конденсатор?
Да.

Это одна из Ваших первых разработок на контроллерах?
Изображение
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Это одна из Ваших первых разработок на контроллерах?
Да. Контроллеры изучаю недавно, изучаю самостоятельно по урокам на http://avr-start.ru/
А такая программа чтоб сам себе поставил ТЗ и выполнил то это первая программа, но она работает как мне надо.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2168
Зарегистрирован: Сб окт 10, 2009 10:34:07
Откуда: Україна, Хорол

Сообщение Victor_P. »

Vladlog писал(а):Я не зря спросил про программу. Посмотрите к ней инструкцию, как она выставляет биты.
Там же на скриншоте все прекрасно видно. Птица = 0, т.е. бит включен. Так что собака там вырублена, и судя по коду, програмно она тоже не запущена.
А если есть подозрения на наводки на ногу сброса, то ему можно внешнюю цепь сброса приспособить из резистора на Vpp и кондера на Gnd.
Мои паяльные станции: первая, вторая, фен.
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Сделал я пару экспериментов:
1) выставил фьюз, поставил птицу на WDTON, команду обнуления не стал ставить, программа даже двух минут не работала, сбрасывался микроконтроллер.
2) вернул фьюз на место, подключил питание к другому источнику питания гонял минут 20 ни одного сбоя не произошло
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

А если есть подозрения на наводки на ногу сброса, то ему можно внешнюю цепь сброса приспособить из резистора на Vpp и кондера на Gnd
Изображение

Это таким образом?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2168
Зарегистрирован: Сб окт 10, 2009 10:34:07
Откуда: Україна, Хорол

Сообщение Victor_P. »

ага
Мои паяльные станции: первая, вторая, фен.
Грызет канифоль
Сообщения: 261
Зарегистрирован: Ср авг 01, 2012 10:45:42

Сообщение kk042fjv »

Все равно произошел сброс и от второго источника
Ответить

Вернуться в «Разные вопросы по МК»