Strony

niedziela, 25 maja 2014

if( ! ( PIND ... operacje bitowe, logiczne - o co chodzi ?

Witam,

Pomimo moich usilnych prób wyjaśniania i w książce i w poradnikach ... maskowania bitów, wciąż niewyjaśnionym zjawiskiem dla wielu początkujących jawi się kwestia warunku, sprawdzania stanu klawisza. O co chodzi z tym if( !( PIND .... i tak dalej ? Wciąż rodzą się w głowach początkujących pytania, dlaczego trzeba w tym języku C stosować jakieś dziwne zapisy typu: & (1<

Odpowiedź jest prosta, początkującym często wydaje się, że nie trzeba DOKŁADNIE najpierw zapoznać się z podstawami dotyczącymi np operacji bitowych i czasem rzucają się na zbyt głęboką wodę. Dlatego mam nadzieję, że TYM poradnikiem wraz ze wsparciem poradnika o MASKOWANIU BITÓW, raz na zawsze rozwiążemy te kwestie ;) .... 

zapraszam...



krótki, hmmm mega krótki poradnik ;)


;)

28 komentarzy:

  1. Mirku, głupie! :)
    Nie, nie poradnik, sprawdzanie przycisku w C.

    Jakby nie mogło być: if ! (PIND.2) {} lub if ! (PIND.2 == 0) {} Jest sprawdzenie stanu na pinie 2 portu D? No jest.. :)

    Pozdrawiam!

    OdpowiedzUsuń
    Odpowiedzi
    1. Nie to nie jest głupie rozwiązanie w C, jest bardzo ale to bardzo fajne ... tylko

      ... tylko najpierw trzeba się oswoić z przesunięciami bitowymi do czego gorąco namawiam czytelników w książce, poświęcając na wyjaśnienia tego sporo uwagi ...

      Bo jak się załapie KILKA ważnych rzeczy w C ... to w końcu człowiek przestaje myśleć (hmmm uwalnia się wręcz) ... od myślenia bascomowego ;) ... czyli twojego if( PIND.2

      A widać, że jeszcze jak na razie mocno jedną nogą co najmniej siedzisz w Bascomie i stąd takie poglądy .... rozumiem to poniekąd, ale uwierz, że gdy już "zaskoczysz" w tym języku C ... to również tobie będzie to się wydawało lekko śmieszne ... Natomiast przesunięcia bitowe - hmmm o Boże jakie będą proste ;) -----> zobaczysz

      Usuń
    2. Skoro rozwiązanie wyżej "nie głupie" to po co się bawić w te przesunięcia???

      Usuń
    3. A widzisz jak szybko wyczuwam na odległość gdy ktoś siedzi jeszcze dwoma nogami w Bascomie ? ... że jeszcze nie zna i boi się panicznie przesunięć bitowych ? ;)

      Ale spokojnie - ja na siłę nikogo nie zamierzam przekonywać - to i tak nic nie daje ... Skro dla ciebie to właśnie przesunięcia są głupie, to jeszcze minie "troszkę" czasu jak się pomęczysz z Bascomem....

      A jak kiedyś chociaż RAZ zachce ci się poczytać i chociaż raz zrozumiesz że operacje przesunięć a szczególnie w takiej postaci

      (1<<PCx)

      to nie są żadne "czary mary" i skomplikowane obliczenia, że to pomaga i to bardzo - to wtedy sam się uśmiechniesz jak kiedyś zajrzysz do tych postów.

      Tymczasem pozostań przy swoim PIND.2 ok ?

      Usuń
    4. Przesunięcie bitowe, w lewo lub prawo, przesunięcie arytmetyczne, iloczyn bitowy, suma bitowa i negacja bitowa to operacje które sprawiają, że język C staje się pięknym językiem :) Ja też kiedyś pisałem w BASCOMie też pisałem mało optymalny program, ale po jakimś czasie kupiłem książkę P. Borkowskiego AVR & ARM7 i zacząłem pisać w C i powiem jedno. Programy wyglądają bardzo ładnie. Ja myślę, że pod względem kosmetycznym C jest najpiękniejszym językiem. Też na początku bałem się przesunięć bitowych, nie czaiłem czemu wpisuje się liczby typu 0x00 do rejestrów, ale potem wszystko zrozumiałem. Też nie wiedziałem co znaczy (1 << PIN_DIODE) aż zrozumiałem, że to jest to samo co _BV (PIN_DIODE) czyli definiujemy za pomocą #define stałą PIN_DIODE w której umieszczamy pin do którego podpięta jest dioda. Język C jest piękny i bardzo wydajny.

      Usuń
  2. Chyba pierwszy poradnik w FULL HD ? A może się mylę ? Oby tak dalej :) Pozdrawiam

    OdpowiedzUsuń
    Odpowiedzi
    1. Dokładnie tak, Full HD ;) ciekaw byłem kto pierwszy to zauważy ;)

      Usuń
  3. Mirku, a ja mam taką luźną propozycję.
    Może dodawaj adnotację do swoich filmów(książek też to może dotyczyć) np. od 1:59, kiedy wspominasz o swoim wcześniejszym poradniku. Ludzie nie musieliby wtedy szukać filmów na twoim kanale, czy adresu sklepu, gdzie nabyć książkę, tylko by sobie kliknęli w okienko ;). Szczególnie przydatne by to było dla początkujących.
    Pozdrawiam i czekam na kolejny poradnik o wstawkach w ASM/Magic ledach ;).

    OdpowiedzUsuń
    Odpowiedzi
    1. Tak zabiorę się również za te adnotacje o których mówisz ... tylko zwykle z czasem i organizacją tego wszystkiego mam problem ... ale wiem, i masz rację - to bardzo ważne .... postaram się

      Usuń
    2. oo właśnie bardzo by się przydało ,ja jeszcze powiem że już zaczynam się gubić w tych wszystkich filmikach bo właściwie nie do końca wiem kiedy powinienem obejrzeć konkretny odcinek "tej szansy na sukces" ;) jak akurat czegoś nie rozumiem

      Usuń
    3. hahaha "szansa na sukces" ... hmmm w sumie dobre porównanie :)

      spokojnie no będę starał się nad tym pracować

      Usuń
  4. Mirku, Twoje materiały poza ogromną wiedzą, którą przekazuję, posiadają coraz to lepszą jakość. Z odcinka, na odcinek ogląda się coraz przyjemniej :)

    Do czego zmierzam - jak już poprzednicy zauważyli, to Twój pierwszy film w FullHD. Mnie jednak brakuje jednego - dobrej jakości dźwięku. Prawdziwy wielkomembranowy mikrofon pojemnościowy + pop-filtr + interfejs + statyw + wygłuszenie (które można zrobić samemu; pop-filtr w sumie też) i masz dźwięk jakości studyjnej :) Wprawdzie jest to kolejna inwestycja, ale będzie krokiem do pełni profesjonalizmy.

    Życzę kolejnych udanych poradników! ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. No tak, na razie zainwestowałem w mikrofon firmy RODE, jakość się poprawiła jakiś czas temu i to o niebo od pierwszych moich poradników nagrywanych mikrofonikami z kamer usb albo ze słuchawek ....

      lecz teraz pewnie można byłoby to jeszcze polepszyć - tak jak piszesz ...

      tylko dla mnie to już troszkę czarna magia te np: pop-filtr, albo interfejs do tego ? .... nad wygłuszaniem popracuję bo za duże echo mam w nowym pomieszczeniu ....

      ale to musiałby mi jakiś dźwiękowiec dobrych wskazówek udzielić odnośnie mikrofonu i nagrywania .... bo to coraz droższy sprzęt a tak w ciemno nie chcę kupować czegoś ... bo można się przejechać ;) .... zresztą na razie to i tak się już przeinwestowałem prawie ... (tyle tylko że to moje kolejne hobby - a tu jak wiadomo - nieraz człowiek kosztów nie liczy ..... aż zaboli) ;)

      Usuń
    2. Czepiasz się mikrofonu, jeszcze dobrze nie rozpakował się w nowym lokalu a już poradnik na blogu.

      Z tym mikro to mnie wyprzedziłeś ;)

      Usuń
    3. Sam nie jestem profesjonalistą, ale z dźwiękiem (do strony praktycznej) miałem kilka lat doświadczenia. Wprawdzie to ćwierćprofesjonalnie, ale jakieś tam było.

      Mirku, Ten mikrofon RODE, który posiadasz jest pojemnościowy wielkomembranowy, Shotgun czy dynamiczny? RODE ma przyzwoite mikrofony. Im więcej powiesz, tym łatwiej będzie pomóc ;) W końcu wszyscy na tym skorzystamy :)

      Pop-filtr eliminuje zgłoski wybuchowe (te, podczas, których z ust wydostaje się dużo powietrza; np "b"). Efektem tych zgłosek są mocne skoki amplitudy i charakterystyczne "szarpnięcia" w nagraniu. Ja sobie zrobiłem za 10zł, ale można też kupić, wtedy jest to koszt co najmniej 5x większy.
      Interfejs, to po prostu zewnętrzna karta dźwiękowa wyższej klasy podpinana pod FireWire (głównie te droższe) lub USB (tańsze). Interfejs różni się tym, że posiada złącze XLR z zasilaniem Phantom (chociaż zdarza się i bez, dlatego trzeba czytać), dla mikrofonów pojemnościowych.
      Co do wygłuszania, to wszystko zależy od mikrofonu. Pojemnościowy wielkomembranowy (studyjny) można stosunkowo łatwo i tanio wygłuszyć. Kupujesz piankę wygłuszającą i siatkę metalową, którą wyginasz w półkole i naklejasz na nią piankę. Gotowe! Mikrofon na statywie wewnątrz tego półkola i już pozbywasz się znacznej części upierdliwego echa ;)

      Usuń
    4. O widzisz - teraz zaczynam rozumieć co mówisz ;) ... Mikrofon jaki posiadam to DOKŁADNIE taka wersja:

      http://muzyczny.pl/146050_Rode-VideoMic-Rycote-mikrofon-do-kamery-mono-uchwyt-elastyczny-.html?operacja=reklama11

      gdybyś mógł mi podać jakieś przykładowe linki gdzie np można kupić taki:

      1. Pop-filtr

      2. interfejs

      3. kartę

      itp ...

      Tyle, że ja KONIECZNIE muszę mieć mikrofon podłączony do jednej z kamer ... aby później móc dobrze synchronizować dźwięk pomiędzy innymi nagraniami ...

      gdy kiedyś próbowałem nagrywać dźwięk oddzielnie - to była masakra i zero synchronizacji :( ... no ale też może ja pewnie robiłem to po omacku i amatorsko . Wciąż się tego uczę - i chciałbym się dowiedzieć jak robią to profesjonaliści ;)

      a sam widzisz że w jednym poradniku mam ujęcia z wielu już kamer, i bez synchronizacji dźwiękiem - byłaby kicha totalna.

      Usuń
  5. Czy zapis zerujący stan rejestru DDR (,chodzi o pin PB.0 procesora Atmega8 (14 noga))

    DDRB &= ~(1<<DDB0);

    jest równoważny temu z BB :

    DDRB &= ~(1<<PB0);

    ,pytam bo to dla mnie klucz do zrozumienia przesunięć bitowych.
    Natknąłem się na oba te zapisy ,kompilator oba traktuje jako dobre ,ale na moje oko różnią się ,wolę zapytać kogoś z większym doświadczeniem ,pozdrawiam.

    OdpowiedzUsuń
    Odpowiedzi
    1. A nie zastanowiło cię kiedyś skąd się bierze ? czy biorą takie oznaczenia jak DDB0, czy PB0 ? czy PORTB ?

      Jak się dowiedzieć czy poprawne jest DDB0 albo PB0 ? czy to jakaś czarna magia i trzeba sobie zaśmiecać głowę takimi rzeczami ?

      no to by trzeba było być podwójnym co najmniej może Einsteinem ;)

      Panie - klikasz i przytrzymujesz lewy klawisz CTRL, podjeżdżasz kursorem mychy w Eclipse nad napis DDB0 albo PB0 albo PORTB .... robi się pod napisem podkreślenie i widać że można kliknąć w tym czasie (trzymania wduszonego CTRL) .... lewy klawisz mychy

      zrób to .....

      i zobacz co się stanie

      zobacz gdzie przeniesie cię Eclipse czyli do jakiego pliku i zobacz sam skąd to się bierze - to warto zrozumieć a później nie będzie trzeba wkuwać takich rzeczy na pamięć ok ? ;)

      Usuń
  6. Nie chciałem pana zdenerwować. Przeniosło mnie w miejsce ,gdzie zdefiniowane są makra porty i piny uP , Wynikałoby z tego ,że poprawne jest DDRB &= ~(1<<DDB0); ,choć mogłem coś źle zrozumieć.

    OdpowiedzUsuń
    Odpowiedzi
    1. Ja to NAJBARDZIEJ się dziwię, skąd pomysł że mnie denerwowałeś rzekomo ? ;) ....

      ot po prostu chciałem ci wyjaśnić - skąd się biorą takie zapisy ... są to wstępnie predefiniowane nazwy za pomocą zwykłych dyrektyw preprocesora #define, w systemowych plikach nagłówkowych wartości - specyficzne dla każdego procka ...

      czy nie widzisz tam, że jest np:

      #define DDB0 0

      ale tak samo np

      #define PB0 0

      ???? czyli obydwie stałe zarówno ta o nazwie DDB0 jak i PB0 reprezentują jedną i tę samą liczbę czyli ZERO ale podobnie jest z DDB1 i PB1 itd itp

      skąd zatem pomysł że akurat DDB0 jest bardziej prawidłowe niż PB0 ? ;)

      no! można by się uprzeć i gdy ustawiamy kierunek to pisać

      DDRB |= (1<<DDB0);

      ale dla mnie to jest za dużo pisania skoro stała PB0 która również mówi o pinie numer zero, też ma tę samą wartość, więc ja najczęściej zapiszę to

      DDRB |= (1<<PB0);

      rozumiesz teraz ? ;)

      Usuń
  7. Ok chyba rozumiem ,zapytałem bo w notach katalogowych jest właśnie DDRB |= (1<<DDB0);
    ,a w książce nieco inaczej, tą drugą metodą. W sumie jak się zastanowić ,to chyba faktycznie wychodzi na to samo.


    Mój sposób myślenia opiera się na tym ,że biorę tabelkę rejestrów z PDF i według nazwy ,np. dla TCCR1B bity 2 i 1 to CS12 i CS11, wiec takich nazw używam przy ustawianiu. Dlatego logiczne było dla mnie DDRB |= (1<<DDB0); , oraz PORTB |=(1<<PB0) lub nawet trzymając się tabelki pdf PORTB |= (1<<PORTB0); ,także teraz widzisz że to nie moje wymysły tylko tak to zrozumiałem. Dzięki za wyjaśnienie, chyba teraz rozumiesz skąd się wzięło u mnie to lekkie zamieszanie. :)

    OdpowiedzUsuń
    Odpowiedzi
    1. Ale ja ciebie dobrze rozumiem ... chciałem ci jednak wyjaśnić od podstaw w czym rzecz, i że to kompletnie nie ma znaczenia czy użyjesz PB0 czy DDB0 czy PORTB0 poza jakimś tam wzrokowym efektem ....

      Więcej, pomyśl sobie

      piszę większy blok kodu, np:

      DDRB |= (1<<PB0)|(1<<PB2)|(1<<PB6)|(1<<PB7);

      i teraz potrzebuję szybko ustawić JEDYNKI na tych pinach, to robię nawet teraz w tej chwili COPY & PASTE i wklejam niżej całość - zmieniając TYLKO na początku DDRB na PORTB ;)

      PORTB |= (1<<PB0)|(1<<PB2)|(1<<PB6)|(1<<PB7);

      a ty byś musiał dłubać jeszcze każdym z nawiasów ;) zgadza się ....

      No a jeszcze bardziej widoczny przykład gdzie nie ma już kompletnie sensu rozróżniać zapisów DDB0, PB0, PORTB0 tylko używać jednego wybranego ? .. gdy dodatkowo tworzysz sobie na szybko makra do konfiguracji, np

      #define LED1 (1<<PB3)

      a później w kodzie będę np ustawiał kierunek i gasił diodę np:

      DDRB |= LED1;
      PORTB &= ~LED1;

      to chyba nie powiesz, że tworzyłbyś z tego powodu zaraz aż dwa dodatkowe zapisy ;)

      #define LED1DIR (1<<DDB3)
      #define LED1PORT (1<<PORTB3)

      żeby później w kodzie pisać:

      DDRB |= LED1DIR;
      PORTB &= ~LED1PORT;

      tzn można - ..... ale to już gdy ktoś jest masochistą ;) ;)

      Usuń
  8. BASCOMowcy pewnie będą zadowoleni:
    if ( bit_is_clear(PIND, PD2) ) {
    // coś...
    }

    OdpowiedzUsuń
    Odpowiedzi
    1. To właśnie dzięki takim zapisom i ciągłej ucieczce od zrozumienia przesunięć bitowych w C ... ci właśnie Bascomowcy mają taki problem z przejściem na C ... i co chwilę się frustrują. Przecież to jest tylko ucieczka a nie próba zrozumienia ... W C normalne jest zapisanie tego

      if( !( PIND & (1<<PD2) ) ) ....

      i w czym problem ?

      .... a jak już taki Bascomowiec zrozumie że to proste i zaskoczy że tu nawet nie trzeba w głowie żadnych obliczeń robić - to potem sam się uśmiecha w kąciku ust i myśli sobie .... eeeeeh jaki ja wcześniej byłem ...... ;)

      Usuń
  9. Bascomowcy za to łatwiej przesiądą się na xmega :)
    Tam zapis "z kropką" to norma.

    OdpowiedzUsuń
    Odpowiedzi
    1. Taaak ;) już widzę atak bascomowców na Xmega ;) .... masakra - ten kto boi się przesunięć bitowych i tak polegnie i zginie marnie na polu programowania w języku C, nieważne czy to będzie Xmega, PIC, ARM czy dowolny inny procesor. Więc to co mówisz już świadczy o tym, że nie rozumiesz przesunięć i to OK jeszcze jest normalne, bo nie każdy od razu musi rozumieć. Ale można się nauczyć ..... tylko ....

      ... tylko trzeba CHCIEĆ panie kolego .... trzeba chcieć się uczyć programować i poznawać nowe języki, bo akurat tą kropkę to można potłuc o kant (Y) jak to mówią ;) ... ważniejsze są przesunięcia jako podstawowe operacje bitowe, wykorzystywane na co dzień w programowaniu.

      Usuń
    2. To miała być ironia z tą kropką...
      Nie neguję przydatności przesunięć i (wydaje mi się) że jako tako je rozumiem.
      Jakby się uprzeć i porobić sobie struktury z polami o wielkości jednego bitu i zrobić parę #define, to zapis programu (przynajmniej takiego ledowo-switchowego 'hello world') zrobi się na pierwszy rzut oka bascomowy ;)
      A może to pomysł, żeby pokazać że przejście z B do C nie musi okropnie boleć?

      Usuń
    3. Wg mnie to niedobry sposób aby w ten sposób pokazywać przejście z Bascoma na C ... bo to właśnie jest zmorą bascomowców ... tzn ... to że najczęściej próbują oni pisać w C ale na ZASADACH Bascoma ... no i po kilku chwilach załamka ...

      nie nie nie ... trzeba spróbować - zostawić na chwilę Bascoma z tyłu - i rozpocząć na prawdę na nowo - wtedy to zadziała .... zapewniam ;)

      Usuń