Elektroda.pl
Elektroda.pl
X
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 2303 9
  • #1
    świstak87
    Level 10  
    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 10  
    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 10  
    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 10  
    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 10  
    Dziękuje wszystkim, temat wyczerpany i do zamknięcia. :)