Обсуждаем контроллеры компании 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);
}
}
}
Тема закрыта, всем, давшим реально дельные советы -- большое спасибо
Последний раз редактировалось
Land Вс окт 22, 2023 17:40:29, всего редактировалось 1 раз.
Вс окт 22, 2023 03:24:26
не... читать код, где объявления переменных встречаются где угодно - нафиг. Не каждый компилятор такое вообще позволит, и я не хочу.
но навскидку: while (i <= cycles) { - этот цикл бесконечен, и это было бы очевидно, напиши Вы программу нормально.
Вс окт 22, 2023 07:59:15
Да, читать трудно, но кажется - у тебя цикл в цикле имеется по i ?
Вс окт 22, 2023 08:59:39
я знаю, что чужой код читать трудно. И каждый знает, как надо писать правильно. Но почему-то никто не пишет.
ИМХО, совершенно очевидно, что цикл while (i <= cycles) не бесконечен.
Да, читать трудно, но кажется - у тебя цикл в цикле имеется по i ?
где? У меня глаз замылился, я не вижу, но вполне возможно
Вс окт 22, 2023 09:55:46
Возьми текстовый редактор с подсветкой синтаксиса кода, типа UltraEdit , Notepad++, Bred - там быстрее ошибки такого рода найдешь.
ЗЫ. Не хочешь иметь таких проблем - для каждого цикла используй уникальную переменную. Настолько уникальную, чтобы и с вложениями совпасть не могла.
У С в этом ахиллесова пята.
Вс окт 22, 2023 11:14:32
Так с чего ей изменяться? Не вижу нигде в этом цикле i++ . Ведь в отличие от for, где параметр цикла обычно модифицируется в
- Код:
for (инициализация; условие; приращение;)
, в while для этого понадобится отдельный оператор.
А за такое оформление кода на программерском форуме высекли бы розгами. Правила хорошего тона: форматировать отступами, чтобы наглядно выделялись логически законченные блоки. Хотя бы как здесь:
- Вложения
-
- Сииии.JPG
- (10.21 KiB) Скачиваний: 176
Вс окт 22, 2023 11:34:14
.
Последний раз редактировалось
Martian Вс окт 22, 2023 12:06:13, всего редактировалось 1 раз.
Вс окт 22, 2023 11:41:17
... к окулисту? Не-а
Вс окт 22, 2023 12:02:36
Возьми текстовый редактор с подсветкой синтаксиса кода, типа UltraEdit , Notepad++, Bred - там быстрее ошибки такого рода найдешь.
Панятна. Ты суслика видишь:? Нет. И я -- нет, а он -- есть. В моем первом посте была ключевая фраза "ткните носом". А бла-бла-бла про возьми редактор с подсветкой синтаксиса -- это и я умею. Только толку от этого -- ноль. Это не помощь, это вы@бывание. Уж извини за прямоту.
Так с чего ей изменяться? Не вижу нигде в этом цикле i++ .
- Код:
++i;// Increment cycle count
не считово?
Вс окт 22, 2023 12:03:59
Каков код, таков и пациент... нет, гопникам пусть помогают гопники.
Вс окт 22, 2023 12:05:58
Но это ни разу не очевидно, потрудитесь привести код в порядок, а не предлагать обществу франкенштейна бездумно-скопипастенного.
а... расставьте табуляцию так, как я привык? Понимаю, но не настаиваю на вашем участии. Всего хорошего.
Вс окт 22, 2023 12:16:45
Пока у тебя нет опыта. В чужую программу лезть править - запутать автора.
Дело в том, что отступы тоже выражают логику программы, и расставить их по "вашему" приведет к дополнительным непоняткам.
Ничего, со временем и практикой позже поймешь.
Вс окт 22, 2023 12:17:19
В общем оказалось, что дело не в расстановке табуляции
Реальная систем в железе имеет "хвост" из колебаний значения value_temperature. Аппаратный "дребезг" температуры. И каждый переход через целевое значение target_temperature вызывает соответствующую обработку и я просто вылетаю из цикла while быстрее, чем могу это заметить своим глазом без окулиста. Осталось придумать, как програмно подавить "хвост", длительность которого заранее не известна.
Вс окт 22, 2023 12:19:37
Land писал(а):Код:
++i;// Increment cycle count
не считово?
не считово, так как находится за пределами бесконечного цикла while (i <= cycles).
внутри этого цикла i не изменяется, поэтому цикл бесконечный - выхода из цикла нет.
Вс окт 22, 2023 12:20:00
Муркиз, отступы, они же табуляция, всего лишь удобство чтения кода. Кому-то удобно так, кому-то -- эдак. Ни на какую логику кода они ни как не влияют. Но ты имеешь право думать по-другому.
Вс окт 22, 2023 12:22:09
Land, это ты имеешь право думать по-другому.
а все другие предпочитают правильную табуляцию для удобства чтения кода.
Вс окт 22, 2023 12:24:13
не считово, так как находится за пределами бесконечного цикла while (i <= cycles).
внутри этого цикла i не изменяется, поэтому цикл бесконечный - выхода из цикла нет.
хорошая версия, но нет. инкремент находится внутри цикла while. Даже более того, он находится внутри условия if (!output && value_temperature < target_temperature), которое находится внутри цикла while. Я понимаю, что читать чужой код тяжело и не попросил бы этого делать. Но...
Добавлено after 45 seconds:Starichok51, когда я был моложе и глупее, я тоже любил говорить за всех. Потом повзрослел.
Вс окт 22, 2023 12:31:12
Land, с таким оформлением я мог ошибиться с поиском фигурных скобок.
Land писал(а):Я понимаю, что читать чужой код тяжело и не попросил бы этого делать.
алес-капут - более я не буду читать твой код.
Вс окт 22, 2023 13:18:48
Солидарен с ребятами выше. Можно было хоть куски наглухо закомментированного кода убрать. Меня, например, они запутали.
Вс окт 22, 2023 14:43:14
Land, этот код называется "быдлокод", и не надо тут уговаривать, что это не так.
Постыдился бы выкладывать подобное. И да, об авторе это тоже многое говорит.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.