|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 12:58 pm
Zilog - Z8 Encore! F083A Series - Timer & Button
| Автор |
Съобщение |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Без да ти гледам много кода но тия 10 МС дето си ги сложил да се чакат си е безмислено губене на време, много пъти е дискутирано как можеш да направиш дебоунс без да губиш излишно процесорно време. Писането на код особено за контролери не е редене на парчета код, там е добре да имаш цялостна концепция още като започваш. Много често виждах преди като работех с повечко хора подхода дай-ще направим бутони, дисплей и др.разни щото знаем как ще стане и е лесно пък основния проблем ще го борим после, и много пъти този подход води до под оная круша дето не е по ЕУ регламента ...опитай да си представиш всичко как ще работи заедно и как най-удачно да го решиш. В твоя случай ти трябва таймер, помисли колко от процесите и какви таймери ще изискват, как да минеш с възможно най-малко и как да ги сетнеш така, че да удоволетворяват всички нужди, той след това кода сам ще дойде.
|
| Чет Юли 12, 2018 7:54 am |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Забравих да напиша, не е добре бутона да се проверява в основния цикъл, защото може да го натиснеш точно когато програмата не го проверява. По принцип при достатъчно бърза обработка на основния цикъл може да не е проблем. Иначе тук не е нужен дебоунс. То един път като тръгнат тези 5с. е достатъчно да не е активен бутона докато текат.
Последна промяна slav4o.com на Чет Юли 12, 2018 5:10 pm, променена общо 2 пъти
|
| Чет Юли 12, 2018 2:56 pm |
|
 |
|
Cekins
Ранг: Форумен бог
Регистриран на: Сря Апр 20, 2005 12:02 pm Мнения: 9119 Местоположение: Разград
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Е това ще се направим, че не сме го прочели. Досега не съм имал случай на пропуснат бутон - все се чете в основния цикъл и то на случайни интервали - според зависи. Само че дебоунса е свързан с хардуерни таймери и винаги си работи точно както трябва. Имам си вкарани и repeat-и като на стандартна клавиатура. Друг е въпроса ако е енкодер - там не винаги се получава желания резултат ако не е през прекъсване. Ама като цяло бутоните винаги ги правя с порядъчно голям кондензатор и външни пулъп-и докарани до някакво прилично време - реално накрая няма нужда от дебоунс, ама все пак го правя.
|
| Чет Юли 12, 2018 3:45 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Да да се върнем на темата... Ако използваш подхода с постоянно циклещ брояч, трябва при натискане на бутона: 1. Да го нулираш // а ти нулираш след като си изгасил диода 2. Да светнеш диода. 3. Проверката му на стойността да я правиш извън проверката на бутона При положение че го нулираш когато изгасиш диода, след това той натрупва произволна стойност. Може да натрупа 24 и когато натиснеш бутона, светодиода ще светне и след 200mS брояча става 25 и диода гасне. Може стойността да е друга. Така, че това води до произволно време. 4. Брояча цикли безкрайно. Това значи, че след като направи един оборот диода пак ще се изгаси. При теб той и без това не свети и това не е проблем, но ако имаш друга задача, примерно изпиукване. Ще изпиуква всеки път. Затова е желателно брояча ти след като премине 25 е желателно да не го инкрементираш. Със това го спираш. Друг вариант е да имаш флаг (семафор) че си изпиукал и когато брояча стане пак 25 да не пиукаш, ако не е смъкнат флага с натискането на бутона.
|
| Чет Юли 12, 2018 3:53 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Смесваш подходи и донякъде може би се водиш от проблеми свързани с неправилни подходи. На първо място, когато имаш възможност оставяй бутона на прекъсванв, това не значи, че трябва да обработваш прекъсването, може само да му полираш флага. На второ място избягвай код който се изпълнява твърде дълго дори и извън прекъсване, техники има много. Примерно ако предаеаш масив по серийния няма нужда да цуклиш докато предадеш целия масив, предай един байт и излез, използвай прекъсване или полирай флага на прекъсването или рейди бита и когато е предаден тогава предай другия, а не да въртиш 100ms за 10 байта. Това може да се пренесе към всичко, то си отива към таск мениджър, диспечър на задачи както е по нашенски, но няма нужда да е много сложен за да е работещ. Естествено зя бутон и светодиод всичко е доста просто.
|
| Чет Юли 12, 2018 5:23 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Тони ако е за мен това което казваш: Аз така го направих, с прекъсване, защото има някои процесори, които имат флаг за смяна състоянието на порта, но флага не показва какво е състоянието. Т.е. бутона прави две прекъсвания и два флага за промяна на порта. Обаче на нас ни трябва само ниското състояние. Разбира се може да се направи само с полиране (проверка) на флага и да се брои четно нечетно, нечетното винаги е ниско състояние, но вероятност за оплескване на нещата има голяма. Иначе на един ПИК помня че имаше прекъсване за минаване от ниско във високо и отделно за минаване от високо в ниско състояние. И все пак то бутончето се цъква бързо, та ако не е важно дали трябва да тръгне по преден или заден фронт, наистина може само със проверкна на флага...
|
| Чет Юли 12, 2018 6:13 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Дали е в прекъсване или извън обработката няма значение. Освен ако не те притеснява че ще изтървеш да прочетеш фронта. Ако това те притеснява, което за бутон е малко вероятно, тогава го правиш през прекъсване, но едно натискане рядко е под 50 мс, обикновенно дебоунса е 100-на ако можеш да се отвеяш някъде за 50 и да го проспиш значи някъде кода му трябва оптимизиране. Но да влезеш в прекъсване няма лошо, въпроса е дс изпълниш минимално нужното и да излезеш, примерно да провериш състоянуе на входовете, да детерминираш кой е променения и да вдигнеш флаг. Дори и да има нещо друго просто, по-добре го изнеси от там.
|
| Чет Юли 12, 2018 6:26 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Добре де, натискам бутона генерира ми IF за смяна на порта. Полирам го и пускам 5те секунди. Бутона го държа. Минават 5сек. Гасне диода. Изчаквам още 4 и на 9тата сек. го оптускам. Пак ми генерира IF. Пак се полира тоя флаг и пак се пуска светодиода и таймера, а не трябва.
|
| Чет Юли 12, 2018 6:34 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Малко не рабрах, проблема е че получаваш заден фронт който те лъже, така ли? Това става елементарно, първо ако процесора генерира един. If за група портове както е примерно в F877 си правиш 4 променливи олд стейт и по тях сравняваш твкущите с олд, определяш кои са променените портове и присвоявал на олд текущите. След това проверяваш дали прехода ти в от 0 към 1 или от 1 към 0 и действаш само в всиният случай. Ако искаш да правиш дебоунс зависи как си го структурирал кода като цяло, ако имаш някакъв таймер който примерно да прекъсва на всеки 10 мс при всяко прекъсване инкрементираш една променлива бутон тайм оут да речем, и ако успее да стигне 10 тогава само вдигаш флаг за активен бутон, като при това я нулираш при всеки IF от тоя бутон. Ако искаш да избегнеш репийта на бутона просто правиш същото и за обратното състояние, и ако бутона не е бил отпуснат не го приемаш за натиснат.... Много писане за буквално 5 реда код... Има и много други начини за дебоунс.
|
| Чет Юли 12, 2018 6:56 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Ами да но ако цъкна бутончето много бъзо, когато проверя флага порта няма да има промяна, но ще има IF
|
| Чет Юли 12, 2018 7:27 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Колко бързо? Ако е по бързо от дебонсинг тайма значи дебонсинга ти е много, или вече нямаш бутонче я нещо друго, не може да цъкнеш бутончето по-бързо от слоростта с която можеш да полираш.
|
| Чет Юли 12, 2018 8:20 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Със цел икономия на батерията съм пуснал PIC-a не на 32MHz а на 31kHz. Това са по малко от 80 инструкции за 10ms  Ако има и нещо друго в основния цикъл, възможността за пропуск става реална. Иначе съм съгласен, че се вживявам, и че това е краен случай. Но мисля подхода за най-универсален.
|
| Чет Юли 12, 2018 8:28 pm |
|
 |
|
ToHu
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 9:21 pm Мнения: 30684 Местоположение: София
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Е това е лесно, при прекъсване първо си вдигаш честотата и действаш. Но дори и на 32 кхц оринципа е същия, без значение дали е полиране или прекъсване, дори в този случай полиране може да е по-бързо заради овърхеда на прекъсването, пак каьвам въпрос на правилно структуриран код и периферия. Спокойно може и таймера и бутона да са на полиране, т.e. прекъсването им. На 32 кхц не знам колко ти е една инсърукция, но ако е пик ще е 125 мкс, ако е стандартна 51-ца ще е около 400 us, никакъв шанс да изтървеш бутон, защото това което трябва да правиш ще е 5-6 макс 10инструкции в цикъл, т.е. В най-лошия случай 4ms, 10 ги сложи няма такъв бутон, това всякак погледнато е смущение а не клик.
|
| Чет Юли 12, 2018 8:40 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Ако има нещо в основния цикъл, с повече инструкции, то може да отнема 20-30 и повече ms. Отделно пък ако имаме няколко бутона. Така, че може да се наложи бутона да се задържа доста повече от 10ms за да сработи. Това може да не е удобно. От друга страна не искам да работя по заден фронт, защото и това не е толкова удобно. Транзицията не можеш да я определиш извън нейният момент. Та затова проверявам в прекъсване каква е. IF не ми дава информация каква е. Има на новите PICове ифове за двата вида. Иначе аз на практика просто проверявам в основния цикъл дали бутона е в ниско състояние. Ако е - следва изчакване за вдигането му: Което е може би най-дървеният начин, но все пак вършещ работа. Затова не казвам, че твоето не работи, просто всеки вариант си има + и -
|
| Чет Юли 12, 2018 9:01 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Това е най-лошия вариант който съм виждал С това блокиране там с while-a напраов се отрязваш за обработване на останалата функционалност която трбява да върти контролера. Ами ако бутона вземе, че запецне и остане натиснат? Първо мислех да пиша, че Тони се олива с хуленето на тоя while, ама след тоя пример, чак ще взема да се съглася с него.
|
| Чет Юли 12, 2018 9:17 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 2 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|