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

Регистриран на: Съб Ное 22, 2014 7:23 pm
Мнения: 48
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Еми какво да ви кажа, освен едно благодаря на всички ! Аз честно да си призная, кодът предоставен ми от itso.t и slav4o.com ми е по-лесен за разбиране, друг е въпроса, че кодът от relsys вече е от друго ниво (професионален) и явно така и трябва да бъде написан. Сега, друг е въпроса, че аз съм далеч от професионализма, а и както споменах с това се занимавам от скоро (2 месеца - говоря за изучаване на С езика и Zilog микроконтролера). Надявам се всичко да си дойде на мястото и лека по лека да градя и да научавам нови неща.

Благодаря ви отново и до скоро виждане в следващата ми тема :oops:


Нед Юли 15, 2018 11:19 am
Профил
Online
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

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

Както казах - стилът на писане е нещо което се променя и се развива като всяко друго. Затова и съм отворен за новости и градивна критика. Последното е доста деликатен момент. Критика от типа "това не с е прави така" не работи и не е ефективна. Това което е конструктивно, е нещо от типа - това не се прави така, защото (и следват аргументи и обяснения защо не се). А ако звучат логично и разумно, още по-добре.

Metyyy написа:
...Благодаря ви отново и до скоро виждане в следващата ми тема :oops:

Добре де, поне кажи след изписване на няколко кубични метра код, джаджата тръгна ли?


Нед Юли 15, 2018 1:01 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Metyyy написа:
Благодаря ви отново и до скоро виждане в следващата ми тема :oops:



Няма такива неща, имаш домашно.... :D :D :D


Нед Юли 15, 2018 2:19 pm
Профил ICQ WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 22, 2014 7:23 pm
Мнения: 48
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Разбира се, че работят и двете програми и твоята itso.t и на slav4o.com. Получавам стойности ,като 5.013, 5.1 и т.н. с леки изменения, но са си 5 секунди.

А на relsys, щях да му спестя мъките да ми обясни кода си, ама да видим:

Код:

void Get_System_Time(u32* output) // Това е функция, приемаща параметър указател output
{
   *output = Time_ms; // Тук стойността на output = Time_ms
}

И тази функция не трябва да се пипа, никъде другаде освен в прекъсването...



Код:

//Тази функция, защо ми е ?

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;



Не ми се иска да copy-paste твоя код и да питам за всяко едно нещо, но евентуално ако имаш желание и ти е удобно, да ми разпишеш подробно кое, какво прави. Ако не ти се занимава, няма грижи, ще се задоволя и с предишните два кода, които ги разбирам и са ми по-лесни :)

Благодаря и съжалявам, ако вече прекалявам ! ( : : )


Нед Юли 15, 2018 4:41 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Код:

void Get_System_Time(u32* output) // Това е функция, приемаща параметър указател output
{
   *output = Time_ms; // Тук стойността на output = Time_ms
}

И тази функция не трябва да се пипа, никъде другаде освен в прекъсването...



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

Код:
Get_system_time(&time)


и

Код:
time=Time_ms


даже напротив, бих променил името на Time_ms на system_time_ms и тогава ще стане още по чисто. Друг ефект от ограждането на този прост код в оделна функция би бил да се спрат някои оптимизации на компилаторите, само че съвременните компилатори отдавна са захитрели и сами ще изгенерират код със инлайнване на функцията където се употребява. Вместо това ако в дефиницията на променливата се добави volatile нещата сами ще си дойдат на място и компилаторът ще внимава да не оптимизира.

Код:

//Тази функция, защо ми е ?

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)); // Този ред ми е объркващ и по-специално частта с ^ и натам...
}



На пръв поглед излишна функция, този код ((start_time)^(0xFFFFFFFF))+1 всъщност прави -start_time по засукан начин. Преполагам идеята е била да се отработи ситуация при препълването на time_now т.е. когато то превърти през 2^32 бих препоръчал да се ползва u64 който ще гарантира, че няма да има препълване през живота на продукта. Ако 2^32 препълва, при така написана сметка не се взима в предвид колко пъти е превъртял а се предполага, че е веднъж. За да е по ясно бих го написал така (time_now)+(0xFFFFFFFF-(start_time))+1 + съответен коментар във функцията защо. Но дори и така резултатът ще е един и същ ако вместо целият този if ... else ... се напише просто return time_now-start_time. Подобен код е ясен когато човек го пише, но след време или пък когато трябва да го чете друг човек е труден за разбиране, затова трябва да се пише ясно и когато има нещо неявно да се слага коментар. Друго което прави впечатление е преизползването на скоби във вторият return - явно кода е писан от друг човек с други навици за оскобяване, само че прави лошо впечатление, че не е оправил и първият return на ((time_now)-(start_time)) - това е признак за лека арогантност и мърлящина което пък е признак за аматьорщина - истинският програмист не прави така ;)

Код:

//Тази функция, защо ми е ?

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;



Отново засукан начин да се напише нещо съвсем просто:

Код:
bool TimeUp(u32 start_time, u32 timeout)
{
  return (Time_ms-start_time)>=timeout;
}


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

_________________
Мразя да мразя ...


Пон Юли 16, 2018 8:52 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Сеп 26, 2004 9:21 pm
Мнения: 30684
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
е да ама u64 /или long long все тая/ яде още повече време на 8 битова въшка, в някои случаи започва да става критично, въпрос на баланс според мен, зависи от задачата. Да едното е съвсем универсално, стига да имаш ресурс. Но така или иначе от друга страна там където си е критично от към време обикновено има отделен таймер.
По скоро тук говорим за принципа. Едно време избягвах да използвам системен таймер, и в прекъсването на таймера съм инкрементвал по 6-7 отделни променливи, да но това става трудно за поддръжка, коя каква беше, да ги помня всичките ... една единствена е по-удобно, което не ми пречи да продължавам тук таме да използвам отделни :)
Като цяло идеята е да няма големи парчета код, по скоро те може да са големи, да не отнемат много време като изпълнение, в които да имаш забранени прекъсвания или да забиеш в тях и да не излезеш сума и време.
Имам сега точно един такъв проект който много ме дразни, едно тъпо време не беше специфицирано точно в документацията и уж да подкарам нещата го направих всичко в един цикъл докато не пратя всичките данни, да ама то отива 10 ms, и направо ми боде очите, въпреки че това е най-основната задача на изделието и най-важната, просто не ме кефи да имам процес който да заема 10 ms че и да ми забранява прексванията, верно то е съобразено със цялата периферия и няма нищо критично което може да се случи, USB-то си пее само, за серийния това е време на един байт, но така или иначе ме дразни.


Пон Юли 16, 2018 11:49 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Събиране и изваждане са приемливо бързи операции дори и на 8 битов контролер - адд, адц, адц, адц, адц, адц, ... единствено бих се замислил ако има някакви покъртителни ограничения откъм памет и се цеди всеки байт. Няма проблем да се ползва и някакъв софтуерен прескалер, дори е силно препоръчително - по този начин се получава нещо като работа с фиксирана запетая която позволява супер елегантно да се отработват ситуации с промяна на брояча на таймера без да се разбутва останалият код. Ще нахвърлям малко псевдкокод за да стане по ясно:

Код:

#define CLOCK_SPEED (4000000)
#define CLOCK_PER_MS (CLOCK_SPEED / 1000)

#define FAST_TIMER (1000)
#define SLOW_TIMER (10000)

u32 last_timer_value;
u32 next_timer_value;

u32 timer_clocks;
u32 sys_time_ms;

timer_interrupt() {
    timer_clocks += last_timer_value;

    while(timer_clocks>=CLOCK_PER_MS) {
        sys_time_ms++;
        timer_clocks -= CLOCK_PER_MS;
    }

    set_timer(next_timer_value);
    last_timer_value = next_timer_value;
}



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

_________________
Мразя да мразя ...


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

Регистриран на: Пет Ное 25, 2005 11:41 am
Мнения: 1680
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
palavrov написа:
....
Отново засукан начин да се напише нещо съвсем просто:
.....


Всъщност.... тя функцията изглеждаше така:

Код:
void sys_Get_System_Time(TSysTimeBase sys_time_base, u32* output)
{
  u32 result;
 
  switch (sys_time_base)
    {
      default:
      case _SYS_TIMEBASE_MS:
        {
          result = System.Time_ms;
          break;
        }
      case _SYS_TIMEBASE_US:
        {
          result = TIM5_CNT;
          break;
        }
      case _SYS_TIMEBASE_DAYS:
        {
          result = System.Time_Days;
          break;
        }
      case _SYS_TIMEBASE_MINS:
        {
          result = System.Time_Minutes;
          break;
        }
      case _SYS_TIMEBASE_UNIX:
        {
          result = System.Time_UNIX;
          break;
        }
    }
 
  *output = result;
}


Сметнах, че това е в повече за текущите нужди и опростявах директно в браузъра, което е и причина за артефактите :)
(Както и ще трябваше да обяснявам... ама що са толкова времената, там що четеш направо от таймера.... и тнт)

Иначе към това:

Код:
return (Time_ms-start_time)>=timeout;


съм против. По - добре е да е по-простичко написано...


while-a в прекъсването няма да го коментирам втори път. В крайна сметка, който разбрал, разбрал.....


Пон Юли 16, 2018 10:52 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог

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

#define ON 1
#define OFF 0
#define LED PAOUT & (1 << 1)
#define button PBIN & (1 << 0)
#define BUTTON_PRESSED !button
#define CHRONOMETER_FULL (Delay_Counter_5s == 25)


void interrupt Timer0_ISR(void) _At TIMER0
{

  if(LED == ON)
         Delay_Counter_5s++;

  if(CHRONOMETER_FULL)
            LED = OFF;             



}
int main(void)
{
   Delay_Counter_5s = 26;
   PortConfig();
   InterruptConfig();
   TimerConfig(); -------------> Тук стартираме таймера, а пък отдолу проверяваме ако не е стартиран ?!


   while(1)
   {
      if(BUTTON_PRESSED)
      {
         if(LED == OFF)
         {
           
           
            T0H = 0x00;
            T0L = 0x00;
      
            Delay_Counter_5s = 0;
     
            LED = ON;
         }   
      }
     
   }
}



_________________
https://github.com/slav4ocom/


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

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

Цитат:
Случвало ли Ви се е, да спре кола до Вас, а отвътре да плющи яка чалга? На теб ти се свива стомаха, засрамваш се. А оня, на отворена врата, продължава да си се кефи....


Вто Юли 17, 2018 12:16 am
Профил ICQ WWW
Online
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Фев 03, 2005 2:21 am
Мнения: 12765
Местоположение: София
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Ще си позволя да цитирам дедо Боре:

Как се яде слон?
Слон се яде на малки хапки.


Вто Юли 17, 2018 1:06 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 22, 2014 7:23 pm
Мнения: 48
Мнение Re: Zilog - Z8 Encore! F083A Series - Timer & Button
Славчо, кодът не работи, това е грешката - Expression must be an lvalue. Но това е без значение, тъй като вие вече ми показахте как се случват нещата и аз съм доволен, поне на този етап. Сега мисля, да продължа с изучаването на седем сегментен индикатор.

Мисля, че темата може да бъде затворена :)

Благодаря на всички !


Вто Юли 24, 2018 6:32 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 72 мнения ]  Отиди на страница Предишна  1, 2, 3, 4, 5

Кой е на линия

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


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

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