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

AVR GCC - if w połączeniu z #define - włączanie/wyłączanie danego wyjścia

Krampek 14 Wrz 2014 00:11 1374 6
  • #1 13958661
    Krampek
    Poziom 16  
    Mam takie pytanie.. w programie w jednej zmiennej 1 bajtowej dostaję jakie wyjścia ( od 1 do 8 ) mają się włączać ( jeśli dany bit=1) wyłączać ( jeśli bit =0 ). Analizuję każdy bit po koleji - przesuwając zmienną w prawo ale mam teraz problem - chodzi o optymalizację kodu.

    W definicjach mam na ten moment coś takiego
    #define zapal_wy1 sbi(PORTC,PC1)
    #define zgas_wy1 cbi (PORTC,PC1)

    Ale to jest bez sensu ;) - bo przy każdym bicie steruję innym wyjściem, musiałbym mieć 16 definicji.Stąd pytanie czy nie mogę w "#define zapal" podać atrybutu tak żeby jeśli użyję np. "zapal=1;" to procesor wykona sbi(PORTC,PC1)
    jak zapal 6 to np sbi(PORTB,PB6);

    Mogę to zrobić łopatologicznie ale wiem że lepiej to jakoś inaczej załatwić..

    Pytanie jak?

    Oprócz odpowiedzi na powyższe byłbym wdzięczny za jakiś namiar gdzie mogę poczytać o operowaniu na #define. Muszę sobie trochę odświeżyć temat.
  • #2 13958726
    alagner
    Poziom 26  
    Lepiej byłoby zapal(x).
    Ze znakiem = to na pewno jest do ugryzienia w C++ przez przeładowanie operatora przypisania.
  • #3 13958829
    el2010tmp
    Poziom 25  
    Krampek napisał:
    Mam takie pytanie.. w programie w jednej zmiennej 1 bajtowej dostaję jakie wyjścia ( od 1 do 8 ) mają się włączać ( jeśli dany bit=1) wyłączać ( jeśli bit =0 ). Analizuję każdy bit po koleji - przesuwając zmienną w prawo ale mam teraz problem - chodzi o optymalizację kodu.

    Jeśli chodzi o optymalizacje to zgrupuj wyjścia w jednym porcie i wówczas będziesz miał pojedynczą instrukcję przypisania:
    PORTx=zmienna;
  • #4 13958851
    M. S.
    Poziom 34  
    Spróbuj
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Później
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

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

    ...
  • #5 13959005
    tmf
    VIP Zasłużony dla elektroda
    Przede wszystkim sbi/cbi to metody dostępu do IO rodem z muzealnej wersji AVRlibc. Obecnie nie należy ich stosować, a po prostu odwoływać się do odpowiedniego portu IO. Kompilator sam sobie z tym poradzi. Druga sprawa - nie używaj makr, tam gdzie ich użycie nic nie daje. Co szkodzi zdefiniować odpowiednią funkcję w C? Jeśli poszczególne piny IO nie odpowiadają bitom zmiennej, to najprościej zrobić lookup table - ma tylko 8 pozycji i mżesz dowolnie mapować bit na pin IO.
  • #6 13959552
    Krampek
    Poziom 16  
    Rozumiem że z odwoływaniem do portów lepiej używać taki formy:

    PORTC |= (1<<3) | (1<<5) | (1<<7);

    Piny mam rozrzucone na kilku portach - także niestety nie mogę założyć że je podłączam do jednego. Reasumując zrobię chyba dwie funkcje:

    void zapal ( short)
    void zgas ( short )


    wrzucę w nich operację case i zależnie od wartości będę włączał/wyłączał dane wyjście.
  • #7 13961630
    BlueDraco
    Specjalista - Mikrokontrolery
    Zrób. Dzięki temu będziesz mógł ponumerować wyjścia liczbami od -32768 do 32767, bez czego po prostu nie da się żyć... ;)
REKLAMA