|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 10:10 am
Zilog - Z8 Encore! F083A Series - Timer & Button
| Автор |
Съобщение |
|
Metyyy
Ранг: Минаващ
Регистриран на: Съб Ное 22, 2014 7:23 pm Мнения: 48
|
 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 Благодаря!
|
| Вто Юли 10, 2018 2:07 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Абе кой е тоя "даскал", де то Ви учи да пишете код в прекъсване? Че и while(..)... ЗАПОМНИ: Сега ми обясни, какво очакваш да правят двата if-a в прекъсването, че май си посещавал лекции по Pascal, пък после си се появил за домашното по C....?
|
| Вто Юли 10, 2018 4:43 pm |
|
 |
|
Metyyy
Ранг: Минаващ
Регистриран на: Съб Ное 22, 2014 7:23 pm Мнения: 48
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Ами всъщност, никога не съм учил програмиране в училище/университета (то си личи), но от известно време в мен се породи идея, че искам да се занимавам точно с това. Започнах да учи С, после си взех и микроконтролера. Принципно следвам различни примери, описани в една книга, но това е без значение, защото идеята ми е сега да направя нещо елементарно без да го има в книгата и т.н. Очевидно, след като не се справям, питам за помощ : ) Еми мисля, че е описано това което правят или поне това което аз мисля, че правят : )
|
| Вто Юли 10, 2018 5:15 pm |
|
 |
|
Metyyy
Ранг: Минаващ
Регистриран на: Съб Ное 22, 2014 7:23 pm Мнения: 48
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Това е добавката с 10ms delay, само нз, какво да сложа в ISR-а, просто не разбирам за какво трябва да се проверява...
|
| Вто Юли 10, 2018 6:18 pm |
|
 |
|
Metyyy
Ранг: Минаващ
Регистриран на: Съб Ное 22, 2014 7:23 pm Мнения: 48
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Виждам, че си пишете някакви общи нещица (шегички), няма лошо, ама нали идеята е някой да ми обясни и помогне да се справя с задачката или бъркам ? След коментара на itso.t, пооправих кода, обаче никой нищо не каза, не съм сигурен дали въобще някой взима темата ми на сериозно или не ?
Благодаря!
|
| Вто Юли 10, 2018 9:33 pm |
|
 |
|
michev
Ранг: Форумен бог
Регистриран на: Сря Юли 11, 2007 10:16 am Мнения: 1730
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Ами не е ОК това решение. Дори съм сигурен, че ще забие в момента в който натиснеш бутона. По принцип - добре направи, че изкара кода от прекъсването, но все пак трябваше да си оставиш в него някой друга глобална променлива например, която да инкрементваш/декрементваш и да следиш нейните стойности в основния while цикъл.
|
| Вто Юли 10, 2018 10:05 pm |
|
 |
|
relsys
Ранг: Форумен бог
Регистриран на: Пет Ное 25, 2005 11:41 am Мнения: 1680
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Споко де, много сме сериозни даже! Гледам, и някой други колеги не са разбрали, че НЕ СЕ ПИШЕ код в прекъсването от такъв тип, ама с тях ще се разправям друг път ... Той тоя код, в тоя си вид няма как да работи както го искаш по ред причини... Та така: 1. В това прекъсване място има само: 2. Ей това: всъщност работи точно наобратно, справка тук: https://www.tutorialspoint.com/cprogramming/c_do_while_loop.htm3. В момента работи така: Като натиснеш бутона (ако имаш късмет да не е на 25-тото прекъсване), светодиода ще светне. Ще започне да свети обаче някъде между 1 и 25 прекъсване, и ще угасне на 25-тото, освен ако не продължаваш да държиш бутона натиснат. Тогава ще си зависне и ще си свети... Времето на светене е винаги различно, защото го светваш по различно време (както казах между прекъсване 1 и 25), а го гасиш винаги на 25. Демек, началното условие не е точно дефинирано. 4. Ей така може и да работи: 4. За домашно: а) - направи необходимите дефиниции и декларации за да работи модифицирания код; б) - изкарай логиката (двата if-a) извън прекъсването; в) - направи таймера да прекъсва на 1 мс; г) - използвай 32 битова глобална променлива за Delay_Counter_5s.
|
| Вто Юли 10, 2018 10:38 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
и такова while(1); без {} не пиши ! Не пиши и функции (били те и void) без скоби: () , ако не сложиш скоби на void функция, тя няма да се изпълни.
|
| Сря Юли 11, 2018 1:14 am |
|
 |
|
itso.t
Ранг: Форумен бог
Регистриран на: Чет Фев 03, 2005 2:21 am Мнения: 12765 Местоположение: София
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
От коментарите оставам с впечатление, че ако 10 човека напишат горния код за бутона, светодиода и таймера, ще има минимум 10 различни версии...  Редакция: Знам че подобно нещо е меко казано майтап за старите кучета програмисти, и едва ли им се занимава, ама защо не постнете някакъв код, да се види какви са "добрите практики"? Таймерче, бутон, дебоунс, светодиод. Съвсем общо - не за конкретен микроконтролер...
|
| Сря Юли 11, 2018 3:21 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11265 Местоположение: Добрич
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
тц... 10 човека това са поне 150 версии  нямаш проблем - key_drv.* драйверче за всякакви клавиатур (матрични, нематрични) и не е за конкретен контролер 
|
| Сря Юли 11, 2018 3:37 pm |
|
 |
|
itso.t
Ранг: Форумен бог
Регистриран на: Чет Фев 03, 2005 2:21 am Мнения: 12765 Местоположение: София
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Е, имах предвид нещо по-семпло и изчистено. Според мен, авторът на темата ще се "загуби" в хилядите условия за условно компилиране, и няма да вникне в същността.
|
| Сря Юли 11, 2018 3:47 pm |
|
 |
|
Metyyy
Ранг: Минаващ
Регистриран на: Съб Ное 22, 2014 7:23 pm Мнения: 48
|
 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: Благодаря за съветите и за кода, но честно да ти кажа твоя код още повече ме пообърка  Наистина е супер, с коментари и всичко, просто се обърках тотално. Благодаря на всички отново, извинявам се ако някой се е засегнал и разбира се, се извинявам за глупавите въпроси, които задавам и задавам... ( :
|
| Сря Юли 11, 2018 4:41 pm |
|
 |
|
itso.t
Ранг: Форумен бог
Регистриран на: Чет Фев 03, 2005 2:21 am Мнения: 12765 Местоположение: София
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Моят съвет е да разделиш цялата задача на малки такива.
Оправи кода така че на всеки да кажем 5 секунди да променяш изхода към който е свързан светодиода в 0, 1, 0 и.т.н. Следваща стъпка - направи четенето на бутона с дебоунс на сигнала. Когато имаш валиден сигнал, да пали светодиода. Например, направи процеса да е бавен, да кажем 0.5 или 1 секунда за валиден входен сигнал. Така ще можеш да тестваш визуално дали се светодиода светва при кратко натискане. Горното е по-удобно да се гледа на осцилоскоп, а и ще можеш да работиш с по-нормални времена, но не си споменал дали разполагаш с такъв. За финал - сглоби кода от 1 и 2 за да получиш това което искаш.
Нагоре беше споменато периода генериран от таймера да е на някакъв кратък интервал. Това дава куп възможности. От една страна. можеш да го използваш за дебоунс. Можеш елементарно да направиш всякакви закъснения (имаше такива в кода). Е, за 5 скунди ще трябва броячът да е 16 битов, но общо взето е все тая. Един байт повече RAM.
|
| Сря Юли 11, 2018 6:17 pm |
|
 |
|
slav4o.com
Ранг: Форумен бог
Регистриран на: Нед Яну 01, 2012 8:04 pm Мнения: 2663 Местоположение: София / Велико Търново
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Така както съм го направил бутона се чете в прекъсване и вдига флаг ако е в ниско ниво т.е. натиснат. Флага на бутона се обработва извън прекъсването. При това таймера се нулира и се стартира броенето. Дебоунс не мисля, че е необходим - ако има няколко задействания на бутона, ще важи времето от последното задействане. Все пак може да се сложи дебоунс : Бутонът може да го четеш в основния цикъл, без прекъсване:
|
| Сря Юли 11, 2018 8:34 pm |
|
 |
|
Metyyy
Ранг: Минаващ
Регистриран на: Съб Ное 22, 2014 7:23 pm Мнения: 48
|
 Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Към itso.t: Човече, аз уж това и направих, просто при сглобката нещо бъркам или вече нз и аз: 1. Искам 5s: Горният код е тестван и диода се превключва от 0 в 1 и т.н.през 5s : ) Следва кода на бутона и delay-а, заради трептенията на пластината: И така 2 кода работещи перфектно отделно и при сглобката - гредааа ?! Бутонът се чете, изчаква се 10ms, после пак четем бутона и ако нивото е ниско, превключваме диода, може би сега по-някакъв начин трябва с таймера да кажа на диода да изчака 5s и после да угася диода. Но, как ? Уж имам правилен код за 5s, но нещо се бъркам... Към slav4o.com: Благодаря ти наистина за усилията, кода и всичко, просто аз искам да си оправя моя код и почти съм сигурен, че нещо малко ми липсва, не разбирам или вече нз какво да кажа и аз... Извинявам се, ако досаждам вече ! ( :
|
| Сря Юли 11, 2018 10:29 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 4 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|