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



Teraz jest 25 sty 2026, o 10:26


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
 Tytuł: Preprocesor
PostNapisane: 12 lip 2014, o 19:17 
Offline
Użytkownik

Dołączył(a): 28 mar 2014
Posty: 30
Pomógł: 3

Witam,
przy okazji zabawy z 1wire napisałem takie deklaracje
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i teraz pytanie, jak zrobić by przy zmianie portu nie musieć zmieniać jego nazwy w 4 miejscach, tylko zmieniając nazwę pinu (tu PA1) uzyskać automatyczna zmianę w POTRA, DDA i PINA.
Może nie jest to szczególnie istotne, ale dla mnie jest to mocno irytujące.
I przy okazji w jaki sposób można podejrzeć plik po preprocesorze?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 12 lip 2014, o 19:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 lip 2012
Posty: 238
Pomógł: 5

Ja dla procesorów STM sprawę rozciągłem w ten sposób

Tak wyglądaja definicje pinów od LEDów np

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


a wcześniej w inkludzie sobie rozpisałem tak

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


Trochę kaszanka, ale wystarczy przy pierwszych definicjach wskazać pin gdzie LEDa ma się podłączonego iii resztę preprocesor sobie poustawia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 12 lip 2014, o 19:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Wydaje mi się, że prostszym rozwiązaniem jest po prostu posłużenie się wskaźnikami:

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

Wystarczy zmienić jedynie wartość PORT lub PIN w define. Oczywiście PA1 == 1, dlatego ten zapis można uprościć jedynie do numeru pinu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 13 lip 2014, o 07:28 
Offline
Użytkownik

Dołączył(a): 13 maja 2014
Posty: 135
Pomógł: 11

Witam

Spójrz tutaj:
http://mirekk36.blogspot.com/2011/12/jezyk-c-makra-upraszczajace-dostep-do.html

Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 13 lip 2014, o 09:13 
Offline
Użytkownik

Dołączył(a): 28 mar 2014
Posty: 30
Pomógł: 3

xbary napisał(a):
Ja dla procesorów STM sprawę rozciągłem w ten sposób

Analogicznie działa to dla Microchip'a, ale Microchip wspiera operacje na bitach, a AVR nie.
Poza tym to dział "Język C dla AVR".
atmel napisał(a):
Wydaje mi się, że prostszym rozwiązaniem jest po prostu posłużenie się wskaźnikami:

To nie rozwiązanie problemu tylko jego obejście. Chociaż pomysł niezły i będę musiał go popróbować.

Mi chodziło o to jak "wyłuskać" A z PA1 i dokleić potem do PORT. Jak dokleić to wiem - wykorzystując "stringifikację", czyli przekazanie napisu a nie wartości w poleceniu #define. Ale jak wyłuskać, tego nie wiem i tego pragnę się dowiedzieć.

Nadal nie wiem jak podejrzeć plik po preprocesorze, a byłoby to bardzo użyteczne przy testowaniu makr preprocesora.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 21 lip 2016, o 18:29 
Offline
Nowy

Dołączył(a): 19 paź 2015
Posty: 2
Pomógł: 0

Kolego Alef, czy udało Ci się rozwiązać ten problem? Stanąłem w tym samym miejscu i nijak nie mogę ruszyć dalej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 22 lip 2016, o 17:36 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 10
Zbananowany użytkownik

Pomógł: 0

Panowie zapraszam na www.starlino.com/port_macro.html i w sekcji AVR macie porządne makra obsługi pinów.Osobiście używam i sprawdzają się rewelacyjnie. A definiowanie połączeń typu w/w to porażka i męczarnia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 22 lip 2016, o 18:09 
Offline
Użytkownik
Avatar użytkownika

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

fizyk_xyz napisał(a):
... A definiowanie połączeń typu w/w to porażka i męczarnia.

Nie za mocne? ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 22 lip 2016, o 18:36 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 10
Zbananowany użytkownik

Pomógł: 0

kicajek napisał(a):
fizyk_xyz napisał(a):
... A definiowanie połączeń typu w/w to porażka i męczarnia.

Nie za mocne? ;)


Mam lepsze - definicję pinów w tablicach, to dopiero odjazd, potrzebowałem wymyśleć coś do sterowania wieloma Hd44780 na jednym uC. Niestety obecnie nie mam jak wkleić źródeł, bo jestem hospitalizowany i kompakty zostawiłem w domu. Jakby kogoś interesowało to mogę opisać algorytm.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 22 lip 2016, o 19:37 
Offline
Nowy

Dołączył(a): 19 paź 2015
Posty: 2
Pomógł: 0

Każda propozycja będzie ciekawa. Zawsze to krok do przodu, nawet jeżeli nie byłoby to kompletne rozwiązanie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 22 lip 2016, o 20:13 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 10
Zbananowany użytkownik

Pomógł: 0

No to lecimy, z tym że będę pisał na raty, bo ciężko u mnie z netem teraz no i maże że smartfona.

1) tworzymy sobie tablicę referencji na porty poprzez ich adresy, coś na kształt:
uint16_t *porty {&PORTA, &PORTB, &PORTC, &PORTD};
#define PA 0
.....
#define PD 3

w programie swoim piny będziemy definiować jako:
#define LED PC,5
(Niestety celowo unikam definicji portów jako pojedyncze nlitery like this:#define C 3, co umożliwiłoby całkowitą zgodność z metodą przedstawioną powyżej, czyli:
#define LED C,2 . Po prostu nie chciałbym "zakręcić preprocesora ani kompilatora", może podołali by albo i nie.

------------------------ [ Dodano po: 20 minutach ]

2) Mając świadomość że rejestry PORT,DDR i PIN występują po sobie z offsetem 1 (przynajmniej większość popularnych-można podejrzeć w plikach ioxxx.h) definiujemy makra dostępu do nich. Obecnie musiałbym jak wy pobuszować po sieci, bo nie pamiętam, podpowiedzią będzie makro avr gcc _SFR_BYTE. Będzie to coś na kształt:
#define PORT(x) _SFR_BYTExxx(x)
#define DDR(x) _SFR_BYTExxx(x+1)
#define PIN(x) _SFR_BYTExxx(x+2)

gdzie x adres wymaganego portu, podawany jako:
DDR(porty(PA))

------------------------ [ Dodano po: 26 minutach ]

3) Tworzymy na podstawie poprzedniego rozwiązania makra dostępu do pinów Atmegi zastępując odwołania DDR,PORT,PIN stworzonymi makrami w punkcie 2.

------------------------ [ Dodano po: 39 minutach ]

4) "OPTYMALIZATOR RAM". Jak słusznie ktoś już z Was wywnioskował to podejście idealnie nadaje się do operowania w tablicy pinami.Użyteczności wiele:wyświetlacze na magistrali równoległej, multiLCD library, o czym wcześniej wspominałem, czy choćby miganie diodami na wszystkich pinach procka w JEDNEJ pętli like Arduino. Ale tablica:
uint8_t diody{{PA,0},{PA,3}, {PD,7},{PB,2}};
(tu można tak ją definiować bo wszystkie PORTY są liczbami} niepotrzebnie traci RAM.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 22 lip 2016, o 21:20 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 10
Zbananowany użytkownik

Pomógł: 0

4a) Obracamy się w 8bitowcach póki co (ale ten trik można dopasować do 16,32 i 64 bitowej architektury), czyli do zapisu pinów 0-7 wykorzystujemy 3 bity, a pozostałe 5 z oktetu możemy wykorzystać do oznaczenia portu! Nie wiem, czy jakaś AVR'ka ma 32, bo to byłby PORTZF (zapisem EXCEL'a - 26 liter + 6 w kolejnym rzędzie).Zatem przekujmy słowa w czyny i tworzymy odpowiednie...tak makra(ja w ogóle uwielbiam makra bo są lepsze w pewnych warunkach od funkcji, a zawsze oszczędzają RAM i stos kosztem FLASH, którego i tak jest najwięcej.Ale z makrami trzeba uważać BB i GB Mirka Pana. If'ów też unikam na rzecz odpowiednich działań matematycznych, ale to już rozprawka na inny czas.)Ale do rzeczy:
#define PORTPIN2OKTET(port,pin) ((port)<<3)|((pin)&7)
#define OKTET2PORT(oktet) ((oktet)>>3)
#define OKTET2PIN(oktet) ((oktet)&7)

i teraz elegancko:

uint8_t diody {PORTPIN2OKTET(PA,3),PORTPIN2OKTET(PA,3)...}

a wywołujemy:

PORT(OCTET2PORT(diody[idx]))|=(1<<OCTET2PIN(diody[idx]))

------------------------ [ Dodano po: 8 minutach ]

Ot i cała filozofia. Mi to trochę zajęło: przejrzałem że 3 internety, całą dokumentację avrgcc, obejrzałem wszystkie filmy Mentora, nawet zacząłem czytać BB ze zrozumieniem, i poruszyłem parę szarych komórek , bo tylko tyle mam :{

------------------------ [ Dodano po: 15 minutach ]

5) APPENDIX. Przytoczone linijki kodu nie są dla kompilatora i mogą zawierać błędy syntetyczne! Jest to raczej forma pseudokodu avr gcc pisana z pamięci, aby naprowadzić osoby mające jakieś pojęcie o sztuce programowania uC. Gotowe kody mogę udostępnić nowicjuszem i tym co mają high end skill też oczywiście jak się wykuruję i dotrę do swego workspace w ECLIPSE.O ile będzie zainteresowanie...

------------------------ [ Dodano po: 21 minutach ]

A i pragnąłbym jeszcze poprosić znawców o nie stosowanie niestosowne krytyki. Bo jeżeli ktoś potrzebuje na forum pomocy to się pomaga. Niestety wielokrotnie zauważam przepychankę o jedynie słuszną rację, ale pomocy z nikąd.ZASADĄ JEST:Umiesz lepiej, pokaż, może inni też chcieliby się nauczyć. To tyczy się też moderatorów szanownego forum...

------------------------ [ Dodano po: 24 minutach ]

A JEŻELI JUŻ KRYTYKA, TO TAKA ABY DAĆ KONKRETNĄ I POSZUKIWANĄ ODPOWIEDŹ! Czyli na wysokim poziomie MERYTORYCZNYM. Dobranoc Państwu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 23 lip 2016, o 06:52 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 10
Zbananowany użytkownik

Pomógł: 0

Witam, tak przed śniadaniem dla zaostrzenia apetytu definicje z pkt.2 powinny wyglądać tak:

#define PORT(x) _SFR_IO8(_SFR_IO_ADDR(x))
#define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1)
#define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2)

------------------------ [ Dodano po: 13 minutach ]

Pamiętajcie oczywiście o potrzebie podwójnego definiowanie makr zgodnie z zaleceniami z BB ! Czyli zróbcie sobie np. tak:

#define _PORT(x) ................
#define PORT(x) _PORT(x)

dlaczego? Odsyłam do książki...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 23 lip 2016, o 12:49 
Offline
Użytkownik

Dołączył(a): 04 paź 2011
Posty: 8629
Pomógł: 338

fizyk_xyz napisał(a):
A i pragnąłbym jeszcze poprosić znawców o nie stosowanie niestosowne krytyki. Bo jeżeli ktoś potrzebuje na forum pomocy to się pomaga. Niestety wielokrotnie zauważam przepychankę o jedynie słuszną rację, ale pomocy z nikąd.ZASADĄ JEST:Umiesz lepiej, pokaż, może inni też chcieliby się nauczyć. To tyczy się też moderatorów szanownego forum...


Myslę że "niestosowną krytykę" zastosował w tym temacie kolega

ale w tym momencie ja piszę w innej sprawie ...
mianowicie jak kolega zakończy wywód ... to proszę mnie poinformować na piśmie (via PW)
nieco uporządkuję by łatwiej kolegom chcącym się nauczyć czegoś nowego się czytało

I niniejszym przepraszam że się wcinam ...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
 Tytuł: Re: Preprocesor
PostNapisane: 1 sie 2016, o 09:29 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 10
Zbananowany użytkownik

Pomógł: 0

I oto gotowy efekt, jakby ktoś chciał, można używać do woli...

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


------------------------ [ Dodano po: 15 minutach ]

Poniższy filmik przedstawia efekt (niestety emulator i kodowanie zrobiły swoje i płynność nie odpowiada rzeczywistemu sprzętowi):



To tak trochę z nostalgii w oczekiwaniu na YELLOW BOOK'a (kto zgadł nawiązanie zółtymi ledami?) i filmików Pana Mirka, pozdrawiamy i życzymy duuuuuuuuuuuuuuuuuuuuuuużo siły :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO