Сложность в написании программы состоит в то, что нельзя использовать прямые задержки как это делается во многих программах типа: старт ацп на чтение...пауза 20мсек...чтение ацп...анализ, переключение реле....пауза 10мс( для реле)...анализ ... ну и тд . такой стиль называется : первый класс, первая четверть, и он полностью убирает возможность многозадачности в современном процессоре. Процессор не должен простаивать - это утопия
На самом деле, все эти процессы должны работать параллельно! Когда вся программа ждет пока реле захлопница и начнется замер ацп, можно много чего еще поделать, например прорисовка в паузах есть очень хороший стиль. Ну а за паузы отвечает таймер, он проставит маячки когда надо. К сожалению из-за i2c нельзя использовать прямой вызов процедуры из таймера, этот возможный конфликт уже не разобрать (может, прерывание i2c прервать эту самую i2c, например когда ацп считывалось).
Так что процесс написания программы не быстрый, при параллельном мышлении много нюансов и флагов.
Вот пример старта тюнера. Контроль контроль и контроль, одни операторы if
if (pttYN && tunerAutoStartYN) { ///потом добавить проверку на наличие тона
if (tunerAutoJustStartedYN) {//рутина перед стартом
tunerAutoJustStartedYN = 0;
if (v_to_dbW(SWR_ch_value[1]) - v_to_dbW(SWR_ch_value[1]) < 3) {
tunerAutoStartYN = 0;
warningOnDisplay((uint8_t *) " HI SWR >6. Check Ant ");
return;
}
if (v_to_dbW(SWR_ch_value[0]) < 0) {
tunerAutoStartYN = 0;
warningOnDisplay((uint8_t *) " Need MORE power or Tone. ");
return;
}
if (v_to_dbW(SWR_ch_value[0]) > 12) {
tunerAutoStartYN = 0;
warningOnDisplay((uint8_t *) " Need less 13dbW power. ");
return;
}
//сохраним значения до старта (с учетом диапазона) надо для не удачной настройки или отмены
tunerBeforeValueLC[nowBandIsNumber][0] = tunerMore50 ?
(uint8_t) (tunerRxNowLCIs[nowBandIsNumber][0] & 1)
://подставим бит кондера
(uint8_t) (tunerRxNowLCIs[nowBandIsNumber][0] & (~1));
tunerBeforeValueLC[nowBandIsNumber][1] = tunerRxNowLCIs[nowBandIsNumber][1];
//первое текущее лучшее значения
tunerLastBestPSR[0]=SWR_ch_value[0];//power
tunerLastBestPSR[1]=SWR_ch_value[1];//swr
tunerLastBestPSR[2]=SWR_ch_value[0]-SWR_ch_value[1];//RL
}//конец рутины
if(tunerSwrReady==2 && tunerRaleyTimer==0){ //если ксв замерили и реле сработало
//First Step
if(tunerTuningStep==0) {//последовательнай проход
//analyse
if(tunerLastBestPSR[2]>SWR_ch_value[0]-SWR_ch_value[1]) {
tunerLastBestPSR[0]=SWR_ch_value[0];//RL
}
if(0<tunerCircleC && tunerCircleC<=255){
tunerCircleC++;
tunerSwrReady=0;
tuner_write(tunerMore50 ?
(uint8_t) (tunerCircleL & 1)
://подставим бит кондера
(uint8_t) (tunerCircleL & (~1)),
tunerCircleC);
tunerRaleyTimer=40;
}
}
}