Обсуждаем контроллеры компании Atmel.
Ответить

Не понимаю поведение переменной ЗАКРЫТО

Сб окт 21, 2023 21:56:15

Доброго всем. Есть код, в рамках которого совершенно не могу понять поведение переменной i. Собственно счетчик циклов, переменная i должна увеличиваться в цикле, определенном как while(i<=cycles). Однако этого не происходит (это видно по выводу на индикатор). Следовательно она каждый раз обнуляется? Сколько не смотрел, не могу найти косяк. Если кто ткнет носом -- буду весьма благодарен.
Спойлер
Код:
 
while(1){ ......
//*************************AUTOTUNE RID*********************
  if(bitRead(myFlags, flag_TUNE)){
    target_temperature = 100;
      if(value_temperature > target_temperature) \
        {sevseg.setChars("ERR 4"); sevseg.refreshDisplay();} else{
    LedEvent=t.oscillate(ledPin, 70, HIGH);
    sevseg.setChars("TUNE");     
  //  target_temperature = 120;
  //pidCycle = t.every(windowSize, pidCompute, (void*)0);       
  byte i = 0; // Cycle counter
   byte cycles = 3;
   uint16_t outputValue = ICR1;
  bool output = true;
  OCR1B = 0;
  START_PWM;
  //TCCR1B |= (1<<WGM13)|(1 << WGM12)|(1<<CS12)|(1<<CS10);
   long t1, t2, tHigh, tLow;
  float pAverage, iAverage, dAverage;
  float ku = (4.0 * ((ICR1) / 2.0));    
   tHigh = tLow = 0; // More time variables
   byte max = 0; // Max input
   byte min = 255; // Min input
   pAverage = iAverage = dAverage = 0;
  t1 = t2 = millis(); // Times used for calculating period
   //**********************************************************************************************************
   while (i <= cycles) {
   OCR1B = outputValue; 
  // display(value_temperature, index[T]);
  sevseg.refreshDisplay(); 
  t.update(); // Updates the timer 
   if ((ADCSRA & (1 << ADIF))) value_temperature = get_temperature(); else;
   max = (max > value_temperature) ? max : value_temperature;    // Calculate max and min
   min = (min < value_temperature) ? min : value_temperature;   
   if (output && value_temperature > target_temperature) {    // Output is on and value_temperature signal has risen to target
    output = false;   // Turn output off, record current time as t1, calculate tHigh, and reset maximum
    outputValue = 0;
    t1 = millis();
    tHigh = t1 - t2;
   }   
   if (!output && value_temperature < target_temperature) {    // Output is off and value_temperature signal has dropped to target
    output = true;    // Turn output on, record current time as t2, calculate tLow
    outputValue = ICR1;
    t2 = millis();
    tLow = t2 - t1;
    // Calculate Ku (ultimate gain)
    // Formula given is Ku = 4d / πa
    // d is the amplitude of the output signal
    // a is the amplitude of the value_temperature signal
    /*ku = ku / (M_PI * (max - min) / 2.0);   
    uint32_t tu = tLow + tHigh;    // Calculate Tu (period of output oscillations)   
    // Calculate gains
    Kp = 0.2 * ku;
    Ki = (Kp / (0.5 * tu)) * windowSize;
    Kd = (0.33 * Kp * tu) / windowSize;       
    if (i <= 8) {        // Average all gains after the first two cycles
      pAverage += Kp;
      iAverage += Ki;
      dAverage += Kd;
    }    */
     
     ++i;// Increment cycle count 
      display(i, index[3]);
      max = min = target_temperature;    // Reset minimum, maximum
   }
  }
   //output = false;
  //t.stop(pidCycle);
   STOP_PWM;  // PWM Stop
  RELAY_OFF;
  TCNT1 = outputValue = OCR1B = 0;
  TCCR1A &=~(1<<COM1B1); TRELAY_OFF;   
    Kp = pAverage / (i - 1);
    EEPROM_float_write(addr_Kp, Kp);
    Ki = iAverage / (i - 1);
    EEPROM_float_write(addr_Ki, Ki);
    Kd = dAverage / (i - 1);
    EEPROM_float_write(addr_Kd, Kd);
    bitClear(myFlags, flag_TUNE);
    sevseg.setChars("-END-");
    t.oscillate(buzzerPin, 1000, HIGH,10);
    t.stop(LedEvent);
    bitClear(myFlags, flag_TUNE);
    target_temperature = EEPROM.read(addr_TEMPR);
    }
  }
  }

Тема закрыта, всем, давшим реально дельные советы -- большое спасибо :beer:
Последний раз редактировалось Land Вс окт 22, 2023 17:40:29, всего редактировалось 1 раз.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 03:24:26

не... читать код, где объявления переменных встречаются где угодно - нафиг. Не каждый компилятор такое вообще позволит, и я не хочу.
но навскидку: while (i <= cycles) { - этот цикл бесконечен, и это было бы очевидно, напиши Вы программу нормально.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 07:59:15

Да, читать трудно, но кажется - у тебя цикл в цикле имеется по i ?

Re: Не понимаю поведение переменной

Вс окт 22, 2023 08:59:39

я знаю, что чужой код читать трудно. И каждый знает, как надо писать правильно. Но почему-то никто не пишет.
ИМХО, совершенно очевидно, что цикл while (i <= cycles) не бесконечен.
Да, читать трудно, но кажется - у тебя цикл в цикле имеется по i ?

где? У меня глаз замылился, я не вижу, но вполне возможно

Re: Не понимаю поведение переменной

Вс окт 22, 2023 09:55:46

Возьми текстовый редактор с подсветкой синтаксиса кода, типа UltraEdit , Notepad++, Bred - там быстрее ошибки такого рода найдешь.

ЗЫ. Не хочешь иметь таких проблем - для каждого цикла используй уникальную переменную. Настолько уникальную, чтобы и с вложениями совпасть не могла.
У С в этом ахиллесова пята.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 11:14:32

Так с чего ей изменяться? Не вижу нигде в этом цикле i++ . Ведь в отличие от for, где параметр цикла обычно модифицируется в
Код:
for (инициализация; условие; приращение;)
, в while для этого понадобится отдельный оператор.
А за такое оформление кода на программерском форуме высекли бы розгами. Правила хорошего тона: форматировать отступами, чтобы наглядно выделялись логически законченные блоки. Хотя бы как здесь:
Изображение
Вложения
Сииии.JPG
(10.21 KiB) Скачиваний: 176

Re: Не понимаю поведение переменной

Вс окт 22, 2023 11:34:14

.
Последний раз редактировалось Martian Вс окт 22, 2023 12:06:13, всего редактировалось 1 раз.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 11:41:17

... к окулисту? Не-а :)

Re: Не понимаю поведение переменной

Вс окт 22, 2023 12:02:36

Возьми текстовый редактор с подсветкой синтаксиса кода, типа UltraEdit , Notepad++, Bred - там быстрее ошибки такого рода найдешь.
Панятна. Ты суслика видишь:? Нет. И я -- нет, а он -- есть. В моем первом посте была ключевая фраза "ткните носом". А бла-бла-бла про возьми редактор с подсветкой синтаксиса -- это и я умею. Только толку от этого -- ноль. Это не помощь, это вы@бывание. Уж извини за прямоту.
Так с чего ей изменяться? Не вижу нигде в этом цикле i++ .

Код:
++i;// Increment cycle count
не считово? :shock:

Re: Не понимаю поведение переменной

Вс окт 22, 2023 12:03:59

Каков код, таков и пациент... нет, гопникам пусть помогают гопники.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 12:05:58

Но это ни разу не очевидно, потрудитесь привести код в порядок, а не предлагать обществу франкенштейна бездумно-скопипастенного.

а... расставьте табуляцию так, как я привык? Понимаю, но не настаиваю на вашем участии. Всего хорошего.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 12:16:45

Пока у тебя нет опыта. В чужую программу лезть править - запутать автора.

Дело в том, что отступы тоже выражают логику программы, и расставить их по "вашему" приведет к дополнительным непоняткам.

Ничего, со временем и практикой позже поймешь.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 12:17:19

В общем оказалось, что дело не в расстановке табуляции :D
Реальная систем в железе имеет "хвост" из колебаний значения value_temperature. Аппаратный "дребезг" температуры. И каждый переход через целевое значение target_temperature вызывает соответствующую обработку и я просто вылетаю из цикла while быстрее, чем могу это заметить своим глазом без окулиста. Осталось придумать, как програмно подавить "хвост", длительность которого заранее не известна.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 12:19:37

Land писал(а):Код:
++i;// Increment cycle count
не считово?
не считово, так как находится за пределами бесконечного цикла while (i <= cycles).
внутри этого цикла i не изменяется, поэтому цикл бесконечный - выхода из цикла нет.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 12:20:00

Муркиз, отступы, они же табуляция, всего лишь удобство чтения кода. Кому-то удобно так, кому-то -- эдак. Ни на какую логику кода они ни как не влияют. Но ты имеешь право думать по-другому.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 12:22:09

Land, это ты имеешь право думать по-другому.
а все другие предпочитают правильную табуляцию для удобства чтения кода.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 12:24:13

не считово, так как находится за пределами бесконечного цикла while (i <= cycles).
внутри этого цикла i не изменяется, поэтому цикл бесконечный - выхода из цикла нет.

хорошая версия, но нет. инкремент находится внутри цикла while. Даже более того, он находится внутри условия if (!output && value_temperature < target_temperature), которое находится внутри цикла while. Я понимаю, что читать чужой код тяжело и не попросил бы этого делать. Но...

Добавлено after 45 seconds:
Starichok51, когда я был моложе и глупее, я тоже любил говорить за всех. Потом повзрослел.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 12:31:12

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

Re: Не понимаю поведение переменной

Вс окт 22, 2023 13:18:48

Солидарен с ребятами выше. Можно было хоть куски наглухо закомментированного кода убрать. Меня, например, они запутали.

Re: Не понимаю поведение переменной

Вс окт 22, 2023 14:43:14

Land, этот код называется "быдлокод", и не надо тут уговаривать, что это не так.
Постыдился бы выкладывать подобное. И да, об авторе это тоже многое говорит.
Ответить