logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Poprawność składania bitów w dwa bajty - operacje bitowe

mattsk 07 Mar 2012 17:16 2144 4
REKLAMA
  • #1 10646628
    mattsk
    Poziom 13  
    Witam,
    chciałbym się upewnoć czy procedura przedstawiona poniżej działa tak jak myśle:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Pisze obsługe DAC MPC4922. W słowie "data" mam mieć wysyłane dane do przetwornika po SPI. Pierwsze 4 bajty są bajtami konfiguracyjnymi a reszta to wartość która po przeliczeniu daje na wyjściu określone napięcie. Chciałbym żeby w zmiennej "data" były bity tak jak z datasheetu:
    Poprawność składania bitów w dwa bajty - operacje bitowe
    Jest okej? ;)
  • REKLAMA
  • Pomocny post
    #2 10646928
    snnaap
    Poziom 25  
    zmiennej wartość nie przesuwasz tylko robisz or:

    Kod: text
    Zaloguj się, aby zobaczyć kod



    Pamiętaj że ostatnie 4 bity zmiennej wartość muszą mieć 0 tak samo jak pierwsze 7 bitów każdej z pozostałych zmiennych aby nie nadpisały wcześniej ustawionych wartości.


    Pozdrawiam
  • REKLAMA
  • Pomocny post
    #3 10647559
    kiziu13
    Poziom 17  
    Rozwijając to co pisał snnaap o nadpisywaniu, dla pewności lepiej wszystkie wartości maskować/warunkować, wtedy nie ma żadnych nieprzyjemności, jeśli zapomni się o dozwolonych wartościach.

    Dodatkowo, coś mi nie pasuje przy wysyłaniu danych po SPI. Zakładając, że funkcja wysyła bajt, to w pierwszej linii wysyłasz młodszy bajt słowa, a za drugim razem wysyłasz serie zer, bo przesuwasz w złą stronę. Jeśli chcesz wysłać starszy bajt, to powinieneś przesunąć o cały bajt w prawo, nie w lewo. Co więcej, kolejność wysyłania w tych układach jest "MSB first", więc najpierw wysyłasz starszy bajt, później młodszy.

    Idąc dalej, nie ma sensu inicjalizacja zmiennej lokalnej data i późniejszy operator |=, lepiej od razu przypisać te wartości do zmiennej, a ewentualnie za drugim razem dopisywać operatorem |=.

    Zamiast robić define-y, które nic nie mówią, lepiej zapisać w nich pozycje bitowe flag i ich użyć w funkcji, tak jak mają biblioteki AVR-ów.

    PS. Ten układ zaczyna się od MCP, nie MPC.
  • REKLAMA
  • Pomocny post
    #4 10647566
    michalko12
    Specjalista - Mikrokontrolery
    Ja bym tego tak nie zrobił, musisz mieć 100% pewność, że będziesz przekazywał wartości 0,1 i argument wartosc nie przekroczy zakresu 12 bitów. Dlatego bezpieczniejsza i pewnie efektywniejsza będzie wersja na if-ach

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
REKLAMA