roboforum.ru

Технический форум по робототехнике.
Текущее время: 06 июн 2025, 06:37

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Глюк компилятора CVAVR
СообщениеДобавлено: 27 июн 2013, 00:31 
Не в сети

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

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

Код:
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 раз.
зачем спойлер?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк компилятора CVAVR
СообщениеДобавлено: 27 июн 2013, 02:23 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
попробуй нормально написать:

if ( ) { }
else { }

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк компилятора CVAVR
СообщениеДобавлено: 27 июн 2013, 02:50 
Не в сети
Аватара пользователя

Зарегистрирован: 18 апр 2009, 22:18
Сообщения: 10668
вас внешний вид спойлера совсем не смущает?
если код написать без пробелов в одну строчку, то читать его будет ещё веселей. неужели так сложно потратить пару секунд и сделать код хоть немного более читабельным?
Код:
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: пока никакими глюками компилятора даже и не пахнет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк компилятора CVAVR
СообщениеДобавлено: 27 июн 2013, 10:03 
Не в сети

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

Вложение:
для робофорума2.jpeg
для робофорума2.jpeg [ 60.9 КиБ | Просмотров: 2639 ]

Вложение:
для робофорума1.jpeg
для робофорума1.jpeg [ 43.57 КиБ | Просмотров: 2644 ]


Добавлено спустя 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 раз(а).
прекращай пользоваться спойлером!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк компилятора CVAVR
СообщениеДобавлено: 28 июн 2013, 02:27 
Не в сети

Зарегистрирован: 04 май 2013, 10:35
Сообщения: 203
Откуда: Тюмень
Попробую поугадывать:
переменная stabilizator_BENZ_bit - имеет некий тип равносильный типу bool(ean) в языках отличных от Си, тогда имеет смысл попробовать её естественным путём использовать:
Код:
if (stabilizator_BENZ_bit) ...

либо (если так нравится больше):
Код:
if (stabilizator_BENZ_bit == true) ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Глюк компилятора CVAVR
СообщениеДобавлено: 29 июн 2013, 00:27 
Не в сети

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

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 4 часа


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

Сейчас этот форум просматривают: Google [Bot] и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO