| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Zilog - Z8 Encore! F083A Series - Timer & Button http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=16018 |
Страница 1 от 5 |
| Автор: | Metyyy [ Вто Юли 10, 2018 2:07 pm ] | |||||||||
| Заглавие: | Zilog - Z8 Encore! F083A Series - Timer & Button | |||||||||
Здравейте ! Бих искал да помоля за помощ, относно следния казус: Имам бутон (с pull-up resistor) и диод, това което искам е като натисна бутона диодът да светне за 5s и да спре, след което отново същата процедура да се повтаря и т.н. Със кодът, който е по-долу и лог. анализатора, получавам най-различни стойности след натискане на бутона: Width - 2.006s, Frequency - 0.2374Hz, Period - 4.212 ; Width - 2.809, Frequency - 0.2932, Period - 3.411 ; Width - 4.414, Frequency - 0.1994, Period - 5.015. Бях пускал една тема за таймера на този микроконтролер и мисля, че нещата ги схванах, имам в предвид, че таймера е нагласен точно - 200ms * 25 прекъсвания = 5s. W (Width) = 5.015s, f (Frequency) = 99.69mHz, T (Period) = 10.03s. - Това са стойностите с лог. анализатора, при 5s, но както slav40.com ми изясни в предишната тема, зависи какъв е осцилатора. Според спецификацията, този е default-ния и оттам идва разликата за която питам Internal precision RC oscillator • 119 kHz or 20 MHz • ± 4% accuracy when trimmed • No external components required • Unlock and write Oscillator Control Register (OSCCTL) to enable and select oscillator at either 20 MHz or 119 kHz
Благодаря! |
||||||||||
| Автор: | relsys [ Вто Юли 10, 2018 4:43 pm ] | |||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button | |||||||||
Абе кой е тоя "даскал", де то Ви учи да пишете код в прекъсване? Че и while(..)... ЗАПОМНИ:
Сега ми обясни, какво очакваш да правят двата if-a в прекъсването, че май си посещавал лекции по Pascal, пък после си се появил за домашното по C....? |
||||||||||
| Автор: | Metyyy [ Вто Юли 10, 2018 5:15 pm ] | |||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button | |||||||||
Ами всъщност, никога не съм учил програмиране в училище/университета (то си личи), но от известно време в мен се породи идея, че искам да се занимавам точно с това. Започнах да учи С, после си взех и микроконтролера. Принципно следвам различни примери, описани в една книга, но това е без значение, защото идеята ми е сега да направя нещо елементарно без да го има в книгата и т.н. Очевидно, след като не се справям, питам за помощ : ) Еми мисля, че е описано това което правят или поне това което аз мисля, че правят : )
|
||||||||||
| Автор: | Metyyy [ Вто Юли 10, 2018 6:18 pm ] | |||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button | |||||||||
Това е добавката с 10ms delay, само нз, какво да сложа в ISR-а, просто не разбирам за какво трябва да се проверява...
|
||||||||||
| Автор: | Metyyy [ Вто Юли 10, 2018 9:33 pm ] |
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button |
Виждам, че си пишете някакви общи нещица (шегички), няма лошо, ама нали идеята е някой да ми обясни и помогне да се справя с задачката или бъркам ? След коментара на itso.t, пооправих кода, обаче никой нищо не каза, не съм сигурен дали въобще някой взима темата ми на сериозно или не ? Благодаря! |
|
| Автор: | michev [ Вто Юли 10, 2018 10:05 pm ] |
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button |
Ами не е ОК това решение. Дори съм сигурен, че ще забие в момента в който натиснеш бутона. По принцип - добре направи, че изкара кода от прекъсването, но все пак трябваше да си оставиш в него някой друга глобална променлива например, която да инкрементваш/декрементваш и да следиш нейните стойности в основния while цикъл. |
|
| Автор: | relsys [ Вто Юли 10, 2018 10:38 pm ] | |||||||||||||||||||||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button | |||||||||||||||||||||||||||
Споко де, много сме сериозни даже! Гледам, и някой други колеги не са разбрали, че НЕ СЕ ПИШЕ код в прекъсването от такъв тип, ама с тях ще се разправям друг път ... Той тоя код, в тоя си вид няма как да работи както го искаш по ред причини... Та така: 1. В това прекъсване място има само:
2. Ей това:
всъщност работи точно наобратно, справка тук: https://www.tutorialspoint.com/cprogramming/c_do_while_loop.htm 3. В момента работи така: Като натиснеш бутона (ако имаш късмет да не е на 25-тото прекъсване), светодиода ще светне. Ще започне да свети обаче някъде между 1 и 25 прекъсване, и ще угасне на 25-тото, освен ако не продължаваш да държиш бутона натиснат. Тогава ще си зависне и ще си свети... Времето на светене е винаги различно, защото го светваш по различно време (както казах между прекъсване 1 и 25), а го гасиш винаги на 25. Демек, началното условие не е точно дефинирано. 4. Ей така може и да работи:
4. За домашно: а) - направи необходимите дефиниции и декларации за да работи модифицирания код; б) - изкарай логиката (двата if-a) извън прекъсването; в) - направи таймера да прекъсва на 1 мс; г) - използвай 32 битова глобална променлива за Delay_Counter_5s. |
||||||||||||||||||||||||||||
| Автор: | slav4o.com [ Сря Юли 11, 2018 1:14 am ] | |||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button | |||||||||
и такова while(1); без {} не пиши ! Не пиши и функции (били те и void) без скоби: () , ако не сложиш скоби на void функция, тя няма да се изпълни. |
||||||||||
| Автор: | itso.t [ Сря Юли 11, 2018 3:21 pm ] |
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button |
От коментарите оставам с впечатление, че ако 10 човека напишат горния код за бутона, светодиода и таймера, ще има минимум 10 различни версии... Редакция: Знам че подобно нещо е меко казано майтап за старите кучета програмисти, и едва ли им се занимава, ама защо не постнете някакъв код, да се види какви са "добрите практики"? Таймерче, бутон, дебоунс, светодиод. Съвсем общо - не за конкретен микроконтролер... |
|
| Автор: | miro_atc [ Сря Юли 11, 2018 3:37 pm ] | ||||||||||||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button | ||||||||||||||||||
тц... 10 човека това са поне 150 версии
нямаш проблем - key_drv.* драйверче за всякакви клавиатур (матрични, нематрични) и не е за конкретен контролер |
|||||||||||||||||||
| Автор: | itso.t [ Сря Юли 11, 2018 3:47 pm ] | |||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button | |||||||||
Е, имах предвид нещо по-семпло и изчистено. Според мен, авторът на темата ще се "загуби" в хилядите условия за условно компилиране, и няма да вникне в същността. |
||||||||||
| Автор: | Metyyy [ Сря Юли 11, 2018 4:41 pm ] | |||||||||||||||||||||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button | |||||||||||||||||||||||||||
Май единствено itso.t, slav4o.com и relsys се опитват да ми помогнат, другите си чешат езиците, само не мога да разбера, защо това трябва да се случва в моята тема. Разбирам, че всички сте много начетени, че както се изрази itso.t това са свръх елементарни неща за вас, ама хайде ако обичате да престанете да спамите, ако няма да ми помогнете. Благодаря предварително ! Към relsys: Благодаря за поправките, за while(25 == Delay_Counter_5s); /* Стой тук 5s */ си абсолютно прав, че работи на обратно. Относно кода, който си постнал, извинявам се, ама ми е малко объркващо. Написах си домашното и преправих програмата, обаче, нещата отново не се случват. И защо, трябва да променям таймера на 1ms, нали ми трябват 25 прекъсвания * 200ms ?
Към slav4o.com: Благодаря за съветите и за кода, но честно да ти кажа твоя код още повече ме пообърка Благодаря на всички отново, извинявам се ако някой се е засегнал и разбира се, се извинявам за глупавите въпроси, които задавам и задавам... ( :
|
||||||||||||||||||||||||||||
| Автор: | itso.t [ Сря Юли 11, 2018 6:17 pm ] |
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button |
Моят съвет е да разделиш цялата задача на малки такива. Оправи кода така че на всеки да кажем 5 секунди да променяш изхода към който е свързан светодиода в 0, 1, 0 и.т.н. Следваща стъпка - направи четенето на бутона с дебоунс на сигнала. Когато имаш валиден сигнал, да пали светодиода. Например, направи процеса да е бавен, да кажем 0.5 или 1 секунда за валиден входен сигнал. Така ще можеш да тестваш визуално дали се светодиода светва при кратко натискане. Горното е по-удобно да се гледа на осцилоскоп, а и ще можеш да работиш с по-нормални времена, но не си споменал дали разполагаш с такъв. За финал - сглоби кода от 1 и 2 за да получиш това което искаш. Нагоре беше споменато периода генериран от таймера да е на някакъв кратък интервал. Това дава куп възможности. От една страна. можеш да го използваш за дебоунс. Можеш елементарно да направиш всякакви закъснения (имаше такива в кода). Е, за 5 скунди ще трябва броячът да е 16 битов, но общо взето е все тая. Един байт повече RAM. |
|
| Автор: | slav4o.com [ Сря Юли 11, 2018 8:34 pm ] | ||||||||||||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button | ||||||||||||||||||
Така както съм го направил бутона се чете в прекъсване и вдига флаг ако е в ниско ниво т.е. натиснат. Флага на бутона се обработва извън прекъсването. При това таймера се нулира и се стартира броенето. Дебоунс не мисля, че е необходим - ако има няколко задействания на бутона, ще важи времето от последното задействане. Все пак може да се сложи дебоунс :
Бутонът може да го четеш в основния цикъл, без прекъсване:
|
|||||||||||||||||||
| Автор: | Metyyy [ Сря Юли 11, 2018 10:29 pm ] | ||||||||||||||||||
| Заглавие: | Re: Zilog - Z8 Encore! F083A Series - Timer & Button | ||||||||||||||||||
Към itso.t: Човече, аз уж това и направих, просто при сглобката нещо бъркам или вече нз и аз: 1. Искам 5s:
Горният код е тестван и диода се превключва от 0 в 1 и т.н.през 5s : ) Следва кода на бутона и delay-а, заради трептенията на пластината:
И така 2 кода работещи перфектно отделно и при сглобката - гредааа ?! Бутонът се чете, изчаква се 10ms, после пак четем бутона и ако нивото е ниско, превключваме диода, може би сега по-някакъв начин трябва с таймера да кажа на диода да изчака 5s и после да угася диода. Но, как ? Уж имам правилен код за 5s, но нещо се бъркам... Към slav4o.com: Благодаря ти наистина за усилията, кода и всичко, просто аз искам да си оправя моя код и почти съм сигурен, че нещо малко ми липсва, не разбирам или вече нз какво да кажа и аз... Извинявам се, ако досаждам вече ! ( : |
|||||||||||||||||||
| Страница 1 от 5 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|