eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaDefiniowane portów/flag w C
Ilość wypowiedzi w tym wątku: 18

  • 11. Data: 2017-10-19 22:28:13
    Temat: Re: Definiowane portów/flag w C
    Od: Sebastian Biały <h...@p...onet.pl>

    On 10/19/2017 10:17 PM, sword wrote:
    >> Z powodu jakiego? Technicznego czy białkowego?
    > Jest narzucone z "góry".

    Czyli białkowy. Nadzieja w tym że problemy białkowe czasami rozwiązują
    się szybciej niż komercyjne kompilatory dostają wsparcie C++, ale to
    rodzaj czarnego humoru.

    To nie pomogę bo każde rozwiązanie w C będzie gówniane.


  • 12. Data: 2017-10-19 22:48:08
    Temat: Re: Definiowane portów/flag w C
    Od: Jakub Rakus <s...@o...pl>

    W dniu 19.10.2017 o 13:01, sword pisze:

    > Przy portach to jeszcze nie jest problemu ale przy flagach trzeba
    > ręcznie panować nad tym w której zmiennej leży jaka flaga. Już
    > kilka razy szukałem przez to błędów.
    Problem moim zdaniem nie leży ani w wybranym w języku programowania, ani
    w sposobie implementacji tylko "wyżej" - zagadnienie nazywa się semantyka.

    Rozwiązanie banalne - stosuj nazwy zmiennych, funkcji, makr i definicji,
    które będą JEDNOZNACZNE i SAMOKOMENTUJĄCE SIĘ. Dobrym przykładem mogą
    być biblioteki dostarczane przez ST do ich procków, bo tam przyjęto
    regułę, że jeśli rejestr nazywa się REG_BLA_BLA to bity w nim nazywają
    się REG_BLA_BLA_ENABLE_COŚTAM, REG_BLA_BLA_DISABLE_INNE_COŚTAM itd.

    --
    Pozdrawiam
    Jakub Rakus


  • 13. Data: 2017-10-20 02:04:54
    Temat: Re: Definiowane portów/flag w C
    Od: "J.F." <j...@p...onet.pl>

    Dnia Thu, 19 Oct 2017 21:38:58 +0200, Grzegorz Niemirowski napisał(a):
    > sword <n...@p...onet.pl> napisał(a):
    >> Hmm, mogę dać inline ale wydaje mi się, że jestem w tym samym
    >> punkcie co z makrami.
    >> static inline void setbit (u8 port, u8 pin)
    >> {
    >> port |= 1<<pin;
    >> }
    >> No i co dalej? Chciałbym ją tak samo wywołać, np.:
    >> setbit(F_LED)
    >
    >
    > Musisz stworzyć coś, co oprócz bitu będzie nisło też informację o porcie,
    > np.
    [...]

    A na bezczelnego ?

    #define F_LED GPIO,7

    ... setbit(F_LED) ...

    https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.
    html


    J.



  • 14. Data: 2017-10-20 09:43:05
    Temat: Re: Definiowane portów/flag w C
    Od: Marcin <m...@o...pl>


    > A na bezczelnego ?
    >
    > #define F_LED GPIO,7
    >
    > ... setbit(F_LED) ...
    >
    > https://gcc.gnu.org/onlinedocs/cpp/Argument-Prescan.
    html
    >

    Do takiego zadzialania potrzeba "podwojnego makra":

    #define _test_set_bit(port,pin) do{ (port)->PDOR |=(1<<(pin)); }while(0)
    #define test_set_bit(x) _test_set_bit(x)
    #define LEG_G_7 GPIOB,7

    i wtedy
    test_set_bit(LEG_G_7);
    preprocesor rozwinie poprawnie:
    do{ (((GPIO_Type *)(0x400FF040u)))->PDOR |=(1<<(7)); }while(0);

    Przy pojedynczym makro (jak pierwsze) arm-none-eabi-gcc zglasza blad ze makro ma miec
    2 parametry a przekazany jest tylko 1.

    $ arm-none-eabi-gcc -E -mcpu=cortex-m0plus makro.c -o makro2.lst
    makro.c:14:23: error: macro "test_set_bit" requires 2 arguments, but only 1 given
    test_set_bit(LEG_G_7);



    Marcin


  • 15. Data: 2017-10-20 11:53:52
    Temat: Re: Definiowane portów/flag w C
    Od: Janusz <j...@o...pl>

    W dniu 2017-10-19 o 13:01, sword pisze:
    >
    > Cześć,
    >
    > Może nie do końca ta grupa ale wielu z Was pisze w C i może mi podpowie :)
    >
    > Korzystam z takich makr, które pracują na bitach, np.:

    Ja to robię tak wpierw definicje makr
    #define SET_(p, m) (p |= (1 << (m)))
    #define CLR_(p, m) (p &= ~(1 << (m)))
    #define TEST_(p,m) (p & (1 << (m)))
    #define TOGGLE_(p, m) (p ^= (1 << (m)))

    #define SET(x) SET_(x)
    #define CLR(x) CLR_(x)
    #define TEST(x) TEST_(x)
    #define TOGGLE(x) TOGGLE_(x)

    potem właściwa konfiguracja

    #define ZIELONA PORTB,1

    i potem w programie

    SET(ZIELONA);

    --
    Pozdr
    Janusz


  • 16. Data: 2017-10-20 13:57:16
    Temat: Re: Definiowane portów/flag w C
    Od: sword <n...@p...onet.pl>

    On 2017-10-19 21:38, Grzegorz Niemirowski wrote:
    > Musisz stworzyć coś, co oprócz bitu będzie nisło też
    > informację o porcie, np.

    Fajny przykład ale do pracy z bitami to za dużo kodu.

    --
    sword


  • 17. Data: 2017-10-20 14:21:16
    Temat: Re: Definiowane portów/flag w C
    Od: sword <n...@p...onet.pl>


    On 2017-10-20 11:53, Janusz wrote:
    > Ja to robię tak wpierw definicje makr

    Dzięki, o to mi chodziło :)


    --
    sword


  • 18. Data: 2017-10-20 15:17:15
    Temat: Re: Definiowane portów/flag w C
    Od: g...@s...invalid (Adam Wysocki)

    sword <n...@p...onet.pl> wrote:

    > Hmm, mogę dać inline ale wydaje mi się, że jestem w tym samym
    > punkcie co z makrami.

    Niekoniecznie.

    > static inline void setbit (u8 port, u8 pin)

    Nie wiem na jaką platformę piszesz, ale na AVR port nie ma typu u8
    (uint8).

    > No i co dalej? Chciałbym ją tak samo wywołać, np.:
    >
    > setbit(F_LED)

    Spróbuj tak:

    [gof@pi /tmp]$ cat test.c
    #include <inttypes.h>
    #include <avr/io.h>

    // bez nawiasów, żeby nie rozwinęło się tylko do jednego argumentu
    #define MAKE(port, bit) &port, _BV(bit)

    // podejście z MAKE
    #define LED1 MAKE(PORTB, 3)
    #define BUZZER1 MAKE(PORTC, 0)

    // podejście bez MAKE - bez nawiasów!
    #define LED2 &PORTB, _BV(3)
    #define BUZZER2 &PORTC, _BV(0)

    static inline void setbit(volatile uint8_t *port, uint8_t mask)
    {
    *port |= mask;
    }

    int main(void)
    {
    setbit(LED1);
    setbit(BUZZER1);
    setbit(LED2);
    setbit(BUZZER2);

    return 0;
    }
    [gof@pi /tmp]$ avr-gcc -mmcu=atmega8 -Wall -Wextra test.c
    [gof@pi /tmp]$

    --
    [ Email: a@b a=grp b=chmurka.net ]
    [ Web: http://www.chmurka.net/ ]

strony : 1 . [ 2 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: