RTV forum PL | NewsGroups PL

Jak stworzyć złożoną definicję w AVRGCC z #define dla ALAMAKOTA?

definicje w AVRGCC

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Jak stworzyć złożoną definicję w AVRGCC z #define dla ALAMAKOTA?

Grzegorz Kurczyk
Guest

Wed Dec 24, 2008 1:08 pm   



Witam Kolegów.
Kombinuję coś takiego.
Mamy przykładowe definicje:

#define a ALA
#define b MA
#define c KOTA

Czy da się w wykombinować taką definicję na pod stawie a, b i c aby w
wyniku uzyskać ALAMAKOTA ?
oczywiście zabawa z podwójnym ## nie daje efektu bo późniejsza definicja
w stylu:
#define x a##b##c
da w wyniku abc

Tak kombinuję, kombinuję, ale powoli dochodzę do wniosku, że "to se ne da"

Pozdrawiam i życzę zdrowych i spokojnych Świąt Bożego Narodzenia
Grzegorz

kk
Guest

Wed Dec 24, 2008 1:42 pm   



Quote:
Mamy przykładowe definicje:

#define a ALA
#define b MA
#define c KOTA

Czy da się w wykombinować taką definicję na pod stawie a, b i c aby w
wyniku uzyskać ALAMAKOTA ?


To jest język C i nie ma tu znaczenia czy AVR gcc czy inny.
Musisz się zdecydować co to jest ALA, MA, KOTA.
Czy to są wcześniej zdefiniowane stałe, makra, czy np ciągi znaków.

Takie coś już zadziała :

#define a "ala "
#define b "ma "
#define c "kota"
#define d a b c

printf(d);

>> ala ma kota

Grzegorz Kurczyk
Guest

Wed Dec 24, 2008 9:59 pm   



Użytkownik kk napisał:
Quote:
To jest język C i nie ma tu znaczenia czy AVR gcc czy inny.

Oczywiście... z rozpędu w tytule wpisałem gcc

Quote:
Musisz się zdecydować co to jest ALA, MA, KOTA.
Czy to są wcześniej zdefiniowane stałe, makra, czy np ciągi znaków.

Takie coś już zadziała :

#define a "ala "
#define b "ma "
#define c "kota"
#define d a b c


Już piszę o co konkretnie mi chodzi. jest sobie w bibliotekach avrgcc
predefiniowane makro:

#define PORTB _SFR_IO8(0x05)

czyli jeśli w programie wpiszemy:
PORTB = 10;
to zostanie podstawione:
_SFR_IO8(0x05) = 10;

Późną nocą podczas podpierania powiek zapałkami Wink wymarzyło mi się coś
takiego aby "skleić" definicje:

#define NAZWA PORT
#define SYMBOL B
#define NOWYPORT NAZWA<magiczny operator>SYMBOL

i teraz problem czy jest taki <magiczny operator> coby:
NOWYPORT = 10;
dało w efekcie:
_SFR_IO8(0x05) = 10;

Niestety wydaje mi się, że to były tylko senne majaczenia przemęczonego
umysłu Wink ale może...

Pozdrawiam Świątecznie
Grzegorz

Marcin
Guest

Wed Dec 24, 2008 11:13 pm   



Grzegorz Kurczyk pisze:
Quote:
(...)

Chyba wiem co knujesz:).
Może nie jest to dokładnie to co byś chciał ale może pomoże:

#define NAZWA(x) (PORT##x)
#define NOWYPORT(x) NAZWA(x)

#define SYMBOL C

w kodzie musiałbyś wtedy operować:

NOWYPORT(SYMBOL)=10;

Z pozdrowieniami, MD.

Grzegorz Kurczyk
Guest

Thu Dec 25, 2008 12:44 am   



Użytkownik Marcin napisał:
Quote:
w kodzie musiałbyś wtedy operować:

NOWYPORT(SYMBOL)=10;


BINGO !!! Kurcze.... uparłem się aby była to elegancka pojedyncza
etykieta, ale w sumie tak też może być.

Dzięki serdeczne za pomysł :-)

P.S. Chodzi oczywiście o zmniejszenie upierdliwości definiowania
PORT,PIN,DDR dla każdej potrzebnej linii I/O. Kiedyś wykombinowałem
definicje w oparciu o adresy SFR, bo w starszych avr-ach były to kolejne
adresy, ale w np. ATmega128 nie jest już to regułą dla wszystkich portów.

Pozdrawiam
Grzegorz

Grzegorz Kurczyk
Guest

Thu Dec 25, 2008 12:51 am   



Użytkownik Grzegorz Kurczyk napisał:
Quote:
Użytkownik Marcin napisał:
w kodzie musiałbyś wtedy operować:

NOWYPORT(SYMBOL)=10;


BINGO !!! Kurcze.... uparłem się aby była to elegancka pojedyncza
etykieta, ale w sumie tak też może być.

P.S. Choć w sumie można dać następną definicję:

#define KUKURYKU NOWYPORT(SYMBOL)
i w kodzie:
KUKURYKU = 10;

Pozdrawiam i jeszcze raz dzięki za ulgę dla udręczonego umysłu Wink
Grzegorz

Grzegorz Kurczyk
Guest

Thu Dec 25, 2008 1:17 am   



No to definicje gotowe. Pewnie komuś się przyda.

#define _SKLEJ_(a,b) a##b
#define _PORT_(x) _SKLEJ_(PORT,x)
#define _PIN_(x) _SKLEJ_(PIN,x)
#define _DDR_(x) _SKLEJ_(DDR,x)

w pliku nagłówkowym modułu wystarczą już tylko dwie definicje opisujące
jedną linię I/O

#define LED_PPD C // brama C
#define LED_BIT 1 // bit 1

#define KEY_PPD B // brama B
#define KEY_BIT 5 // bit 5

w kodzie programu mamy dostęp do rejestrów portu

void led(void) {
sbi(_DDR_(LED_PPD), LED_BIT); // ustaw jako wyjście
sbi(_PORT_(LED_PPD), LED_BIT); // LED ON
cbi(_PORT_(LED_PPD), LED_BIT); // LED OFF

cbi(_DDR_(KEY_PPD), KEY_BIT); // ustaw jako wejście
sbi(_PORT_(KEY_PPD), KEY_BIT); // włącz pullup
if(_PIN_(KEY_PPD) & (1<<KEY_BIT)) { // sprawdź stan wejścia
...
...
}
}

Pozdrawiam Świątecznie
Grzegorz

Adam Dybkowski
Guest

Thu Dec 25, 2008 1:30 am   



Grzegorz Kurczyk pisze:

Quote:
sbi(_DDR_(LED_PPD), LED_BIT); // ustaw jako wyjście
sbi(_PORT_(LED_PPD), LED_BIT); // LED ON
cbi(_PORT_(LED_PPD), LED_BIT); // LED OFF

UWAGA! Makra sbi i cbi są oznaczone w standardowych plikach nagłówkowych
najnowszego avr gcc jako "deprecated" czyli wycofane z użycia - nie
należy z nich korzystać, bo zostaną w przyszłych wersjach kompilatora
biblioteki avr-libc całkowicie usunięte:
http://www.nongnu.org/avr-libc/user-manual/group__deprecated__items.html

Według mnie wystarczająco czytelny jest kod w stylu:
LED_PORT |= (1 << LED_BIT);
LED_PORT &= ~(1 << LED_BIT);
o ile oczywiście wcześniej zdefiniuje się LED_PORT, LED_DDR i LED_BIT
(można też zrobić LED_MASK zamiast 1<<LED_BIT), może być z
wykorzystaniem wcześniej podanych makr _DDR_ i _PORT_.

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Grzegorz Kurczyk
Guest

Thu Dec 25, 2008 11:27 am   



Użytkownik Adam Dybkowski napisał:
Quote:
Grzegorz Kurczyk pisze:

sbi(_DDR_(LED_PPD), LED_BIT); // ustaw jako wyjście
sbi(_PORT_(LED_PPD), LED_BIT); // LED ON
cbi(_PORT_(LED_PPD), LED_BIT); // LED OFF

UWAGA! Makra sbi i cbi są oznaczone w standardowych plikach nagłówkowych
najnowszego avr gcc jako "deprecated" czyli wycofane z użycia - nie
należy z nich korzystać, bo zostaną w przyszłych wersjach kompilatora
biblioteki avr-libc całkowicie usunięte:
http://www.nongnu.org/avr-libc/user-manual/group__deprecated__items.html

Wiemy, wiemy :-)

Quote:
Według mnie wystarczająco czytelny jest kod w stylu:
LED_PORT |= (1 << LED_BIT);
LED_PORT &= ~(1 << LED_BIT);


Eeee... Wink Mam juz zbyt silne przyzwyczajenia i jakoś sbi/cbi do
banglania bitami lepiej do mnie przemawia. Z tego też powodu pierwsze
linijki w mojej bibliotece, którą dołączam do każdego projektu to:

#define sbi(port, bit) port |= (1<<bit)
#define cbi(port, bit) port &= ~(1<<bit)

:-)

Ale jak to mówią... to rzecz gustu :-)

można sobie oczywiście dorobić:
#define LED_ON LED_PORT |= (1 << LED_BIT)
#define LED_OFF LED_PORT &= ~(1 << LED_BIT)

i wtedy to już mamy pełen luz blues cud malina :-)

Pozdrawiam
Grzegorz

Adam Dybkowski
Guest

Thu Dec 25, 2008 8:41 pm   



Grzegorz Kurczyk pisze:

Quote:
UWAGA! Makra sbi i cbi są oznaczone w standardowych plikach
nagłówkowych najnowszego avr gcc jako "deprecated"

Eeee... Wink Mam juz zbyt silne przyzwyczajenia i jakoś sbi/cbi do
banglania bitami lepiej do mnie przemawia. Z tego też powodu pierwsze
linijki w mojej bibliotece, którą dołączam do każdego projektu to:

#define sbi(port, bit) port |= (1<<bit)
#define cbi(port, bit) port &= ~(1<<bit)

Sugeruję jeszcze dodanie nawiasów okalających port oraz bit. Bo jeżeli
na przykład zadeklarujesz LED_BIT jako BUZZER_BIT + 1 - to wynik
działania sbi(PORTA,LED_BIT) będzie conajmniej niepokojący.

Tak więc lepiej zrobić coś w tym rodzaju:
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))

A z drugiej strony jednak warto pamiętać o nawiasach także w definicjach
"pierwotnych", tzn.:
#define BUZZER_BIT 0
#define LED_BIT (BUZZER_BIT + 1)

Quote:
można sobie oczywiście dorobić:
#define LED_ON LED_PORT |= (1 << LED_BIT)
#define LED_OFF LED_PORT &= ~(1 << LED_BIT)

i wtedy to już mamy pełen luz blues cud malina Smile

Oczywiście - to najwygodniejsze rozwiązanie i sam stosuję.

--
Adam Dybkowski
http://dybkowski.net/

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Grzegorz Kurczyk
Guest

Thu Dec 25, 2008 9:55 pm   



Użytkownik Adam Dybkowski napisał:
Quote:

Sugeruję jeszcze dodanie nawiasów okalających port oraz bit. Bo jeżeli
na przykład zadeklarujesz LED_BIT jako BUZZER_BIT + 1 - to wynik
działania sbi(PORTA,LED_BIT) będzie conajmniej niepokojący.

Tak więc lepiej zrobić coś w tym rodzaju:
#define sbi(port, bit) (port) |= (1 << (bit))
#define cbi(port, bit) (port) &= ~(1 << (bit))

A z drugiej strony jednak warto pamiętać o nawiasach także w definicjach
"pierwotnych", tzn.:
#define BUZZER_BIT 0
#define LED_BIT (BUZZER_BIT + 1)


Co prawda nigdy nie miałem potrzeby takiej deklaracji z +1 dotyczącej
numeru bitu w porcie, więc w tym przypadku nawiasy nie są mi potrzebne,
ale ma oczywiście Kolega rację. Sam kiedyś się przejechałem na braku
nawiasów w definicji i faktycznie czasem lepiej jest dać ich za dużo niż
o jeden za mało :-)

Pozdrawiam
Grzegorz

T.M.F.
Guest

Fri Dec 26, 2008 9:49 am   



Quote:
Co prawda nigdy nie miałem potrzeby takiej deklaracji z +1 dotyczącej
numeru bitu w porcie, więc w tym przypadku nawiasy nie są mi potrzebne,
ale ma oczywiście Kolega rację. Sam kiedyś się przejechałem na braku
nawiasów w definicji i faktycznie czasem lepiej jest dać ich za dużo niż
o jeden za mało Smile

Szczegolnie jesli to jest o *jeden* za malo :)

--
Inteligentny dom - http://idom.wizzard.one.pl
Teraz takze forum dyskusyjne
Zobacz, wyslij uwagi, dolacz do projektu.

Grzegorz Kurczyk
Guest

Fri Dec 26, 2008 10:16 am   



Użytkownik T.M.F. napisał:
Quote:
Co prawda nigdy nie miałem potrzeby takiej deklaracji z +1 dotyczącej
numeru bitu w porcie, więc w tym przypadku nawiasy nie są mi
potrzebne, ale ma oczywiście Kolega rację. Sam kiedyś się przejechałem
na braku nawiasów w definicji i faktycznie czasem lepiej jest dać ich
za dużo niż o jeden za mało :-)

Szczegolnie jesli to jest o *jeden* za malo :)


Eeee... no musiał się przyczepić Wink chodziło mi oczywiście parę
nawiasów (otwierający i zamykający). "Jeden" nawias to nie problem
bo w czasie kompilacji zaraz to wylezie Smile Znacznie bardziej upierdliwe
są przypadki, o których pisał Kolega Adam. Kompilacja przebiegła
pomyślnie i to nawet bez "warningów", a program robi głupoty...

Pozdrawiam
Grzegorz

elektroda NewsGroups Forum Index - Elektronika Polska - Jak stworzyć złożoną definicję w AVRGCC z #define dla ALAMAKOTA?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map