Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 4 kwi 2025, o 18:05


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Ten wątek jest zablokowany. Nie możesz w nim pisać ani edytować postów.  [ Posty: 29 ] 
    Autor Wiadomość
    PostNapisane: 23 gru 2011, o 17:39 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    Witam!

    Mam problem ze zrozumieniem kodu preprocesora z przykładu z książki pana Mirka. Nie wiem może już jestem zbyt przemęczony i dla tego nie rozumiem o co kaman ^^

    Do rzeczy. rozdział "5.5 Wyświetlacz LCD (HD44780)"

    Kod:
    // 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)


    Jaki tego jest wynik ? W sensie co preprocesor podstawia zamiast tego wyżej ? To pewnie błahe ale całkiem pomieszało mi w głowie.
    Skąd to 'x' ? Jaka zawartość słowa 'PORT' ?

    Z góry dziękuje i pozdrawiam :)



    Góra
     Zobacz profil  
     
    PostNapisane: 23 gru 2011, o 17:50 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    No rzeczywiście, przede wszystkim to nie jest błahe i banalne więc rozumiem zawrót głowy. Bo i ja sam za każdym razem jak mam przypomnieć sobie jak to działa to muszę od początku świata sobie wszystko przypominać. No może poza samym faktem narodzin ;)

    jak to działa?

    Kod:
    #define PORT(x) SPORT(x)
    #define SPORT(x) (PORT##x)


    Zakładamy, że w kodzie programu napisaliśmy coś takiego:

    Kod:
    #define LED_PORT   D

    PORT( LED_PORT ) |= (1<<PD2);


    załóżmy że chcieliśmy wystawić stan wysoki na PD2

    zatem pierwsza definicja:

    Kod:
    #define PORT(x) SPORT(x)


    spowoduje, że preprocesor przygotuje wyrażenie do dalszego tłumaczenia, które będzie wyglądało tak:

    SPORT( D )

    zgadza się ? No bo parametrem x było #define LED_PORT D

    następnie preprocesor weźmie się dalej do roboty i widząc kolejną makrodefinicję

    Kod:
    #define SPORT(x) (PORT##x)


    podstawi w miejsce kodu słowo

    PORTD

    czyli wyjdzie cała linijka kodu tak, tzn zamiast:

    Kod:
    PORT( LED_PORT ) |= (1<<PD2);


    będzie

    Kod:
    PORTD |= (1<<PD2);


    Zgadza się ?

    Oczywiście ktoś mógłby zadać pytanie - ale zaraz hola hola, to po co takie podwójne makro skoro można byłoby niby prościej to napisać o tak np:

    Kod:
    #define PORT(x) (PORT##x)


    no nie ? ;)

    Ale niestety - jeśli byś tak zrobił to w miejscu kodu, preprocesor rozwinąłby to nieszczęśliwie tak:

    PORTLED_PORT |= (1<<PD2);

    teraz jaśniej troszkę ?

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
     
    PostNapisane: 23 gru 2011, o 18:04 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 15 gru 2011
    Posty: 110
    Lokalizacja: Dolnyśląsk
    Pomógł: 0

    I nastała jasność :) Świetnie wytłumaczone, prosto i jak dla laika.

    Dziękuje bardzo :) Teraz mogę ruszyć dalej ku nowym horyzontom ^^'



    Góra
     Zobacz profil  
     
    PostNapisane: 2 lip 2013, o 06:46 
    Offline
    Nowy

    Dołączył(a): 02 lip 2013
    Posty: 3
    Pomógł: 0

    Witam,
    ja jeszcze mam jednak wątpliwości. Rozumiem w takim razie, że fragment kodu:
    Kod:
    #define PORT(x) SPORT(x)
    powoduje podstawienie do fragmentu:
    Kod:
    ...PORT(x)...
    jako parametru całej wcześniejszej definicji:
    Kod:
    #define LED_PORT D
    w konsekwencji wycięcie z niej tylko końcowego oznaczenia portu, czyli w tym przypadku litery "D", a fragment:
    Kod:
    ...SPORT(x)...
    zwraca już SPORT(D), co jest dalej przekazywane do dalszej obróbki we fragmencie
    Kod:
    #define SPORT(x) (PORT##x)
    a tam zostaje "wyłuskane" samo literowe oznaczenie portu "D" i połączone operatorem ## z np. portem DDRX w wyniku czego uzyskujemy wyrażenie DDR(D).
    Czy dobrze to rozumiem ?



    Góra
     Zobacz profil  
     
    PostNapisane: 2 lip 2013, o 07:40 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Dobrze rozumiesz tylko w tym miejscu mała nieścisłość:

    pisiorek napisał(a):
    w konsekwencji wycięcie z niej tylko końcowego oznaczenia portu, czyli w tym przypadku litery "D", a fragment:


    nie nastąpi żadne wycięcie - tylko podstawienie argumentu definicji preprocesora czyli tej literki D

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
     
    PostNapisane: 2 lip 2013, o 08:59 
    Offline
    Nowy

    Dołączył(a): 02 lip 2013
    Posty: 3
    Pomógł: 0

    Dziękuję za szybką odpowiedź, jeszcze ostatnia wątpliwość. Odnośnie fragmentu z pierwszego Twojego postu wyjaśniającego problem, oraz oTwojej odpowiedzi na mój poprzedni post:
    Cytuj:
    Oczywiście ktoś mógłby zadać pytanie - ale zaraz hola hola, to po co takie podwójne makro skoro można byłoby niby prościej to napisać o tak np:

    Kod:
    #define PORT(x) (PORT##x)


    no nie ? ;)

    Ale niestety - jeśli byś tak zrobił to w miejscu kodu, preprocesor rozwinąłby to nieszczęśliwie tak:

    PORTLED_PORT |= (1<<PD2);
    a w odpowoiedzi na mój post :
    Cytuj:
    Dobrze rozumiesz tylko w tym miejscu mała nieścisłość:
    Cytuj:
    pisiorek napisał(a):
    w konsekwencji wycięcie z niej tylko końcowego oznaczenia portu, czyli w tym przypadku litery "D", a fragment:


    nie nastąpi żadne wycięcie - tylko podstawienie argumentu definicji preprocesora czyli tej literki D

    Skoro fragment kodu:
    Kod:
    (...)PORT(x)(...)
    radzi sobie z wyłuskaniem samego parametru "D", bo w SPORT(x) już zostaje SPORT(D), to teoretycznie zapis mógłby wyglądać tak:
    Kod:
    #define PORT(x) (PORT##x)
    dlaczego jednak nie można tego skrócić do takiej formy ? Czy to jest niedoskonałość preprocesora, czy jest jakiś inny powód ?



    Góra
     Zobacz profil  
     
    PostNapisane: 2 lip 2013, o 09:17 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Cytuj:
    dlaczego jednak nie można tego skrócić do takiej formy ? Czy to jest niedoskonałość preprocesora, czy jest jakiś inny powód ?


    w książce niebieskiej starałem się to opisać, tu na forum też niejednokrotnie - i zawsze też proszę - nie dopatrywać się niedoskonałości w kompilatorach itp ... gdy się samemu jeszcze nie do końca coś rozumie bo to prowadzi ZAWSZE na manowce :(

    ale ok powtórzę to po raz kolejny

    nie można od razu zrobić tak jak piszesz ponieważ po takiej operacji:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    otrzymałbyś w wyniku sklejenia nazwę

    Cytuj:
    PORTLED_PORT


    zamiast oczekiwanego PORTD, rozumiesz - sklejenie działa od razu na przekazany argument którym jest LED_PORT, preprocesor nie ma możliwości rozwinięcia nazwy LED_PORT do literki D, i dlatego potrzebny jest kolejny krok żeby argument LED_PORT został zamieniony przez samą literkę D, która dopiero zostanie doklejona

    teraz będzie jaśniej ?

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
     
    PostNapisane: 2 lip 2013, o 09:40 
    Offline
    Nowy

    Dołączył(a): 02 lip 2013
    Posty: 3
    Pomógł: 0

    OK, teraz wszystko jasne. Dziękuję i pozdrawiam



    Góra
     Zobacz profil  
     
    PostNapisane: 9 lis 2013, o 17:06 
    Offline
    Użytkownik

    Dołączył(a): 13 wrz 2013
    Posty: 173
    Lokalizacja: Birmingham, UK
    Pomógł: 0

    Dziś po długiej analizie wreszcie zrozumiałem jak działają te makra. Jak w książce napisane skracają definicji portów w pliku nagłówkowym, zamiast pełnej nazwy wstawia się samą literę; A, B, C, D itd....A potem makra uzupełniają do pełnej postaci.

    _________________
    sig off ;(



    Góra
     Zobacz profil  
     
    PostNapisane: 4 kwi 2014, o 13:41 
    Offline
    Nowy

    Dołączył(a): 06 mar 2014
    Posty: 7
    Pomógł: 0

    Proszę o wybaczenie, ale nie rozumiem kompletnie tego makra ułatwiającego dostęp do portów.Siedzę nad LCD i w zasadzię działanie rozumiem (noty+bluebook+przykłady) i jakoś ogólnie to łapie. Ale teraz się wgryzam dokładnie linijka po linijka. Mamy takie makro
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    to jest jasne nazwa makra SET_RS spowoduje ustawienie 1 na porcie LCD_RSPORT na miejscu LCD_RS bitu. wcześniej zdefiniowaliśmy w pliku nagłówkowym zarówno port A jak i który bit 0. i jest ok
    Ale przy tym makrze się rozkładam:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    definicję rozumiem ale skąd wiemy jakie jest x?? gdzie to jest przypisane? Oczywiście mam na myśli program wraz z biblioteką do LCD z płyty załączonej do BlueBook'a.

    Dziękuje za pomoc i pozdrawiam



    Góra
     Zobacz profil  
     
    PostNapisane: 4 kwi 2014, o 13:59 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 17 sie 2013
    Posty: 3797
    Lokalizacja: Grudziądz
    Pomógł: 143

    bo e programie piszesz np PORT 6 i ten x jest zamieniany na 6
    nie widze calego kodu i pisze z pamieci. ale zobacz na definicje portow lcd w pliku .h i bedzie wszystko jasne.

    Wysłane z telefonu

    _________________
    Usługi druku przestrzennego - www.drumik.pl



    Góra
     Zobacz profil  
     
    PostNapisane: 4 kwi 2014, o 14:07 
    Offline
    Użytkownik

    Dołączył(a): 25 sty 2014
    Posty: 185
    Lokalizacja: Działoszyn
    Zbananowany użytkownik

    Pomógł: 8

    wpisz do eclipsa

    napisz np PORT(C) i najedz myszka , jak sie pokaze "chmurka" to zjedz na nia myszka i strzaleczkami przesówaj w lewo lub w prawo bardzo ułatwia!



    Góra
     Zobacz profil  
     
    PostNapisane: 4 kwi 2014, o 14:42 
    Offline
    Nowy

    Dołączył(a): 06 mar 2014
    Posty: 7
    Pomógł: 0

    Przepraszam, ale tak mam, jak czegoś nie mogę zrozumieć tzn, że się zaciąłem.
    Takie mamy definicje w .h.
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    No dobra teraz już się zamotałem. Skoro w całym programie korzystamy z tych definicji czyli np LCD_D7PORT i LCD_D7. to po co nam te makra. Myślałem, że makra umożliwiają nam skrócenie czynności do minimum tak jak np w Visual Basic'u pod excela.
    :-), wiem, że załapie, Karolek a z tym wpisanie PORT(C) w eclipsie to nie za bardzo rozumiem, sorry :(



    Góra
     Zobacz profil  
     
    PostNapisane: 4 kwi 2014, o 14:43 

    Pomógł: 0

    Po to właśnie by nie trzeba pisać całej nazwy portu tylko A, i numer Pinu.



    Góra
      
     
    PostNapisane: 4 kwi 2014, o 15:31 
    Offline
    Nowy

    Dołączył(a): 06 mar 2014
    Posty: 7
    Pomógł: 0

    Karolku i wszystkim innym - już sobie poradziłem. Tylko jedno pytanie skąd kompilator wie, że raz za x ma podstawić literę a kiedy liczbę?
    Wynika to może z tego , że PORT i DDR to litery a PIN to liczby?
    Pozdrawiam i dziękuję za wyrozumiałość i pomoc



    Góra
     Zobacz profil  
     
    PostNapisane: 4 kwi 2014, o 17:16 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    rafmodel napisał(a):
    Tylko jedno pytanie skąd kompilator wie, że raz za x ma podstawić literę a kiedy liczbę?
    Wynika to może z tego , że PORT i DDR to litery a PIN to liczby?


    jeszcze raz proszę przeczytaj uważnie to:

    post975.html#p975

    i zobacz jak działają te makra

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
     
    PostNapisane: 6 sie 2015, o 21:36 
    Offline
    Użytkownik

    Dołączył(a): 18 cze 2015
    Posty: 31
    Pomógł: 0

    To ja muszę zadać pytanie. Proszę się trzymać.

    mirekk36 napisał(a):
    Oczywiście ktoś mógłby zadać pytanie - ale zaraz hola hola, to po co takie podwójne makro skoro można byłoby niby prościej to napisać o tak np:

    Kod:
    #define PORT(x) (PORT##x)


    no nie ? ;)

    Ale niestety - jeśli byś tak zrobił to w miejscu kodu, preprocesor rozwinąłby to nieszczęśliwie tak:

    PORTLED_PORT |= (1<<PD2);

    teraz jaśniej troszkę ?


    Dlaczego on by tak to rozwinął? Przecież

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    znaczy, że LED_PORT ma być podstawiane jako literka "D" w kodzie kompilowanego programu. Dlaczego kompilator przy sklejaniu bezpośrednio:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    chciałby pod 'x' podstawiać LED_PORT zamiast 'D'? LED_PORT znaczy przecież 'D' bo tak to wcześniej zdefiniowaliśmy, czy nie?

    Ja rozumiem, że to pytanie trochę o to dlaczego czerwone jest czerwone (co jak się okazuje nie jest takie jednoznaczne i oczywiste ale to temat na inną dyskusję :)). Zastanawia mnie jednak jak preprocesor interpretuje 'parametry', które podajemy mu w nawiasach i dlaczego przy makrze dwupoziomowym podstawi 'D' zamiast LED_PORT, a przy jednopoziomowym stanie na LED_PORT.



    Góra
     Zobacz profil  
     
    PostNapisane: 6 sie 2015, o 22:03 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Arni napisał(a):
    chciałby pod 'x' podstawiać LED_PORT zamiast 'D'? LED_PORT znaczy przecież 'D' bo tak to wcześniej zdefiniowaliśmy, czy nie?

    Nie ...

    eeeeh jeszcze raz ...

    sprawdź sobie bo można to sprawdzić nawet bez kompilacji w eclipse i bez wgrywania do procka.

    Zrób taką definicję:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    a później zrób tak

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    okaże się, że w związku z tym iż jest zdefiniowana STAŁA o nazwie MUCHA to ten fragment kodu będzie biały i da się skompilować - zgadza się

    a teraz zmień na górze definicję tak:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    zobaczysz że Eclipse zaznaczy na szaro to co znajduje się w warunku #ifdef - zgadza się ? zgadza no bo preprocesor nie widzi już nazwy MUCHA

    a teraz uważaj dokładnie, teraz zrób taką definicję na górze

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Jak myślisz - zanim to zrobisz - zadziała warunek czy nie ? heeee ... i tu cię mam - zobacz warunek zadziała

    jeśli tego nie wiedziałeś i nie rozumiesz to zapamiętaj sobie że DEFINICJA STAŁEJ PREPROCESORA liczy się tylko do pierwszej spacji - reszta jest pomijana - jeśli nie definiujemy WYRAŻENIA w tym miejscu ... a więc preprocesor widzi tylko stałą o nazwie MUCHA a nie MUCHA D - rozumiesz ?

    dlatego odpowiedziałem NIE na twoje powyższe pytanie

    teraz już to chyba zapamiętasz co ?

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
     
    PostNapisane: 6 sie 2015, o 22:54 
    Offline
    Użytkownik

    Dołączył(a): 18 cze 2015
    Posty: 31
    Pomógł: 0

    Hmmm...

    Nie o pamiętanie chodzi a o rozumienie i z tym mam cały czas problem.

    Skoro preprocesor ignoruje zapis po pierwszej spacji to po co jest tam to 'D'? Skąd on później wie, że do PORT ma dokleić D?


    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Cały czas myślałem, że powyższy zapis mówi preprocesorowi, że LED_PORT znaczy 'D'...

    Ja wiem, że to działa, ale chcę wiedzieć jak. Jeśli zrozumiem, to nie będę musiał pamiętać ;)



    Góra
     Zobacz profil  
     
    PostNapisane: 6 sie 2015, o 23:08 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    po to jest to D żeby właśnie przekazać do drugiego makra jako argument, dopiero na poziomie drugiego makra - preprocesor podstawi sobie D

    Na pierwszym poziomie

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    preprocesor zobaczy tylko nieszczęsny LED_PORT

    REASUMUJĄAC, gdy najpierw będzie tak:

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    to do makra SPORT zostanie przekazana nazwa stałej LED_PORT

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    a tutaj już sobie LED_PORT zamieni na D bo zobaczy, że stałej o nazwie LED_PORT przypisana jest wartość D

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
     
    PostNapisane: 6 sie 2015, o 23:20 
    Offline
    Użytkownik

    Dołączył(a): 18 cze 2015
    Posty: 31
    Pomógł: 0

    Czyli mogę rozwinąć to tak?
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Jeśli tak, to zaczynam to rozumieć. Jeśli nie, to stracę resztę włosów, która mi została na głowie.

    Może Pan polecić jakieś rzetelne źródło informacji (książka, artykuł) na temat działania preprocesora?



    Góra
     Zobacz profil  
     
    PostNapisane: 6 sie 2015, o 23:21 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    Arni napisał(a):
    Jeśli tak

    No DOKŁADNIE tak ;) ... dokładnie i nie inaczej ;) - widzisz w końcu zaskoczyłeś ;)

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
     
    PostNapisane: 14 sty 2017, o 19:40 
    Offline
    Nowy

    Dołączył(a): 07 lut 2016
    Posty: 13
    Pomógł: 0

    Głęboka cześć tym co czytają ...

    Właśnie przemęczam te makra upraszczające z BB-ka, strona 218-220. Opisuję przykład z książki.
    Lewą stronę rozumiem . ( Dla mnie te makra po prostu likwidują nawias przekształcając ciąg znaków PORT(X) w PORTX )

    W inicjacji DDR (LCD_D7PORT) |= ( 1<<LCD_D7):
    Makra + definicja : #define LCD_D7PORT C powodują, że zapis : DDR (LCD_D7PORT) przechodzi w DDRC

    OK. Ale co ze stroną prawą tej inicjacji ? skoro mamy port C i była definicja : #define LCD_D7 5
    to wychodzi mi |= (1<<5 ) a powinno być |= (1<<PC5)

    dlaczego 5 zamiast PC5 ?

    Chwała temu kto mi to wyjaśni, bo też nie daje mi to spokoju ...



    Góra
     Zobacz profil  
     
    PostNapisane: 14 sty 2017, o 21:12 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2015
    Posty: 1448
    Lokalizacja: okolice Warszawa
    Pomógł: 149

    witam,
    Sprawa prosta. PC5 to makro 5. (to jest to samo) :)

    ------------------------ [ Dodano po: 4 minutach ]

    Zauważ że wpisując PC5 zamiast PD5 lub odwrotnie, uzyskasz identyczne zachowanie programu.
    Będzie tylko mniej czytelny dla nas i Ciebie. PA5,PB5,PC5... to jest wartość 5.
    To samo dla PA0,PB0,PC0...to 0. :)



    Góra
     Zobacz profil  
     
    PostNapisane: 14 sty 2017, o 21:26 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 11 sty 2013
    Posty: 1760
    Pomógł: 196

    Witam
    Daro69 napisał(a):
    Sprawa prosta. PC5 to makro 5. (to jest to samo)

    bo:
    iom8.h napisał(a):
    /* PORTC */
    #define PC6 6
    #define PC5 5
    #define PC4 4
    #define PC3 3
    #define PC2 2
    #define PC1 1
    #define PC0 0


    Pozdr.



    Góra
     Zobacz profil  
     
    PostNapisane: 14 sty 2017, o 21:46 
    Offline
    Nowy

    Dołączył(a): 07 lut 2016
    Posty: 13
    Pomógł: 0

    Dzięki wielkie koledzy.

    Rozwinięcie iom8.h oświeciło mnie ! :)



    Góra
     Zobacz profil  
     
    PostNapisane: 4 lut 2018, o 12:36 
    Offline
    Nowy

    Dołączył(a): 27 gru 2016
    Posty: 18
    Pomógł: 0

    Przepraszam, że poruszam może przebrzmiały temat. Takie coś znalazłem, może to komuś coś rozjaśni.
    __CONCAT to jest makro które przyjmuje nie tylko tokeny jako argumenty, a tak wydaje mi się, mają makra bezpośrednio używające ## (Tak?)
    Jestem początkujący, z góry przepraszam za błędy.

    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



    Góra
     Zobacz profil  
     
    PostNapisane: 18 lut 2018, o 21:11 
    Offline
    Użytkownik

    Dołączył(a): 03 lut 2016
    Posty: 126
    Pomógł: 0

    Zainteresowałem się dwustopniowym makro bo doszedłem w BB do rozdziału o wyświetlaczu LCD. Przeczytałam rozdział już dwa razy teraz czytam trzeci bo nie ogarniam tego do końca. Przyznam szczerze że czytam też ten wątek na forum bo muszę to zrozumieć w końcu, nie całkiem rozumiem co tu piszecie więc zacząłem kombinować po swojemu. I tu mam prośbę, gdyby ktoś poświęcił mi chwilę przeczytał moje wypociny i skomentował ewentualnie poprawił moje rozumowanie to bardzo by mi pomógł. Mamy taki fragment kodu:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    Po napotkaniu w kodzie linijki
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    kompilator w miejsce LCD_RSPORT wstawi literę C.
    C jako argument zostanie przekazana do dyrektyw
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

    które jak dla mnie działają od końca.
    W linii
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
    najpierw C zostanie sklejone ze słowem PORT, otrzymamy PORTC. W tej samej linii SPORT(C) ostanie zastąpione słowem PORTC. Następnie przejdziemy linię wyżej i suma sumarum w tej linii otrzymamy słowo PORTC. A następnie PORTC zostanie wstawione miejscu gdzie kompilator napotkał PORT(LCD_RSPORT).



    Góra
     Zobacz profil  
     
    PostNapisane: 19 lut 2018, o 00:11 
    Offline
    Moderator
    Avatar użytkownika

    Dołączył(a): 03 paź 2011
    Posty: 27366
    Lokalizacja: Szczecin
    Pomógł: 1043

    ktoś by ci poświęcił pewnie czas ale gdybyś nie bawił się w archeologa i nie doklejał się do starych wątków - masz pytanie zakładaj nowy wątek. Nie wiem czy byś chciał wchodzić na forum na którym byś widział jeden GIGA WĄTEK i wszyscy by się do niego doklejali - jest sens ?

    forum jest po to aby zadawać pytania w nowych wątkach ...

    dlatego blokuję ten wątek

    _________________
    zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



    Góra
     Zobacz profil  
     
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Ten wątek jest zablokowany. Nie możesz w nim pisać ani edytować postów.  [ Posty: 29 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO