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



Teraz jest 4 kwi 2026, o 07:50


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 18 paź 2015, o 17:16 
Offline
Nowy

Dołączył(a): 24 wrz 2015
Posty: 14
Lokalizacja: Oława
Pomógł: 3

Witam. To mój pierwszy post, więc na początku pozdrawiam wszystkich forumowiczów i stałych bywalców.

Mam mały dylemat, który nie daje mi spać po nocach. Otóż od pewnego czasu programuję ATMega328P w Eclipse w języku C. Pod młotek biorę bibliotekę LCD 4-bit na 7 pinach. Każdy pin ma zdefiniowany na stałe port i numer pinu w pliku nagłówkowym. Te stałe są używane w funkcjach biblioteki. Kod wynikowy jest bardzo efektywny. Kompilator używa tylko rozkazów do modyfikowania bitów sbi, cbi, in, out. Pytanie: Jak w C zrobić bibliotekę dla wielu LCD tego samego typu tak, aby nie powielać kodu oraz aby kod wynikowy był nadal efektywny jak wcześniej (tzn. jego rozmiar był mały)? Po chłopsku mówiąc jak zastąpić stałe portu i pinu na zmienne?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2015, o 17:43 
Offline
Użytkownik

Dołączył(a): 11 wrz 2013
Posty: 709
Zbananowany użytkownik

Pomógł: 23

Nie bardzo rozumiem o co Ci "biega".
Przecież jak masz definicje w pliku *.h to zmieniając fizycznie piny tylko w tym jednym miejscu zmieniasz definicje - bardzo ślicznie i logicznie :).
Po co Ci zmienne?
Będziesz w czasie pracy urządzenia zmieniał "pinologię" LCD?

Nadal nie mogę zrozumieć "o co kaman"?

--
Grzegorz...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2015, o 17:47 
Offline
Moderator
Avatar użytkownika

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

Takich ale i mnóstwa innych rzeczy uczy właśnie ta książka:
http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

i jest tam właśnie przedstawiony sposób jak można podchodzić do takiego pisania bibliotek .... warto się z nią zapoznać ....

Bo pytania na końcu to zadałeś TAK ogólne ... a pewnie odpowiedzi się spodziewasz w jednym zdaniu, która będzie czarodziejskim tajnym przepisem. Nie ma tajnych przepisów i nie ma jednego cudownego sposobu na wszystko. Bo wszystko zależy od podejścia i od programisty ...

poza tym:

korpikn napisał(a):
Pytanie: Jak w C zrobić bibliotekę dla wielu LCD tego samego typu tak, aby nie powielać kodu oraz aby kod wynikowy był nadal efektywny jak wcześniej (tzn. jego rozmiar był mały)? Po chłopsku mówiąc jak zastąpić stałe portu i pinu na zmienne?

Jedno pytanie nie ma NIC wspólnego z drugim.

Poza tym, żeby coś konkretnie podpowiedzieć to jeszcze warto byłoby przynajmniej odnieść się do jakiegoś swojego przynajmniej fragmentu kodu - a nie takie raczej beletrystyczne opisy .... Gdy jest kod i do niego konkretne pytanie - wtedy można czasem coś pomóc.

_________________
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  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2015, o 17:54 
Offline
Użytkownik
Avatar użytkownika

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

Witam
Grzegorz... napisał(a):
Nie bardzo rozumiem o co Ci "biega".

Ja szczerze mówiąc też, ale mam taki projekcik który w zasadzie działa na trzech różnych rodzajach podłączeń do płytki wyświetlacza ( co prawda 7_led ale w zasadzie o to samo biega) i musiałem w pliku konfiguracyjnym dać kompilacje warunkowe i w zależności od płytki wpisuję jedną cyferkę.
U mnie była to konieczność: 1.płytka testowa 2.projektI 3.projekt z tańszymi wyświetlaczami.
Tyle że mam stały PORT a różnie podłączone poszcz. segmenty.

Pozdr.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2015, o 18:28 
Offline
Nowy

Dołączył(a): 24 wrz 2015
Posty: 14
Lokalizacja: Oława
Pomógł: 3

Przedstawię problem dokładniej.
W pliku lcd.h są definicje portów i numerów pinów, które lcd używa w bibliotece.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

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

która kompiluje się do postaci zajmującej tylko 2 bajty w pamięci programu:
Składnia: [ Pobierz ] [ Ukryj ]
język asm
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Problem jest taki, że chciałbym zastosować dwa oddzielne LCD podłączone do jednego mikrosterownika. I tutaj zrodził się problem z którym nie moge sobie poradzić. Bo najprościej byłoby kopiować całą bibliotekę (pliki lcd.h i lcd.c na lcd2.h i lcd2.c), a następnie zmienić definicje portów i pinów. Ale powoduje to kolejne problemy do rozwiązania. W języku C nie można przeładowywać funkcji, więc należałoby zmienić również nazwy wszystkich funkcji w bibliotece drugiego lcd. Rozmiar kodu robiącego prawie to samo, zwiększyłby się dwukrotnie, co uważam za bezsens. Więc jak to zrobić? Podsumowując chciałbym mieć dodatkowy plik nagłówkowy dla każdego lcd, w którym byłyby zdefiniowane porty i piny, ale kod funkcji był jednokrotnie napisany. Coś w rodzaju:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


Więc jak to zrobić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2015, o 19:10 
Offline
Użytkownik

Dołączył(a): 26 lip 2015
Posty: 269
Pomógł: 34

Trzeba się chwile zastanowić i ja bym to zrobił tak jedna zmienna przechowującą pin a druga który port i tak dla każdego pinu lcd, a funkcje zmodyfikować tak aby korzystały z tych zmiennych np
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i tak dalej wystarczy tylko zmienić funkcje pierwszego rzędu trochę kodu niestety przyrośnie.Można też zrobić poprostu tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Niestety trzeba będzie powielić trochę programu ale to nic w porównanie z kopiowaniem 2 bibliotek.Chyba, że ktoś zna lepszy sposób od mojego pomysłu. :D
Na podobnej zasadzie można napisać funkcje która steruję pinem r/w i innymi. 8-) Podpowiem, że przy użyciu pętli można jeszcze zmniejszyć objętość programu. :lol:



Ostatnio edytowano 18 paź 2015, o 19:33 przez Bartek123, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2015, o 19:31 
Offline
Użytkownik

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

ja używam w takim wypadku I2C lub Moich SunUART_LCD
i problem z głowy ....

Pomyśl kolego podpinasz LCD na I2C do procka , masz różne adresy odwołania
a biblioteka jedna :) Przemyślcie to wszyscy po co wyważać drzwi lub wymyślać koło od nowa ??

kosztuje grosze .... a jakie mozliwości

Obrazek


Przykładowo ....

Obrazek

Zdjęcie z sieci ....


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2015, o 19:52 
Offline
Nowy

Dołączył(a): 24 wrz 2015
Posty: 14
Lokalizacja: Oława
Pomógł: 3

Wow! 8 wyświetlaczy w sieci. Robi wrażenie :). Muszę to przemysleć.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 paź 2015, o 20:25 
Offline
Użytkownik

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

Niema nad czym się zastanawiać musisz tylko sobie wybrać expander
PCF8574 czy MCP23017 i używać :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2015, o 12:00 
Offline
Nowy

Dołączył(a): 24 wrz 2015
Posty: 14
Lokalizacja: Oława
Pomógł: 3

Dziękuję wszystkim za pomoc. Pomysł z magistralą odpowiada mi najbardziej. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 paź 2015, o 17:28 
Offline
Użytkownik

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

korpikn napisał(a):
Dziękuję wszystkim za pomoc. Pomysł z magistralą odpowiada mi najbardziej. Pozdrawiam.


OD tego jest forum by sobie pomagać
nie mniej to najlepsze rozwiązanie w tym przypadku ... osobiście polecam moduły oparte o MCP23017



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: 11 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Baidu [Spider] 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