Сравнение двух float

В общем уже голова не варит, половина четвёртого утра. Надеялся добить, но теперь уже завтра и с Вашей помощью.
Суть такова:

в main вываливаюсь в текущее состояние:
if (state == START_HEATING)   // начало нагрева
            {
                temp_check();
                heatstart();
            }

вызываем функции опроса датчика и фиксации текущей температуры в переменной degrees

void temp_check(void)
  {
     m_wait_ds20 = 0;    
     if(m_ctr - m_wait_ds20 >= 1500)   
         {
          ds18b20_init(0,1,100,DS18B20_12BIT_RES);  
          m_wait_ds20 = m_ctr;     
          degrees = ds18b20_temperature(0);
         }

и включения нагрева

void heatstart (void)
   {
        if (starttemp < degrees)
        heater_1_on;
        
         if (starttemp >= degrees)
        {
            heater_1_off;
            state = HEATING_OFF;
         }
   }  


соответственно degrees объявлена как float. starttemp, тоже float
float degrees, starttemp;


starttemp задаётся с кнопки в отдельной функции во время настройки
void setuptemp (void)
   {
     lcd_gotoxy(0,0);
     lcd_putsf("Set temperature:");
     if(plus_pressed)
    	{
    	starttemp += 1;
        if (starttemp >= 100)
        starttemp = 20;
        sprintf(lcd_buf, "%.1f\xdfC", starttemp);
    	lcd_gotoxy(0,1);
        lcd_puts(lcd_buf);
        }  
    
    if (start_pressed)
    state = STARTPROCESS;
    
   }


Сука, сто процентов выполняется условие
if (starttemp < degrees)

а при отладке перескакивает на
if (starttemp >= degrees)
        {
            heater_1_off;
            state = HEATING_OFF;
         }


Вот ведь не 100%!!!

А всё с точностью до наоборот!
if (starttemp > degrees)

Ну конечно же, заданная больше текущей должна быть, чтобы нагрев включился!
Ночная жесть. Два часа над этой лабудой бился, а если бы лёг спать два часа назад, то с утра за 10 минут нашёл бы косяк! Я уже все талмуды про кошерное сравнение двух float прочитал, и каждый дефайн проверил, и все контакты тестером прошунтировал, дабы убедиться, что не в железе дело!
Мораль: не пренебрегайте здоровым и крепким сном!

Генератор на perl конечного автомата на C.

Идея написать статью возникла, когда наткнулся на easyelectronics.ru/avr-uchebnyj-kurs-konechnyj-avtomat.html

В данной статье рассматривается принцип работы сгенерированного кода, сам генератор написан на perl и в нём особо интересного ничего нет, берите, пользуйтесь, модифицируйте под свои нужды :)

По сути, предыстория написания программы-генератора: некоторое время назад я делал несколько мелких программ для нового проекта, все они различались реакциями на события. День тупого полумеханического труда по написанию почти одного и того же и к вечеру у меня сдали нервы. Попробовал поискать какой-нибудь готовый генератор кода для конечного автомата (КА) или хотя бы таблиц из некого формализованного описания, ведь по виду кажется просто — есть граф, генерируй-нехочу. Главными критериями были простота и чтоб в результате был код на чистом C, без всякиих плюсплюсов — мне же для микроконтроллера! Но тут меня ждал облом. Либо не просто, либо не C, либо вообще монструозно. В общем, ничего подходящего, не нашёл. К обеду следующего дня у меня был простенький наколенный генератор на perl, как в мультике — лучше день потерять зато потом за пять минут долететь :). Потом уже, когда его стали использовать коллеги, дописал некоторые вещи по их замечаниям. В конце концов получилось нечто, что уже не раз пригождалось узкому кругу людей, и что я и хочу представить на суд общественности, может кому-то ещё поможет.

Практически каждый программист микроконтроллеров (да, впрочем, и не только), делая свой проект, сталкивается с необходимостью обработки событий, изменяющих состояние программы/устройства. Обычно для этого используется тот или иной вариант реализации КА. При этом бывает так, что пишет человек КА, только об этом не знает :)


Читать дальше

UART приемник на VHDL

Все говорят что процессы в VHDL выполняются параллельно, а мне надо последовательно!
К примеру сварить кофе, на С это с начла в чашку насыпать кофе, потом залить кипяток. На VHDL кофе и кипяток одновременно, что ж так даже быстрее. А если мне надо пожарить картошку: почистить, порезать, пожарить. С C осталось все по-прежнему, а вот в VHDL появляются непонятки.

На помощь приходит конечный автомат.

Читать дальше