Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Operacje na bitach w języku C#

świstak87 18 Jun 2010 10:28 2216 9
  • #1
    świstak87
    Level 9  
    Witam

    Właśnie rozpoczynam moją przygodę z programowaniem mikrokontrolerów, życie sprawiło, że jest to zestaw EM430F6137RF900 od Texas Instruments - to mikrokontroler MSP430 z łącznością bezprzewodową. Ale to nieistotne.

    W Elektronice Praktycznej jest cykl artykułów poświęconych tym mikrokontrolerom, w artykule trzecim http://ep.com.pl/?sect=msp430_niepobieraja&pg=cz3 zamieszczona jest ramka o operacjach na bitach:
    Quote:
    W mikrokontrolerach MSP430 trzeba nauczyć się operowania bitami. Ta umiejętność jest potrzebna we wszystkich współczesnych mikrokontrolerach, ponieważ nie mają one operacji manipulowania bitami, jakia istnieje w mikrokontrolerach typu '51.

    Spróbujmy pokazać jak wykonuje się operacje ustawiania i kasowania bitów w mikrokontrolerach MSP. Załóżmy że chcemy manipulowć bitami 1 i 5 portu P1OUT. Jeśli wiemy dokładnie jakie bity mamy ustawić a jakie wyzerować to możemy zapisać to jako:

    P1OUT = 0x12

    Zapis ten spowoduje ustawienie bitu1 i bitu 5 a pozotałe bity zostaną wyzerowane. Jeśli zamierzamy ustawić tylko bity 1 i 5 a pozostałe pozostawić bez zmiany to można to zrealizować w sposób następujący

    P1OUT |= 0x12.

    W przypadku gdy chcemy wyzerować bity 1 i 5 a pozostałe pozostawić bez zmian to można to zapisać w postaci

    P1OUT &= ~0x12

    Jeśli dodamy definicje bitów w postaci

    #define BIT0 (0x0001)
    #define BIT1 (0x0002)
    #define BIT2 (0x0004) ...

    to zapisy przedstawione powyżej staną się bardziej czytelne. Definicje bitów znajdują się w zbiorze msp430x14x.h
    Zapis ustawienia bitów może teraz wyglądać



    P1OUT |= BIT1 + BIT5

    lub

    P1OUT |= BIT1 | BIT5

    Podobnie aby wyzerować bity trzeba napisać

    P1OUT &= ~(BIT1 + BIT5)

    lub

    P1OUT |= ~(BIT1 | BIT5)

    Powyżej przedstawione zapisy wymagają uważnego przeanalizowania bo będą często używane w programach dla MSP430. Aby wyczerpać zagadnienie ustawiania i zerowania bitów warto wspomnieć, że gdyby wprowadzić nieco inna definicje bitów

    #define bit0 0
    #define bit1 1
    #define bit2 2...

    to operacje ustawiania bitów można zapisać jako

    P1OUT |= ((1<<bit1) + (1<<bit5))

    Podobnie operacja zerowania przybierze wtedy postać

    P1OUT &= ~ ((1<<bit1) + (1<<bit5))

    Niestety, nie rozumiem praw rządzących zapisem P1OUT = 0x12
    Czym jest liczba przed x, a czym za x?
    Skoro mamy ustawiać bit pierwszy i piąty, to skąd się wzięło 12?

    Z góry dziękuje za pomoc,
    Świstak
  • #2
    shootky
    Level 15  
    Moze dlatego że 12h to jest 00010010?
  • #3
    świstak87
    Level 9  
    To była moja pierwsza myśl, ale wtedy przecież, przyjmując, że najmniej znaczący bit jest bitem zerowym, to jedynkami są bity pierwszy i czwarty.
  • #4
    shootky
    Level 15  
    12h
    1-> 0001
    2-> 0010

    teraz w pionie zapisze 0b00010010
    0
    b
    0 - bit nastraszy 2^8 czyli x128
    0
    0
    1 - 2^4 czyli x 16
    0
    0
    1 - 2^1 czyli x2
    0 - bit najmłodszy 2^0 czyli x1


    reasumując: 0b00010010=12h=18(dziesiętne) prościej nie potrafię.
  • #5
    świstak87
    Level 9  
    Wszystko się zgadza, przeliczanie jest zrobione OK, jak najbardziej.
    Chodzi mi o coś innego.
    W przeliczeniu 12h na binarne dostajemy:
    00010010b
    76543210 <- numery bitów
    Jedynką jest bit pierwszy i czwarty, a mieliśmy ustawić na 1 bity pierwszy i piąty, czyli binarnie powinno być:
    00100010b=22h
    76543210 <- numery bitów
    Prawda?

    Ale generalnie, jeśli to proste przeliczanie z szesnastkowego, to chyba wychodzi, że to taki trochę czeski błąd w artykule?
  • #6
    Mari@@@n
    Level 19  
    Według mnie zapis P1OUT = 0x12 ustawi bity 1 i 4

    Quote:
    #define BIT0 (0x0001)


    zgodnie z definicja kilka linijek nizej gdzie bit0=1
  • #7
    świstak87
    Level 9  
    No właśnie, czyli, żeby ustawić bity 1 i 5 powinien być zapis P1OUT=0x22?
    To jeszcze tylko do pełni szczęścia powiedzcie mi, czym jest 0 przed x? Numerem portu, dobrze się domyślam?
  • #8
    Mari@@@n
    Level 19  
    0x to oznaczenie w systemu heksadecymalnego (szesnastkowego)
    na przykład binarny oznacza się 0b przed liczba.
  • #9
    shootky
    Level 15  
    Reasumując:
    12h ustawi 4 i 1
    22h ustawi 5 i 1
    zatem na 100% jest błąd
  • #10
    świstak87
    Level 9  
    Dziękuje wszystkim, temat wyczerpany i do zamknięcia. :)