Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

AVR+C - Kłopot ze zrozumieniem składni przy operacjach logicznych

Antystatyczny 15 Lip 2012 21:37 7479 90
  • #1 15 Lip 2012 21:37
    Antystatyczny
    Poziom 16  

    Witam.

    Od dzis uczę się C i generalnie wszytko wydaje mi sie być zrozumiałe, ale...

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie rozumiem, co oznacza &=~ oraz |=
    Może ktoś podpowie, jak mam to rozumieć?
    wiem, że & oznacza AND, a | chyba OR... Tej tyldy kompletnie nie rozumiem

    0 29
  • Arrow Multisolution Day
  • #2 15 Lip 2012 21:40
    dondu
    Moderator Mikrokontrolery Projektowanie
  • #3 15 Lip 2012 21:59
    Antystatyczny
    Poziom 16  

    Aha.. i obiecuję, że kupię książkę. Nie chcę wiecznie takimi drobiazgami męczyć doświadczonych forumowiczów.

    Dodano po 6 [minuty]:

    Chyba jednak tego nie pojmuję. Port AND = NOT (1<<klawisz)
    Po prostu nie znam metody czytania tego zapisu. Bardzo prosze jakoś łopatologicznie... Jest niedziela i teraz już nie kupie ksiązki.

    Dodano po 8 [minuty]:

    Hmm, czyli to jest to samo co PORTB = &B00001111?
    A co z tą tyldą, czyli NOT?

    Dodano po 3 [minuty]:

    Nie, to nie jest to samo... to jest chyba pominięcie 4 najstarszych bitów, dobrze rozumiem?

    0
  • #4 15 Lip 2012 22:05
    dondu
    Moderator Mikrokontrolery Projektowanie

    Antystatyczny napisał:
    Hmm, czyli to jest to samo co PORTB = &B00001111?

    Takie coś się nie skompiluje. Rozpisałem Ci przykład dokładnie ale na Hexaxh poniżej binarnie:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Inaczej mówiąc A &= B to skrócona wersja A = A & B.


    Antystatyczny napisał:
    A co z tą tyldą, czyli NOT?

    Podałem link gdzie są operatory w tym tylda: http://www.java2s.com/Tutorial/C/0100__Operator/Complement.htm

    Spróbuj przeglądnąć linki pierwszy link z poprzedniego mojego postu - tam są przykłady na liczbach binarnych.

    0
  • #5 15 Lip 2012 22:11
    Antystatyczny
    Poziom 16  

    Przeglądam i mało rozumiem :-(
    Tzn. rozumiem A=&B, to jest dla mnie jasne. Nie rozumiem zapisu &=~

    Dodano po 2 [minuty]:

    Rozumiem też a ~=B
    A = A NOT B
    Nie kumam tej podwójnej operacji

    Dodano po 1 [minuty]:

    0
  • #6 15 Lip 2012 22:13
    dondu
    Moderator Mikrokontrolery Projektowanie

    Może teraz łatwiej załapiesz:

    AVR+C - Kłopot ze zrozumieniem składni przy operacjach logicznych

    Czy teraz rozumiesz jak posługiwać się przykładami z tutoriala?

    Jeżeli nie, to najprościej pisać prosty przykładowy kod - skompilować i uruchomić symulator - wtedy szybko zajarzysz, patrząc na wyniki.

    0
  • Arrow Multisolution Day
  • #7 15 Lip 2012 22:20
    Antystatyczny
    Poziom 16  

    Bardzo dziękuje za podpowiedzi, ale chodzi mi konkretnie o zapis &=~

    Może mógłbyś ten zapis rozpisać na dwie linie, wtedy bym zrozumiał...
    Pewnie najpierw jest wykonywane ANd a potem NOT (wiem jak działa NOT). Chcę się dowiedzieć, jak czytac zapis &=~.

    Dodano po 2 [minuty]:

    Aha, jeszcze jedno. Winavr mam od kilku godzin i nie mam zielonego pojęcia, jak odpalić symulator.

    0
  • #9 15 Lip 2012 22:23
    Antystatyczny
    Poziom 16  

    No to jesteśmy kwita! :D

    0
  • #11 15 Lip 2012 22:31
    Antystatyczny
    Poziom 16  

    A tak na powaznie:
    PORTB = PORTB & (zanegowane 0F hex), tak?

    Dodano po 5 [minuty]:

    Wywaliłem niepotrzebne wpisy.

    0
  • #13 15 Lip 2012 23:00
    Antystatyczny
    Poziom 16  

    Ok, dzięki, to mi bardzo pomogło.
    Teraz jeszcze jedno pytanie:
    1<<klawisz powoduje ustawienie flagi klawisz w stanie logicznym 1? Znam z C++ np. cout << "hello world" i to raczej działało odwrotnie.

    Dodano po 12 [minuty]:

    A propos Bascom. Uważam, że to nie była najgorsza rzecz. Przetestowałem w praktyce działanie sprzętu! :D Wiem, że kupiłem sprawny LCD, wyświetlacze LED, pojedyncze diody itp. :-) Teraz się skupię na programowaniu w C wiedząc, że mam sprawny sprzęt. Każde niepowodzenie będzie mi dawało do zrozumienia, że to JA popełniłem bład, że nie będę się musiał zastanawiac nad stanem urządzeń peryferyjnych.

    0
  • #14 15 Lip 2012 23:26
    piotrva
    Moderator na urlopie...

    << i >> to przesuniecia bitowe. I tak po pierwsze np. PB0 to stała o wartości 0, PB6 to stała o wartości 6 itd.
    Przesuniecia bitowe działają tak:
    0b00001100<<2 da nam 0b00110000
    0b10000001<<1 da nam 0b00000010
    0b01000001>>1 da nam 0b00100000
    itd. Tworzy to zatem maski bitów które w połączeniu z negacjami i innymi operacjami bitowymi pozwalają na dostęp do poszczególnych bitów.
    A tak na serio kup sobie pierwszą ksiazke Mirka Kardasia - wtedy sam wszystko w mig zrozumiesz i będzie szybciej. A te 80zł to najlepiej zainwestowana kasa wśród moich wszystkich wydatków na naukę;-)

    0
  • #15 15 Lip 2012 23:30
    Antystatyczny
    Poziom 16  

    To jest ksiązka Mirekk36?

    0
  • #16 16 Lip 2012 00:02
    LordBlick
    VIP Zasłużony dla elektroda

    Antystatyczny napisał:
    To jest ksiązka Mirekk36?
    Owszem, a coś to zmienia ?
    Do zrozumienia składni języka C nie jest ta książka konieczna, tym niemniej ułatwia zastosowanie C w mikrokontrolerach.
    http://lmgtfy.com/?q=sk%C5%82adnia+j%C4%99zyka+c

    0
  • #17 16 Lip 2012 09:41
    Antystatyczny
    Poziom 16  

    Owszem, zmienia. Kupię ją z przyjemnością :) Pan Mirek ma masę ciekawych pomysłów, a i Jego blog jest bardzo przystępnie napisany, co sugeruje, że i książka będzie dla mnie zrozumiała.

    Dodano po 2 [minuty]:

    LordBlick, z Google korzystam i to bardzo często. Bez tego nie dowiedziałbym sie np. o tym, że muszę ręcznie stworzyć plik makefile itp. Kupię książkę i nie bedę zamęczał podstawami.

    0
  • #18 16 Lip 2012 11:18
    63404
    Użytkownik usunął konto  
  • #19 16 Lip 2012 11:39
    piotrva
    Moderator na urlopie...

    Cytat:
    Antystatyczny, z google dowiesz się tego samego co z książki, tylko w portfelu zauważysz różnicę..

    Antystatyczny napisał:
    Kupię książkę i nie bedę zamęczał podstawami.


    Aktywni użytkownicy forum mogą się nudzić jak nie będziesz pisał :P


    No niestety nie zgodzę się na całej linii. Na googlach owszem znajdziesz wszystko to co w książce, ale to będzie najwyżej 1% wiadomości z sieci. A pozostałe 98% to śmieci. (1% to wiadomości nowe, nieopisane w książce) Zauważmy, że w internecie napisać słowo może każdy, a czasem osoby mniej doświadczone uważają ze coś wiedzą i opisują całkowicie błędnie niektóre aspekty, nie mówiąc już o promowaniu złych nawyków. Zrobisz jak chcesz, ale za książką przemawiają dla mnie następujące argumenty (mówię szczerze, jestem nawet związany w wielu projektach z firmą konkurencyjną w stosunku do Mirka):
    1. Informacje sprawdzone, działające, opisane przystępnym językiem
    2. Książka uczy dobrych nawyków podczas pisania programów
    3. Wiele aspektów praktycznych zebranych w jednym miejscu
    4. Książka porusza zarówno tematykę podstaw języka C, jak i konkretne jego zorientowanie na pisanie programów na procesory AVR.
    *. Papier (może jestem staromodny, choć wiekiem młody, ale książka papierowa to nie to samo co e-book czy sieć...)
    ---
    Raczej aktywni użytkownicy odetchną z ulgą, że nie trzeba po raz kolejny opisywać jak się miga diodką na AVR, a ponadto dostaną potem z prośbami o pomoc przejrzyście napisane kody, a nie sieczki rodem z internetu typu: TCCR0A = 0x2F;//a teraz pomyślmy co poeta miał na myśli - wystarczy tylko kalkulator, potem rzut okiem do noty po rozpisaniu bitów i już po minucie (zamiast po 10 sekundach) wiemy o co chodzi.
    ---
    PS. mnie inwestycja w tę książkę zwróciła się z duuuuuuużą nawiązką :D

    0
  • #20 16 Lip 2012 12:38
    63404
    Użytkownik usunął konto  
  • #21 16 Lip 2012 14:44
    tehaceole

    Poziom 28  

    Antystatyczny - warto byś zrozumiał podstawy działania tych operacji, bo później możesz np. spotkać coś takiego:

    Kod: C
    Zaloguj się, aby zobaczyć kod
    i będziesz w głowę zachodzić co to za wynalazek. :) A podpowiem tylko, że zastosowana jest tu funkcja EXNOR - po co? Zostawiam Ci to jako "zadanie domowe". :)

    Recenzje książek Kolegów Mirekk36 i tmf możesz przeczytać tutaj oraz tutaj. Posiadam wszystkie zrecenzowane pozycje i powiem Ci szczerze: nie żałuję ani złotówki. :)

    0
  • #23 16 Lip 2012 22:01
    Antystatyczny
    Poziom 16  

    Bardzo dziękuję za wszystkie odpowiedzi, no i za zadanie domowe :D Książki jeszcze nie mam, bo kosztuje 83zł. w pobliskiej księgarni, ale pościągałem sobie trochę podstaw C. Ciekawi mnie pewna rzecz, a mianowicie obecność czegoś takiego: zmienna++

    Wydawało mi się, że językC++ został w ten sposób nazwany, bo ten sposób inkrementacji został zaimplementowany dopiero w C++ i stad ta nazwa. Zerkam w różne kody C, a tu jak byk widzę, że też jest dostępna taka forma inkrementacji. Chyba musiałem kiedyś przerczytać jakąś bzdurę (a przynajmniej na to wygląda)

    Wiem już jak działa AND, OR, NOT i XOR. EXNOR to zapewne coś w stylu exclusive NOR, prawda? Zaraz bedę o tym czytał, by odrobić zadanie domowe :)
    Dziękuję, że mnie wspieracie!

    Dodano po 18 [minuty]:

    Wstępnie, po zerknięciu jak działa bramka logiczna exnor i przeanalizowaniu tablicy prawdy, wydaje mi się, że ta makrodefinicja działa mniej wiecej w ten sposób:
    jeśli nacisne klawisz UP i w konkretnym menu, w którym aktualnie jest program, ma być obsługa tego klawisza, zmienia się wartośc zmiennej okreslającej poziom menu, dobrze myślę? Ewentualnie KLAWUP_bit służy do zatrzaskiwania stanu przycisku (coś ala debounce)

    Dodano po 3 [minuty]:

    Aha, a co do wartości książek... Osobiście wole wziąc w dłoń i poczytać w łózku, czy też będąc w miejscu odosobnienia :-) E-book'i Mnie jakoś nie kręcą. Jestem w tej kwestii dośc staromodny :)

    0
  • #24 16 Lip 2012 22:20
    mirekk36
    Poziom 42  

    Antystatyczny napisał:

    Wydawało mi się, że językC++ został w ten sposób nazwany, bo ten sposób inkrementacji został zaimplementowany dopiero w C++ i stad ta nazwa. Zerkam w różne kody C, a tu jak byk widzę, że też jest dostępna taka forma inkrementacji. Chyba musiałem kiedyś przerczytać jakąś bzdurę (a przynajmniej na to wygląda)


    No na to wygląda ;) ... Język C++ to rozwinięcie języka C ale główna różnica to wprowadzenie obiektowości, klas i innych podobnych rzeczy. Składnia w postaci operatorów post- i pre- inkrementacji czy też post- i pre- dekrementacji

    zmienna++;
    ++zmienna
    zmienna--;
    --zmienna;

    jest dostępna już od języka C ;) ... na szczęście zresztą bo te i wiele innych operatorów w takich językach - to bardzo przyjemne "sztuczki"

    0
  • #26 16 Lip 2012 23:31
    Antystatyczny
    Poziom 16  

    A koledzy są w stanie stwierdzić, czy dobrze rozumiem tę makrodefinicję, która zadał mi kolega kilka postów wyżej?

    Mirekk36, pamiętam post i predekrementację z książek o C++ :)
    (Zbieram kasę na Twoją książkę). Jestem bardzo zadowolony z Twojego bloga i w związku z tym ksiązke chętnie nabędę. Jestem pełen nadziei, że mi pomoże szybko przebrnąć przez podstawy.

    Dodano po 49 [minuty]:

    Skleciłem taki kod, póki co bez pomocy ksiązki, ale nie działa (co mnie w sumie nie zdziwiło)
    To miała byc pojedyncza dioda świecąca pomiędzy PORTA0 a PORTA7. Wiem, że popełniłem jakiś bład, a kompilator prosi o expresion before =. Zerkniecie na to?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #27 16 Lip 2012 23:36
    mirekk36
    Poziom 42  

    Nie ma takiej operacji:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    co to miałoby oznaczać albo robić wg ciebie - hmm wg twoich założeń - może tak zapytam? to wtedy uda się coś podpowiedzieć. No i dlaczego diodą LED podłączasz pomiędzy PA0 i PA7 ?? zamiast np pomiędzy PA7 i VCC albo PA7 i GND (oczywiście z rezystorem ograniczającym jej prąd trzeba w każdym przypadku)

    Jakbyś w tej pętli while(1) napisał

    Kod: c
    Zaloguj się, aby zobaczyć kod


    a dioda byłaby podłączona do PA7 i do VCC lub GND to oczywiście by ci migała ;)

    0
  • #28 16 Lip 2012 23:47
    Antystatyczny
    Poziom 16  

    Przepraszam, źle się wyraziłem. Chodzi o 8 diod podłaczonych do całego portu A. PORTA << 1 ... chciałem w ten sposób przesunąc bit w lewo o jedno miejsce. Efekt ma byc taki, że ma powstac fala.

    Dodano po 4 [minuty]:

    Chodzi mi o to, by pojedyncza dioda się zapalała od pozycji PORTA0 do PORTA7 i w druga stronę tak samo. I tak w nieskończoność.

    0
  • #29 17 Lip 2012 00:44
    mirekk36
    Poziom 42  

    No to obejrzyj i przeanalizuj sobie ten przykład ;) na jego podstawie zrobisz sobie efekty na tych 8 diodach LED jakie ci się żywnie spodobają ;)

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #30 17 Lip 2012 01:43
    LordBlick
    VIP Zasłużony dla elektroda

    1. Definicje MCU i F_CPU to tylko w Makefile.
    2.Wypróbuj takie coś w ramach zwalczania przyzwyczajania się do "delajów" ;) - jak ja widzę używanie timera w trybie CTC, generalnie tak napisane, że raczej z notą katalogowa w ręku nie trzeba za dużo wyjaśniać o co chodzi :
    - plik LED_Line.c:

    Kod: C
    Zaloguj się, aby zobaczyć kod

    - plik Makefile:
    Kod: make
    Zaloguj się, aby zobaczyć kod

    0