Strony

piątek, 28 października 2016

MIODULO a wielozadaniowość dla początkujących !

Witam,

Mam nadzieję, że tym poradnikiem, w dwóch częściach, znowu uda mi się podkręcić C-adrenalinę. Po dłuższej przerwie w poradnikach dotyczących programowania mikroklocków, języka C wracam ... Przy okazji nastąpi materializacja poradnika, który tak na prawdę był ZAPALNIKIEM do zagadki ROBALA. Przy tej okazji przypominam wszystkim tę zagadkę i polecam przejrzeć kody źródłowe nadesłane do konkursu. REWELACYJNY materiał do nauki dla początkujących ale nie tylko. http://mirekk36.blogspot.com/2016/09/robal-pokonany-hmm-czyli-rozwiazany.html Dzisiaj poza tym, że pokażę Wam mój sposób na rozwiązanie tej zagadki, a tak się złożyło, że jest on jeszcze inny niż wszystkie nadesłane prace, to myślę, że przy okazji przyda się podpatrzeć jak można to zrobić sposobem Mirka ;) ... Również przy tej okazji zastanowimy się nad realizacją wielozadaniowości na 8 bitach ;) Postaram się was również zaprzyjaźniać z operatorem modulo (albo po mojemu "MIODULO") .... ok nie ględzę - zapraszam...




oto pierwsza część



oraz druga część





;)

25 komentarzy:

  1. Proponuję zanalizować if'a. Warunek jest spełniony dla Timer1>0 zatem za każdym razem if się wykona ustawiając jednocześnie Timer1 = 1000. Prawdopodobnie dioda sobie mruga bardzo szybko. Zanegowanie warunku w if sprawi, że Timer1 ustawi się na 1000 tylko wtedy gdy osiągnie wartość 0, czyli co 1000ms.

    OdpowiedzUsuń
    Odpowiedzi
    1. Spokojnie, w drugim odcinku wszystko się wyjaśnia ;)

      Usuń
  2. Super poradnik...ale można powiązać "miodulo" z przerwaniami sprzętowymi(ISR) i pokazać nam jakiś podobny poradnik? Hmm? Choć jeden? Pls?

    OdpowiedzUsuń
  3. W minucie 1:30 mówi pan żeby nie stosować tego rozwiązania o te delaye, więc jaki jest lepszy i bardziej prawidłowy sposób jeśli zależy nam bardzo na czasie ?

    OdpowiedzUsuń
    Odpowiedzi
    1. No tylko proszę mi nie mówić, że nie wspominam w poradniku, że prawidłowy sposób, gdzie podstawę czasu robi się na timerze sprzętowym - że opisałem to w Bluebooku ....

      http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

      proszę mi uwierzyć, że ciężko mi powtarzać po raz wtóry odpowiedzi na takie pytania - skoro daję na NIE PEŁNĄ odpowiedź w poradniku ... gdy mówię o książce .... eeeeeh

      Usuń
  4. Fajny poradnik
    Dużo można się nauczyć.
    Zawsze miałem problem z obliczeniem zapalenia diody co 1s.
    Problem polegał że zmieniałem stan diody co 1s a więc zapalała się co dwie.
    Dokładnie jak u pana Led8.

    OdpowiedzUsuń
  5. Hmmm... Tak sobie to oglądam i próbuje doczytać w BLUEBOOK`u i... nie bardzo rozumiem do czego to "miodulo" w tym przypadku. Jeżeli zrobiłbym samego if`a i sprawdził czy mstick ==100, później ==200 itd. a dla każdego wykonania if`a wykonał LED...TOG. Czy nie działało by tak samo? Licznik mstick leciałby sobie w tej samej wersji i zerował tak samo tyle że zwykły if i wykonanie jeśli się zrówna. Przykład z książki lepiej do mnie przemawiał. Tego albo nie rozumiem, albo nie mogę się jeszcze doszukać tego drugiego dna do magii ;). Proszę Mirku o wyjaśnienie, jeśli wszystko czytelnie opisałem, jak ja to widzę. Dziękuję i pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. Najprostsze wyjaśnienie, a weź zapomnij o zerowaniu licznika mstick w tej funkcji mDelay, niech będzie on typu uint32_t i się zwiększa od zera do ... ponad 4 miliardów ;) ... i co będzie działać nadal tak samo ? Bo w twoim wypadku już nie.

      Usuń
  6. Taaa... W tym przypadku by nie działało tak samo. Dlatego nasuwa się kolejne pytanie, do czego to zerowanie? skoro gdyby licznik mstick wynosił 600 to modulo byłoby znowu zero. Dalej 1,2, do kolejnej 100, 200 i przy 1200 znowu 0. Bezpiecznikiem byłoby tutaj to 600 w modulo. Dlaczego zerujemy ten licznik? Bez zerowania licznika w przypadku opisanym w filmie doleciałoby do 65535, wyzerowało licznik i przy modulo równym 135 jak sprawdziłem, popsułoby całego robala jak z tym opisanym uint32_t -tak więc w jednym i drugim przypadku musimy zerować. Dlaczego wyzerowałeś ten licznik, czy nie mogło lecieć dalej? W moich if`ach jak proponowałem wcześniej już by nie działało ale u Ciebie do czasu przepełnienia zmiennej uint16_t tak-później już nie. Skoro jesteśmy zmuszeni wyzerować ten licznik to na zwyklych if`ach też by robal uciekał z zestawu ATB z prędkością 100ms. Dobrze myślę? Jeżeli znajdziesz chwilkę to odpisz proszę bo nie będę mógł spać ;) Jestem baaardzo początkującym i nie chcę sobie gmatwać a jednocześnie chciałbym dopatrzyć się tego drugiego dna w "miodulo". Czy to jest tylko inne podejście do if`ów porównanych do licznika, czy może potrzeba jeszcze innego przykładu dla pokazania misiom "miodku" :) Jeszcze raz dziękuję i pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. Nie upieraj się tylko poszukaj w głowie przypadków w których ;) co tu dużo mówić nie zastąpisz modulo swoimi ifami ;)

      np SZYBKO zrealizuj mi aby coś się wykonywało tylko co drugi obieg pętli ! no ? ;)

      if( !(mstick%2) ) ... zrób coś

      i wcale nie trzeba nawet zerować msticka wtedy

      poza tym nawet w tym wypadku z przykładu którego użyliśmy ;) .... a co by było gdybym tobie powiedział,

      zrób żeby coś się wykonywało co 12 razy ?

      czyli działa sobie i robal ale jednocześnie coś tam się wykonuje co 12 razy

      Usuń
    2. ZEROWANIE robimy TYLKO w wypadku gdy akurat MA WIELKIE znaczenie żeby nie nastąpiło zakłócenie cyklu tych sekwencyjnych procesów na przełomie zerowania jakiegoś licznika. W wielu przypadkach będzie to KOMPLETNIE podkreślam KOMPLETNIE nie istotne rozumiesz ... i wtedy co ? zrobisz to na swoich IF'ach tak samo wygodnie i szybko ....

      Mówię ci - jeśli nie chcesz tracić czasu to szukaj w głowie pomysłów na TAK zamiast na NIE ;)

      Usuń
    3. Dziękuję Mirku za odpowiedź. I tak słabo spałem ;). Tak jak piszesz... przykład książkowy, co drugi, co trzeci czy co dwunasty obieg pętli jak najbardziej do mnie przemawiał. Tutaj pewnie z racji braku doświadczenia w projektowaniu od razu pchały mi się do głowy zwykłe if`y z licznikiem zerowanym jako najprostsze rozwiązanie. Nie chcę być źle zrozumiany, jak najbardziej szukam tych rozwiązań na TAK. Może z racji wykonywanego zawodu innego niż programista-informatyk, trochę ciężej mi to idzie, ale szukam, dociekam, bo jestem zarażony... ;) Co do procesów bez konieczności zerowania licznika i możliwość puszczenia tego ustrojstwa do przepełnienia bez zepsucia całego programu i drobnego przesunięcia, rozwiązanie jest bezdyskusyjne-wtedy if`y i licznik padają w przedbiegach. Zgodnie z zaleceniem, zaczynam drążyć inne tematy a tu pozostaję na TAK.

      Usuń
  7. Przepraszam bardzo, a czym różni się zapis:
    100 == mstick%600 od 100 == mstick ?
    Wydaje mi się, że zadziała to zawsze tak samo. 100%600 to przecież chyba 100? 200%600 to 200 !

    OdpowiedzUsuń
    Odpowiedzi
    1. Kurczaczki - PANIE KOLEGO - no proszę cię, błagam - tuż nad twoim pytaniem inny kolega ZADAŁ TO SAMO PYTANIE i na nie odpowiadałem i pokazywałem przykłady - czy nie warto przeczytać ?

      Więc sorki ale teraz od nowa nie będę już odpisywał tego samego. Powiem tylko że się różni i to BARDZO.

      Usuń
  8. Super Mirku ,podobało mi się wyjaśnienie. Samemu lubię uczyć się na diodkach i dlatego ta forma przemawia do mnie najlepiej ;)
    Powiedz, byłbyś w stanie w podobny sposób (no może dodając jeszcze wyświetlacz lcd) ,wyjaśnić koleje mistyczne zagadnienie ,odnośnie wskaźniki. Mam BB i GB ,czytam i zrozumiałem tak na 50% ,konkretnie to umiem użyć i odwoływać się do nich przy przekazywaniu argumentów w funkcjach.
    Dałbyś radę wymyślić jakieś proste ćwiczonko najlepiej na diodkach czy lcd ,pokazujące dogłębnie ich istotę? ,pozdrawiam ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. Przetrenuję tę metodę na WARSZTATACH z YELLOWBOOKIEM które odbędą się w 4 miastach w Polsce w przyszłym roku. To będzie GŁÓWNY motyw przewodni warsztatów ;)

      Usuń
  9. Wiesz Mirku bo to jest tak jak z biblią ,każdy może czytać ,ale jedynie
    duchowni i księża są w stanie objaśnić.
    Tak samo jest z Tobą napisałeś niebieski i zielony testament
    ,a w poradnikach video dokonujesz objawień ;)


    Powiedz jeszcze jeśli możesz ,są jakieś zapisy czy każdy może sie wbić na Warsztat? (jestem z okolicy Katowic)

    OdpowiedzUsuń
    Odpowiedzi
    1. zajrzyj na tą stronę

      https://polakpotrafi.pl/projekt/yellowbook-c-w-praktyce

      i zobacz, że w KAŻDEJ z miejscowości zebrała się odpowiednia grupa a więc na pewno odbędą się warsztaty. Tak będzie się można jeszcze dopisać ale ceny i inne szczegóły podam wkrótce na wszystkich swoich stronach, czyli forum, blog, Facebook itp

      Usuń
  10. OK ,dzięki. Zajrzałem ,jeśli dobrze rozumiem to narazie zapisujemy się udzielając wsparcia. Będę śledzić temat, pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. Już nikt tamtą drogą się nie zapisze ani nie wesprze bo projekt zakończył się dawno temu ;) Pokazałem tą stronę tylko dlatego, że na wierzchu są terminy i mowa w ogóle o warsztatach i skąd się wzięły ;)

      Usuń
  11. Mam pytanie, od kiedy operator MODULO ma JAKIKOLWIEK związek z wielozadaniowością? Wielozadaniowość to cecha, którą mają OS'y i RTOS'y. Jestem ciekawy odpowiedzi?

    OdpowiedzUsuń
    Odpowiedzi
    1. Z zastanawiałeś ty się kiedyś, chociaż raz ... chociaż tak troszeczkę, tak ociupinkę... dosłownie tyci tyci .... jak działają te twoje OS'y i RTOS'y albo inne ESY-FLORE'y ? ;) Bo wydaje mi się, że nie poświęciłeś na takie zastanowienia nawet jednej nanosekundy. A gdybyś poświęcił, gdybyś też chociaż raz w życiu próbował sam stworzyć wielozadaniowy program na tak małym procku jak 8-bitowiec - to wtedy byś zrozumiał co leży u podstaw twoich esów-floresów ;) ... Oczywiście nie koniecznie Modulo bo to tylko przykład w jaki sposób można podchodzić do takich rozwiązań "wielozadaniowości" we własnych programach na 8 bitowce... Rozumiesz? we własnych programach ;) Obiecuję, że jak się tym zainteresujesz to zrozumiesz.

      Usuń
    2. Argument, że jeżeli A zbudowane jest z B, to B jest automatycznie A - nie ma logicznego sensu. Tak. Operator modulo jest wykorzystywany do wielozadaniowości. Tak jak zmienne, stos czy cokolwiek innego. Ale Modulo samo w sobie wielozadaniowością nie jest, więc sugerowanie początkującym że tak jest jest jawną dezinformacja.

      Usuń
    3. Trzeba być nie powiem kim ;) ... żeby pisać takie bzdury że modulo jest samo w sobie wielozadaniowością ;) ... koledze się całkiem już ten .. teges - pokiełbasiło coś ;)

      Usuń