Отговори на тема  [ 56 мнения ]  Отиди на страница Предишна  1, 2, 3, 4  Следваща
Работна температура 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Работна температура
Поради "копи-пасте" мързела , използвам един и същ подход за бутониера, и си е баш "стейт" функция, която се вика от системния таймер. Имам и издънки - за спестяване на портове съм правил матрица с преместващи регистри. Това обаче силно забавя функцията и реално прахосвам процесорно време ,за да.....видя,че няма натиснат бутон. :)


Пет Юни 17, 2016 8:39 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Работна температура
Хммм а защо преместващите регистри да хабят време, дори там има мегдан да направиш още по огляма автоматика, оставяш клока и датат да ги клати някоя от вградените периферии, за целта има достатъчно, а реално то и дата не ти трябва а само клок, а входовете на прекъсване, или входа, ако и входа е мултиплексиран .. чудничко, всичко си пее само и имаш прекъсване само като имаш натиснат бутон, ама външни компоненти отиват. А стейт машина за бутони .. знам ли, ако имаш много бутони става разхищение на код май ... не мис е мисли сега, но така ли иначе имаш някаъв таймер който определя времеконстантата на дебонсинга, може по един да клатиш всички бутони, а може и всеки да си има негов, което си е вече разхищение, при бутони е безсмислено но при реални сигнали няма друг избор.
Някакви оптични датчици четях преди години, релано квадратурен енкодер в по-голям мащаб, да ама имаше доста лъжливи импулси, къде се надраскало черното и станало бяло, къде някой боклук, та на нещо такова не може с еидн таймер, всеки сигнал трябва да си има негов, но за клавиатура яма проблем, дали ще обработиш клика 50 мс по рано или по-късно в повечето случаи няма особенно значение.

п.с. аз не казвам че мойта пркатика е за пример де, аз съм далеч от програмист, моите алгоритми са доста .. двоични да ги наречем, по скоро са подходящи за cpld-та от колтко за процесори, ама до това води правенето на декодери на ttl-ки :)


Пет Юни 17, 2016 11:11 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение Re: Работна температура
ToHu написа:
моите алгоритми са доста .. двоични да ги наречем, по скоро са подходящи за cpld-та от колтко за процесори


Е па посмали малко ;-)
Нали знаеш че алгоритмите в HDL се изпълняват мигновено, независимо че както всеки алгоритъм съдържат последователност от стъпки...


Пет Юни 17, 2016 11:29 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: Работна температура
За обработка на бутони съм си извел 2 решения. И при двете е валидна конвенцията "1=натиснат,0=не натиснат".
1. В случай, че трябва по-сложна логика за бутон (задържане, отпускане, двоен клик и т.н.).
Get_ButtonStates() трябва да връща новите състояния на бутоните само в четни битове, за да могат лесно да се получават фазите.
Код:
void ButtonsDecodeTask(void)
{
    typedef enum {
        BTN_IDLE = 0,
        BTN_PRESSED = 1,
        BTN_RELEASED = 2,
        BTN_HOLD = 3
    } TButtonPhase;
   
    static uint8_t  buttonStates_old = 0;
            uint8_t  buttonStates_new = Get_ButtonStates();
            uint8_t  buttonPhases = (buttonStates_new | (buttonStates_old << 1));
   
    buttonStates_old = buttonStates_new;

    /* Логика за конкретен бутон, вземат се по 2 бита от 'buttonPhases ' */
    switch (buttonPhases & 3)
    {
        case BTN_PRESSED:
        {
            // Разни екшъни
            break;
        }
        case BTN_RELEASED:
        {
            // Още екшъни
            break;
        }
        case BTN_HOLD:
        {
            // Още екшъни
            break;
        }
        default:
        {
            /* BTN_IDLE */
            break;
        }
    }
}

2. Ако трябват само 'pressed' събитията. Няма изисквания за към реда на битовете.
Код:
void ButtonsDecodeTask(void)
{
    static uint8_t  buttonStates_old = 0;
           uint8_t  buttonStates_new = Get_ButtonStates();
           uint8_t  changedInputs = (buttonStates_new ^ buttonStates_old) & buttonStates_new;

    buttonStates_old = buttonStates_new;           
   
    // Сега 'changedInputs' съдържа преходите 0->1 на всички изчетени бутони
    // Тука е юзърската логика ...
}


Пет Юни 17, 2016 11:37 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Работна температура
Да де, ама тук ти е само обработката на самото събитие натиснат, отпуснат бутон, а това събитие не е добра идея да се генерира директно от състоянието на входовете, бутоните трептят, отделно влизат смущения, трябва нещо на по ниско ниво което да следи входа и да казва натиснат не натиснат, иначе самата обработка не е толквоа интересна тъй като обикновенно се работи при вече известно състояние, просто изпълняваш нещо при съответната промяна.


Пет Юни 17, 2016 11:49 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: Работна температура
Затова състоянията на бутоните се доставят през функция. Предполага се, че се подават вече дебаунснати входове. А дебаунса, смятам, си е толкова тривиална задача, че не си струва да разтягам локуми и за него.


Пет Юни 17, 2016 11:53 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Работна температура
Хмм то точно дебонса е тов акоето може да изяде ресурс, много често съм виждал дебонсинг с делей или while :)


Пет Юни 17, 2016 12:04 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение Re: Работна температура
дърлите се за глопости, колеги :D

в днешно време бутоните се цъкат с айфон.
или в краен случай си има фреймуърк (последните лайнукси) - button, led... казваш с cat кой диод в какъв цвят да мига и на какъв интервал и си готоФ

какви са тия пикове, асемблер...


Пет Юни 17, 2016 12:09 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Работна температура
уфф все забравям коя година сме, сори за офтопика, другия път ще го направя със Сири ...


Пет Юни 17, 2016 12:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Яну 20, 2009 11:54 pm
Мнения: 11338
Местоположение: "Занзибар"
Мнение Re: Работна температура
Щото мелите как се прави топла вода (май), да ви кажа как го правех аз, когато през ранния период на Креда се правех на програмист:
Емулирах интегратор след който поставях компаратор с хистерезис на 1/3-та (почти таймер '555). Софтуерно се получава много по-просто отколкото звучи описанието на пръв поглед. Идеята е промяната в изправен (идеален) бутон да се открива за десетина милисекунди, неизправният - по-бавно. И т.н.


Пет Юни 17, 2016 2:12 pm
Профил
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Вто Фев 06, 2007 2:45 am
Мнения: 263
Мнение Re: Работна температура
bongo_x2 написа:
...Емулирах интегратор след който поставях компаратор с хистерезис на 1/3-та ... Софтуерно се получава много по-просто отколкото звучи описанието на пръв поглед...

Искам да видя как софтуерно се емулира интегратор (в код, ако може) и при това да излезе по-просто от това да навиеш един брояч.


Пет Юни 17, 2016 2:34 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение Re: Работна температура
ми брояча си е интегратор, ако брои и наопъки.
кондензатора е времето за сканиране/клока на брояча, захранването е колко бита е брояча.
виж, за хистерезиса на компаратора ти трябва още една инструкция.


Последна промяна ДедоБоре на Пет Юни 17, 2016 2:56 pm, променена общо 1 път



Пет Юни 17, 2016 2:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30686
Местоположение: София
Мнение Re: Работна температура
Ами ... те на ти го каза, навиването на брояч е интегриране, както и инкрементването на променлива също, друг е въпроса ако се хващаш за кривата по която се получава и магическото "е" ... но и това не е невъзможно с почти същите усилия, само дето ще изяде малко рам, по скоро флаш. Но никакъв смисъл няма, цъкаш брояча и си пееш, това е най-лесното.
ех... Дедо ме изпревари


Пет Юни 17, 2016 2:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Re: Работна температура
tolstolob написа:
bongo_x2 написа:
...Емулирах интегратор след който поставях компаратор с хистерезис на 1/3-та ... Софтуерно се получава много по-просто отколкото звучи описанието на пръв поглед...

Искам да видя как софтуерно се емулира интегратор (в код, ако може) и при това да излезе по-просто от това да навиеш един брояч.

Ето. Страница 8 :)


Пет Юни 17, 2016 2:51 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Ное 27, 2012 9:27 pm
Мнения: 2011
Мнение Re: Работна температура
Това сработи с флага идеално:

if((button[1] == 0)&&(flag==0)){flag=1;PORTC.1=1;}
if((button[1] == 1)&&(flag==1)){flag=0;PORTC.1=1;}


Пет Юни 17, 2016 3:17 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 56 мнения ]  Отиди на страница Предишна  1, 2, 3, 4  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни