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

[avr] [avr][c] - Jak iterować po #define zamiast tablicy w C?

esane 05 Sie 2012 00:02 1383 8
REKLAMA
  • #1 11176413
    esane
    Poziom 9  
    Witam,

    Odbieram kilkanascie bajtów po SPI. Każdy bit to stan przycisku bądź enkodera. Dla zwiększenia czytelności kodu napisałem funkcje która przepisuje mi poszczególne bity do kolejnych elementów tablicy aby łatwiej "dobrać się" do stanu konkretnego bitu. Przykład niżej (odczyt[0] to pierwszy bajt odebrany z SPI):

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


    Chciałbym to trochę zoptymalizować, bo takie przypisania zabierają niepotrzebnie czas, a dodatkowe zmienne pamieć. Chciałem zrobić to używajac #define w taki sposób:

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


    Problem polega na tym, że po tak zdefiniowanych elementach nie mogę badź nie potrafię przelecieć pętlą tak jak po tablicy:

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


    Moje pytanie brzmi - czy da się iterować po elementach zdefiniowanych w ten drugi sposób. Jeśli tak, to jak to zrobić? #define przycisk[0] daje błędy przy kompliacji.

    Z góry dziękuje za pomoc,

    pozdrawiam
  • REKLAMA
  • #2 11176482
    stanleysts
    Poziom 27  
    Pewnie że się tak nie da z define, przynajmniej w taki sposob ja ty chcesz, można zrobić to przecież tak:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 11176486
    esane
    Poziom 9  
    Tak to żaden problem, co 8 bitów trzeba by było jeszcze inkrementować indeks od odczyt[], ale ja chciałbym mieć to zdefiniowane na potrzeby dekodowania enkoderów, bo kod w takiej postaci bedzie strasznie nieczytelny.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Dodatkowo nie wszystkie przyciski reprezentowane sa przez sasiadujace bity, jest tez sytuacja ze bajt sklada sie z powiedzmy enc0_a, enc0_b, przycisk0, enc1_a, enc1_b, przycisk1, przycisk2 itd.
  • #4 11176496
    stanleysts
    Poziom 27  
    To jak chcesz z define to wykorzystaj operator sklejania ##
  • REKLAMA
  • Pomocny post
    #5 11176497
    excray
    Poziom 41  
    Nie znam się zbyt mocno na C więc może da się ten kod bardziej uprościć, ale możesz to zrobić wykorzystując struktury i pola bitowe jak poniżej. Załóżmy że klawiatura jest podpięta pod port B i odpowiednio przyciski:
    GÓRA pod PB0
    DÓŁ pod PB1
    ...
    MENU pod PB4
    Do odczytu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Analogiocznie robisz u siebie dla bitów.
  • #6 11176507
    stanleysts
    Poziom 27  
    Jak chcesz mieć na przykład coś takiego:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    to można to tak zrealizować:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #7 11177331
    esane
    Poziom 9  
    Na poczatku dziekuje za zainteresowanie, ale nie konkretnie o to mi chodzilo, dlatego, ze w obu zaproponowanych rozwiazaniach musze wprowadzac dodatkowe zmienne, a w ten sposob mam to zrealizowane teraz. Jesli dobrze rozumiem deklarujac np.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    nie wprowadzam nowej zmiennej, tylko podczas kompliacji wszelkie wywolania przycisk0 sa zastepowane przez (~odczyt[0] & 1) i o takie rozwiazanie mi chodzi. Tyle, że chciałbym aby dalo sie po tym "przejechac" petla.

    Edit: A czy ten operator sklejania ma jakas bardziej oficjalna albo angielska nazwe, bo nie moge nic sensownego wygoogleowac
  • Pomocny post
    #8 11177359
    excray
    Poziom 41  
    esane napisał:
    Na poczatku dziekuje za zainteresowanie, ale nie konkretnie o to mi chodzilo, dlatego, ze w obu zaproponowanych rozwiazaniach musze wprowadzac dodatkowe zmienne

    W moim rozwi ązaniu nie wprowadzasz realnie nowej zmiennej. Jedynie wirtualnie. Poczytaj o struktach i polach bitowych.
    esane napisał:
    kompliacji wszelkie wywolania przycisk0 sa zastepowane przez (~odczyt[0] & 1) i o takie rozwiazanie mi chodzi.

    w przypadku struktów właśnie cos takiego odtrzymujesz. Daną wprowadzasz w postaci bajtu(ów) danych a odczytujesz poprzez jej poszczególne bity. Tworząc zapytanie if (klawiatura.p_up) robisz coś w stylu właśnie if (dana&(1<<PB4)) ...
  • #9 11177531
    stanleysts
    Poziom 27  
    No to jak nie chcesz mieć zmiennych to przerób to poprostu w taki sposób:

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