Отговори на тема  [ 72 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5  Следваща
Zilog - Z8 Encore! F083A Series - Timer & Button 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Time_ms - не ти е обвързано със запалването на светодиода. След ресет на 5сек светодиодът ще угасне, даже и да не е запален :)
Ако на 6 секунда натиснеш бутон той ще светне и няма кой да го угаси.
Нулирането на тая променлива трябва да ти е обвързано със запалването на светодиода.
Натискането на бутона....се детектва с някакъв брояч , например ако 3 пъти поред портът дава натискане - това се приема за натиснат бутон, тогава палиш и нулираш time_ms. Ако броячът расте - поддържаш го на стойност да речем равна на 4.
Светкането и нулирането стават при стойност 3. За отпускането на бутона има 2 тактики - тоя брояч да го нулираш всеки път, когато Readbutton покаже ненатиснат бутон. Другата тактика е да имаш брояч за отпускане - когато 3 пъти поред ти върне ненатиснат бутон - да приемеш че наистина е отпуснат.

Още - 1000херца е излишно за текущата задача,спокойно меже да работи и на 100херца.
time_ms е с излишна разрядност .


Съб Юли 14, 2018 10:56 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Ако трябва да говорим за ефективен код, за конкретната задача на 100 hz ще се събере в char/int ако е да е по-универсално 1 ms и long, някакъв компромис би било 1 ms и short.
Само дето наличието на един long или long long, ти позволява да нямаш никакви други, и всичко да го смяташ с относителни тайм щамп. Да яде повечко ресурс, но е по-универсално.


Съб Юли 14, 2018 11:59 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Metyyy написа:
А от тук нататък ?

Код:
#define LED_ON_TIME      5000

int main(void)
{
   PortConfig();
   InterruptConfig();
   TimerConfig();

   while(1)
   {
      if(BUTTON_PRESSED == ReadButton()) /* Бутонът натиснат ли е ? */
         {/* Да */
            PAOUT |= 1 << 1; /* Включи светодиода */
            Time_ms = LED_ON_TIME;
         }   
      }
     
      if(!Time_ms)
      {
         PAOUT &= ~(1 << 1); /* Изключи светодиода */
      }
   }
}

void interrupt Timer0_ISR(void) _At TIMER0
{
   Time_ms--; /* Намалявай брояча */
}


Леко съм пипна алгоритъма. В прекъсването броячът за включен светодиод намялява. Общо взето е все тая, но при тоя вариант, кодът визуално изглежда по-семпъл. Проверката е
Код:
if(!Time_ms)

а не
Код:
if(5000 == Time_ms)


Някъде в хилядите редакции си загубил дебоунса на бутона. В конкретния случай не е важно, но ако решиш да направиш запалването на светодиода тригерно - едно натискане го пали, следващото го гаси и т.н. ще ти трябва. Отделно че е полезно и предпазва системата от фалшиви сработвания.


Съб Юли 14, 2018 12:50 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
да добавя и аз това
Код:

void interrupt (void)
{
 
   if(Time_ms) // ако времето не е изтекло:
      Time_ms--; // го изтичаме
}

Иначе брояча ще превърти и "пак ще изгаси светодиода", което не е проблем разбира се, но ако имаш бипване след 5 сек. ще се повтаря.

_________________
https://github.com/slav4ocom/


Съб Юли 14, 2018 1:18 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Това го бях оставил за по-натам - проверка за минимални и максимални стойности. :D


Съб Юли 14, 2018 1:31 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Да. :) Иначе ти пишеш като мен , аз много обичам #define щото сега както го е написъл той това PAOUT &= ~(1 << 1); не е никак прегледна програмата ама нека за по-нататък...

_________________
https://github.com/slav4ocom/


Съб Юли 14, 2018 1:42 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
За обичане, не го обичам, но прави кодът по-четим. Под четим, имам предвид да си погледнеш кода след няколко месеца, когато детайлите вече са са изпарили от главата, и с умерени усилия да можеш да разбереш какво си правил.
Отделно, a = 1, b = 22 не е много информативно. За момента, при тоя елементарен код става, но като набъбне или след време, ще има едно почесване и скролиране в сорса.
В някои отношения е по-лесно и за корекции. Вместо да променяш някоя константа на "Х" места, я променяш в дефиницията. И т.н. Да не пълним темата с банални и известни неща, че профитата ще се отегчат. :)


Съб Юли 14, 2018 2:38 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Metyyy написа:
А от тук нататък ?


Хубаво е, че Славчо и Ицо показаха поредната лоша практика.
Добре е да запомниш, че тая променлива Time_ms, никой и никъде освен в прекъсването не трябва да я пипа.
Именно от тая проста променлива зависи работоспособността на цялата система, а в някои случаи може да зависи и жовота ти - ако примерно правиш управление за гилотина :D :D :D .

Та, скатаваш нейде на дълбоко т'ва чудо Time_ms (да речем в отделен файл и static) и за достъп до него използваш проста READONLY публична функция, примерно:

Код:
void Get_System_Time(u32* output)
{
   *output = Time_ms;
}


... без никога да те интересува, каква точна е стойността, дали е била инициализирана с 0, 15, 20 или 5000.....

След което си разписваш една функция, която връща беззнаково разликата между две числа:

Код:
u32 TimeDiff(u32 time_now, u32 start_time)
{
  if (time_now >= start_time)
    return (time_now - start_time);
  else
    return (((time_now)+((start_time)^(0xFFFFFFFF))+1));
}


... и една, която малко да ти улеснява да ти улеснява живот и прегледността на кода:

Код:
bool TimeUp(u32 start_time, u32 timeout)
{
  u32 time_now;
  bool result = false;
 
  sys_Get_System_Time(sys_time_base, &time_now);
  if (TimeDiff(time_now, start_time) >= timeout)
    result = true;

  return result;
}


Сега вече с едно просто таймерче, имаш безброй такива, с които да управляваш различните подзадачки в целия словен пейзаж ... 8)

Ето и прост пример за филтриране на бутон:

Код:
#define _BNT_DEBOUNCE_TIME_MS 15

enum Button_States
{
  _BTN_IDLE,
  _DEBOUNCE_BUTTON,
  _BTN_WAIT_RELEASE,
  //other state
}

u8   btn_state = _BTN_IDLE;
bool btn_pressed = false;
u32  button_press_time;

switch (btn_state)
    {
      default:
      case _BTN_IDLE:
        {
          if(BUTTON_PRESSED == ReadButton())
          {
           Get_System_Time(&button_press_time);
          
           btn_state = _DEBOUNCE_BUTTON;
         }
          break;
        }
      case _DEBOUNCE_BUTTON:
        {
          if (TimeUP(button_press_time, _BNT_DEBOUNCE_TIME_MS)       
         { 
           if(BUTTON_PRESSED == ReadButton())
            {
              btn_pressed = true;
             
              btn_state = _BTN_WAIT_RELEASE;
            }
         }
          break;
        }
      case _BTN_WAIT_RELEASE:
        {
                 
        //тук е мястото за твой код
       
        btn_pressed = false;
          
        btn_state = _BTN_NOT_PRESSED;
          break;
        }
    }


Сега вече трябва да си готов за следващото домашно - имплементация на описаното и използване както за бутона, така и за светодиода.


Съб Юли 14, 2018 3:37 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Тук точността на времето се определя от периода 1ms. Колкото по-голяма точност се търси толкова по-малък период трябва. Това е свързано с повече проверки и повече процесроно време. Грубо 200 пъти по-малко се товари процесора ако периода е 200ms. Ако с един таймер се управляват много процеси е оправдано, но ако имам само една мигалка, може да назнача специално за нея отделен таймер и да освободя ресурс на процесора. Зависи от задачата.
Ако се търси абсолютна точност, светодиода трябва да се светва в прекъсването и там да се нулира таймера. Също и да се гаси диода там. В твоите работи които ти си правил е подходящо да е по твоя начин, но това не важи съвсем за навсякъде.

_________________
https://github.com/slav4ocom/


Съб Юли 14, 2018 5:45 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Time и & Button
Да но обратното не е задължително, т.е.ако не ти трябва точност няма да проверяваш начесто, остава само прекъсването като овърхед.
Наличието на системен таймер какъвтонсе явява този брояч е много полезно в много случаи. Да за 8 битовите системи работата с лонг и ресурсоемка, но в много случаи имаш нужните ресурси.


Съб Юли 14, 2018 8:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Яну 01, 2012 8:04 pm
Мнения: 2663
Местоположение: София / Велико Търново
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Ами да речем, че ми трябва за някакво дистанционно управление, точност 100 или 10us. Няма да слагам STM32Fнещо си да прави 100 000 проверки/сек, ами ще сложа някой PIC и ще му пожертвам таймера. Те някои с 8 крака имат и по 6 таймера. Ако чудото прави и други неща има още 5 таймера. Процесора може да се пусне на ниска честота, щото няма работа и да не арчи много ток.

_________________
https://github.com/slav4ocom/


Съб Юли 14, 2018 9:05 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Да, така е, за някои специфични задачи ти трябва и отделен таймер или периферия, но това не обезмисля системния таймер. Тук не се опитваме да намерим случаи в които този подход е неработещ, а обратното, имаме случай в който е приложим, с едапроменлива в таймера си решаваш и дебоунса, и времето на светодиоди и още куп времена които обикновено се появяват, вкл.и таймоути на така популярния while...


Съб Юли 14, 2018 10:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Славчо, те таймерите не са жертви, те са за да се ползват. Аз далеч не ползвам само един таймер и само едно прекъсване, също така пиша и по 10-20 реда в прекъсвания. Но ако не можеш да вкараш нещата, които Тони посочи в един, и не по първоначално описания начин, значи има много жертви и най-вероятно жертва ще е цялото устройство.
Естествено, когатов дивайса имаш ... фазово управление, енкодер или пък термален принтер, ще има още няколко таймера и прекъсвания в действие. Само трябва да се подхожда към нещата с уважение и мисъл.

Иначе стигаме до следните ситуации:

Преди десетина години, в една най-големите БГ фирми с ембедед ми дадоха върху устройство на колега да добавя външен модул на софтуерно I2C. Друг колега каза, че имал написан модул и ми го даде. Сложих го аз, устройството се обади. Реших да тествам поведението като го откача и целия дивайс заби. Гледам.... I2C-то изцяло блокинг, цикли в един while() и толкоз.... Викам, колега, що така? А той: ААА, то мен Whatchdog-а ме изкарва, не се бърка....

Или пък.... GPS тракер, който трябваше пак да поправям... Сигналът от заплаването се чете в прекъсване от таймер на 10мс. После стойността се проверява на няколко места в основния цикъл и се изпълнява каквото трябва. В крайна сметка се получава, че когато прекъсването дойде между 2 проверки, част от нещата се пресмятат със 0, другите с 1.... Всеки би трябвало да се сети какво настъпва след това....


Съб Юли 14, 2018 11:20 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
relsys написа:
Хубаво е, че Ицо показа поредната лоша практика...

Поне за мен, няма нищо учудващо в това. Занимавам се с тия неща повече като хоби, при това относително отскоро. Донякъде се занимавам и от принуда де, че ми писна да се моля на тоя и ония да ми драсне някоя мигалка. Печените са заети, и не им се занимава. С другите пък на ме не ми се занимава. :lol:

Известно време се въздържах да се включа в темата с конкретика, тъй като и аз имам да уча още много. Но тъй като и профитата не се включиха, сметнах че по-добре питащият да дръпне леко напред, макар и решението да не е перфектно, отколкото да тъпче на едно място.

А стилът на писане подлежи на корекция. Днес се пишат едни неща, утре се научава нещо ново, по-хитро или по-правилно като концепция, и съответно то влиза в употреба.


Нед Юли 15, 2018 12:17 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 07, 2012 11:22 pm
Мнения: 3084
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Хич да не ти пука.
Мен така ме скастриха веднъж...още ми държи. :D
Ама по-подреден май не можах да стана, опитвам се де.


Нед Юли 15, 2018 7:10 am
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 72 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5  Следваща

Кой е на линия

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


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

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