Strony

piątek, 23 grudnia 2011

Język C makra upraszczające dostęp do portów - wyjaśnienie

Witam,

Ponieważ wiele osób boryka się z rozgryzieniem sposobu działania makr upraszczających dostęp do portów takich jak poniżej:

// Makra upraszczające dostęp do portów
// *** PORT
#define PORT(x) SPORT(x)
#define SPORT(x) (PORT##x)
// *** PIN
#define PIN(x) SPIN(x)
#define SPIN(x) (PIN##x)
// *** DDR
#define DDR(x) SDDR(x)
#define SDDR(x) (DDR##x)


Chciałbym przedstawić pewne dodatkowe wyjaśnienia na ten temat, które mam nadzieję, że każdemu pomogą dogłębnie już zrozumieć zasadę ich działania. A jeśli nawet coś dalej będzie niejasne to oczywiście zapraszam do dyskusji ale już na forum, gdzie prowadzi poniższy link ;)

6 komentarzy:

  1. Makra rozumiem. Przynajmniej tak mi sie wydawlo do czasu 3 cwiczenia z ksiazki o multipleksowaniu.

    W pliku naglowkowym: d_led.h
    #define LED_DATA PORTA

    Teraz gdy odnosze sie do tego makra w pliku d_led.c

    PORTA=0xFF; zeby wystawic 1 na wszystkich bitach wywala mi error: expected identifer or ( befor volatile token....
    Nie mam tam nic poza includami przerwan, io.h i mojego pliku naglowkowego d_led.h.

    Juz tlumacze wywoluje te PORTA poza jakakolwiek funkcja. Wyrzucilem z kodu wszystko by zrozumiec ten problem.

    Prosze o wytlumaczenie

    OdpowiedzUsuń
    Odpowiedzi
    1. Masz gdzieś paskudnego babola i to trywialnego typu brak przecinka czy średnika, jakąś literówkę itp

      Dawaj na forum panie kochany i pokaż co testujesz, pokaż swój fragment kodu po zmianach - wtedy będzie można pomóc .. bo tak to tylko domyślać się można albo zgadywać.

      Usuń
    2. Zawitam na pewno! Bo forum jest super.

      Blad wiem gdzie jest, tylko pytanie dlaczego nie moge dać przed funkcją main :
      Definicji konfiguracyjnych portow.
      Np. DDRD=0xFF;

      Pozdrawiam serdecznie.
      Z góry dziekuje za odpowiedz.


      Usuń
    3. Hmmm dlaczego nie możesz dać definicji portów przed funkcją main ... a jak myślisz ?

      Odpowiedź jest dość prosta ... musisz sięgnąć do PODSTAW w książce, czyli do rozdziałów z pierwszej połowy książki bo widzę że ci DUŻO uleciało - tak czasem bywa ....

      Skąd u ciebie pomysł żeby PISAĆ KOD poza ciałem jakiejkolwiek funkcji ? myślisz że tak się da ? ;) NIGDY W ŻYCIU ...

      mówię zajrzyj do początku książki - o funkcjach ... i zobacz jakie zasady nimi rządzą ... ale też zapamiętaj sobie raz na zawsze - że w C kod źródłowy piszemy ZAWSZE wewnątrz funkcji - poza funkcjami NIC NIE MOŻNA NAPISAĆ jeśli chodzi o kod. Projekt w C składa się TYLKO z funkcji - no i może procedur obsługi przerwań ale to też są swego rodzaju funkcje.

      Usuń
    4. Ja to rozumiem tylko myslalem ze skoro zmienne mozna deklarowac lub definiowac przed main to czemu by nie zrobic tego z portami.

      Przepraszam za tak naiwne pytanie.
      Programowalem w innych jezykach i to przejscie na procki troszke trudne.

      Usuń
    5. W żadnej odmianie języka C (podkreślam w żadnej odmianie czy to na PC, czy na procki, czy na linuxa) NIGDZIE w C albo C++ nie można pisać kodu poza ciałem funkcji ....

      Tu widać , że kolega jeszcze ma kłopoty ze zrozumieniem co to jest DEFINICJA zmiennej lub funkcji i czym się różni od DEKLARACJI. To pokazuje, że chyba kolega nie przeczytał jednak w chociaż raz w całości Bluebooka no albo coś umknęło. A kilka razy WYRAŹNIE kładę nacisk aby czytelnik jak PODSTAWĘ te właśnie różnice zrozumiał - bez tego będzie się wciąż powielać błędy w dalszej nauce programowania w C

      Usuń