roboforum.ru

Технический форум по робототехнике.

Глюк компилятора CVAVR

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Глюк компилятора CVAVR

Сообщение Amstron » 27 июн 2013, 00:31

Здравствуйте!
Написал я наконец программу для своего устройства, все работало четко, пока не понадобилось внести еще дополнение в программу.

Собственно скидываю часть программы, где обнаружил, что происходит глюк:

Код: Выделить всёРазвернуть
void ADC_dathika_gazz(void)

                   {
                        unsigned char  p;
                        unsigned long int Vsr = 0;// Vsr может быть максимум
                        unsigned int a;
                        for (p=0;p<sredn_tochka;p++)  // не более 63 выборок!!!
                       { 
                          if (stabilizator_GAZ == 1) ADC_bort = 600;
                              else {
                                     //Инициализация входа АЦП для изм борт напряжения
                                     ADMUX=0b00000101; // bit 7,6=1 - внутр. ИОН= 5 в,  bit 3,2,1,0  канал АЦП-adc5
                                     ADCSRA=0b10001111; // бит 7 - разрешить, бит 0..2 частота преобразования,  3 бит - разрешить прерывание
                                     Voltmetr ();  //измеряем бортовое напряжение
                                     ADC_bort = Srednee_znahenie_ADC ; //присваеваем значение АЦП борт сети
                                   }
                                         
                                   
                        //Инициализация входа АЦП для изм датчика газа
                        ADMUX=0b00000111; // bit 7,6=1 - внутр. ИОН= 5 в,  bit 3,2,1,0  канал АЦП-adc7
                        ADCSRA=0b10001111; // бит 7 - разрешить, бит 0..2 частота преобразования,  3 бит - разрешить прерывание
                        Voltmetr ();
                        ADC_dathika_gazzz = (Srednee_znahenie_ADC*1000 )/ADC_bort ; 
                       
                       
                         if (stabilizator_GAZ == 1) ADC_bort = 600;
                              else {
                                     //Инициализация входа АЦП для изм борт напряжения
                                     ADMUX=0b00000101; // bit 7,6=1 - внутр. ИОН= 5 в,  bit 3,2,1,0  канал АЦП-adc5
                                     ADCSRA=0b10001111; // бит 7 - разрешить, бит 0..2 частота преобразования,  3 бит - разрешить прерывание
                                     Voltmetr ();  //измеряем бортовое напряжение
                                     ADC_bort = Srednee_znahenie_ADC ; //присваеваем значение АЦП борт сети
                                   }
                       
                         //Инициализация входа АЦП для изм датчика газа
                          ADMUX=0b00000111; // bit 7,6=1 - внутр. ИОН=2,56в,  bit 3,2,1,0  канал АЦП-adc7
                         ADCSRA=0b10001111; // бит 7 - разрешить, бит 0..2 частота преобразования,  3 бит - разрешить прерывание
                         Voltmetr ();
                         
                         a = ADC_dathika_gazzz - ((Srednee_znahenie_ADC *1000)/ADC_bort);
                         
                          if (a == 0) Vsr=Vsr+ADC_dathika_gazzz ;
                        else  p--;
                        }
                        ADC_dathika_gazzz = Vsr/sredn_tochka;
                        if (ADC_dathika_gazzz > 1 ) IGN_gaz = 1;
                        else   IGN_gaz = 0 ;

                    }



Вопщем раскажу поподробнее: если эту строчку if (stabilizator_BENZ_bit == 1) ADC_bort = 600;

изменить на if ( 1) ADC_bort = 600; то глюка нет (но мне эта строчка не нужна)

Но если я это пишу, то у меня глюк вылазиет (перестает измерятся температура, такое ощущение что инициализация термодатчиков не произошла, постоянно НОЛЬ пишет)


Я не понимаю, что за касяк. Переменная stabilizator_BENZ_bit нигде не используется, в том плане, что бы задать ей новое значение, то мне надо зайти в дополнительное меню и выставить. То есть эта переменная ни каким образом не пересекается с температурой.
Последний раз редактировалось Myp 27 июн 2013, 16:56, всего редактировалось 1 раз.
Причина: зачем спойлер?
Amstron
 
Сообщения: 4
Зарегистрирован: 31 окт 2010, 19:20

Re: Глюк компилятора CVAVR

Сообщение avr123.nm.ru » 27 июн 2013, 02:23

попробуй нормально написать:

if ( ) { }
else { }
Читайте !
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Глюк компилятора CVAVR

Сообщение Angel71 » 27 июн 2013, 02:50

вас внешний вид спойлера совсем не смущает?
если код написать без пробелов в одну строчку, то читать его будет ещё веселей. неужели так сложно потратить пару секунд и сделать код хоть немного более читабельным?
Код: Выделить всёРазвернуть
void ADC_dathika_gazz(void)
{
   unsigned char p;
   unsigned long int Vsr = 0;// Vsr может быть максимум
   unsigned int a;
   for (p = 0; p < sredn_tochka; p++) // не более 63 выборок!!!
   {
      if (1 == stabilizator_GAZ)
         ADC_bort = 600;
      else
      {
         //Инициализация входа АЦП для изм борт напряжения
         ADMUX = 0b00000101; // bit 7,6=1 - внутр. ИОН= 5 в, bit 3,2,1,0 канал АЦП-adc5
         ADCSRA = 0b10001111; // бит 7 - разрешить, бит 0..2 частота преобразования, 3 бит - разрешить прерывание
         Voltmetr(); //измеряем бортовое напряжение
         ADC_bort = Srednee_znahenie_ADC; //присваеваем значение АЦП борт сети
      }

      //Инициализация входа АЦП для изм датчика газа
      ADMUX = 0b00000111; // bit 7,6=1 - внутр. ИОН= 5 в, bit 3,2,1,0 канал АЦП-adc7
      ADCSRA = 0b10001111; // бит 7 - разрешить, бит 0..2 частота преобразования, 3 бит - разрешить прерывание
      Voltmetr();
      ADC_dathika_gazzz = (Srednee_znahenie_ADC * 1000) / ADC_bort;

      if (1 == stabilizator_GAZ)
         ADC_bort = 600;
      else
      {
         //Инициализация входа АЦП для изм борт напряжения
         ADMUX = 0b00000101; // bit 7,6=1 - внутр. ИОН= 5 в, bit 3,2,1,0 канал АЦП-adc5
         ADCSRA = 0b10001111; // бит 7 - разрешить, бит 0..2 частота преобразования, 3 бит - разрешить прерывание
         Voltmetr(); //измеряем бортовое напряжение
         ADC_bort = Srednee_znahenie_ADC; //присваеваем значение АЦП борт сети
      }

      //Инициализация входа АЦП для изм датчика газа
      ADMUX = 0b00000111; // bit 7,6=1 - внутр. ИОН=2,56в, bit 3,2,1,0 канал АЦП-adc7
      ADCSRA = 0b10001111; // бит 7 - разрешить, бит 0..2 частота преобразования, 3 бит - разрешить прерывание
      Voltmetr();

      a = ADC_dathika_gazzz - ((Srednee_znahenie_ADC *1000) / ADC_bort);

      if (a == 0)
         Vsr = Vsr + ADC_dathika_gazzz;
      else p--;
   }
   ADC_dathika_gazzz = Vsr / sredn_tochka;
   if (ADC_dathika_gazzz > 1)
      IGN_gaz = 1;
   else
      IGN_gaz = 0;
}

где в приведеном огрызке этот stabilizator_BENZ_bit? где код Voltmetr? где остальной код, в котором можно увидеть, как объявляете и что происходит с остальными переменными? о птичках :) смотрели какой код сгенерил компилятор с текущими настройками оптимизации? :pardon: пока никакими глюками компилятора даже и не пахнет.
Аватара пользователя
Angel71
 
Сообщения: 10668
Зарегистрирован: 18 апр 2009, 22:18
Предупреждения: -1

Re: Глюк компилятора CVAVR

Сообщение Amstron » 27 июн 2013, 10:03

посмотрите настройки компиля и вывод после компиляции, там все нормально?

для робофорума2.jpeg

для робофорума1.jpeg


Добавлено спустя 23 минуты 50 секунд:
Глюк, по поводу температуры отражается на этом моменте (то что писал выше, на температуру не влияет, влияет на другое... ):

В моем устройстве, есть отдельное меню, но оно работает нe постоянно.
Оно нужно для настройки устройства.
Дак вот, если я в этом меню добавляю еще один (не знаю как назвать это ), смотрите ниже:
Код: Выделить всёРазвернуть
case 5:

                           {   bit a;

                                 if (knopka2==2)
                                    {
                                      bukva_0 = 5;  // S
                                      bukva_1 = 10; // выкл
                                      bukva_2 = 0;   // 0
                                      bukva_3 = 22;   // n
                                      a = 1;
                                    }

                                     if (knopka3==3)
                                    {
                                      bukva_0 = 5;  // S
                                      bukva_1 = 0; // 0
                                      bukva_2 = 23;   // F
                                      bukva_3 = 23;   // F
                                      a = 0;
                                    }

                                     if (knopka1==1)
                                    { while (knopka1==1){  } ;
                                          if (a == 1) stabilizator_GAZ = 1; else stabilizator_GAZ = 0;
                                              menu_gaz = 0;
                                              vukluchit_bukvu();
                                              rejim=31;
                                              xg = 5;
                                    }


                             }


то перестает измерятся температура.
Термодатчики программа находит, но температуру всегда показывает НОЛЬ !

MAX_DEVICES=w1_search(0xf0,rom_code); //ищим датчики, и записуем их адреса в масив
ds18b20_init(0,-55,125,DS18B20_9BIT_RES); // переключения термометра в 9 битный режим

само измерение делаю так:

Код: Выделить всёРазвернуть
if (izmerenie_temperaturu > 20)
                          { nomer_datchika ++, izmerenie_temperaturu = 0;
                           if (nomer_datchika > MAX_DEVICES - 1)  nomer_datchika = 0;
                           datchik_temp [nomer_datchika] =  ds18b20_temperature(&rom_code[nomer_datchika][0]);  //читаем температуру с выбранного датчика


                             if (datchik_temp [nomer_datchika] == -9999) {}
                                else
                                  {
                                       if (datchik_temp [nomer_datchika] > datchik_temp_max [nomer_datchika])
                                          {
                                           datchik_temp_max [nomer_datchika] = datchik_temp [nomer_datchika];
                                           }
                                         else
                                            {
                                             if (datchik_temp [nomer_datchika] < datchik_temp_min [nomer_datchika])
                                              {
                                               datchik_temp_min [nomer_datchika] = datchik_temp [nomer_datchika];
                                               }
                                            }
                                   }
                          }
Последний раз редактировалось Myp 27 июн 2013, 16:59, всего редактировалось 2 раз(а).
Причина: прекращай пользоваться спойлером!
Amstron
 
Сообщения: 4
Зарегистрирован: 31 окт 2010, 19:20

Re: Глюк компилятора CVAVR

Сообщение RoboHobbyRu » 28 июн 2013, 02:27

Попробую поугадывать:
переменная stabilizator_BENZ_bit - имеет некий тип равносильный типу bool(ean) в языках отличных от Си, тогда имеет смысл попробовать её естественным путём использовать:
Код: Выделить всёРазвернуть
if (stabilizator_BENZ_bit) ...

либо (если так нравится больше):
Код: Выделить всёРазвернуть
if (stabilizator_BENZ_bit == true) ...
RoboHobbyRu
 
Сообщения: 203
Зарегистрирован: 04 май 2013, 10:35
Откуда: Тюмень

Re: Глюк компилятора CVAVR

Сообщение Amstron » 29 июн 2013, 00:27

подскажите, у меня стек и оперативка не переполняется?

Какая последняя версия с таблеткой на данный момент есть?
Amstron
 
Сообщения: 4
Зарегистрирован: 31 окт 2010, 19:20


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16