logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega16] - wyswietlanie wartości na wyświetlaczu zgodnym z ST7565r

Pff 17 Sie 2016 22:45 1008 4
REKLAMA
  • #1 15875028
    Pff
    Poziom 10  
    Witam ,

    Szukam pomocy przy wywołaniu funkcji wypisującej tekst na w/w wyświetlaczu .
    Niestety mam problem z makrem _memx . Jak się do takiego argumentu odnieść?


    Funkcja z której korzystam to :

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    A więc definiuje bufor oraz przeprowadzam konwersję
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Niestety na ekranie pokazuje się "sieczka" .

    Lecz gdy zrobię tak :
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zostanie poprawnie wyświetlone.
    Jak mogę wyświetlić bufor?
    Pozdrawiam .
  • REKLAMA
  • #2 15875119
    JacekCz
    Poziom 42  
    Na mój nos __memx char *tekst preferuje adresy z pamięci programu (flasha), gdy z przestrzeni danych (ram) wskaźnik (tutaj 24 bit!!!!) musiałby być specjalnie spreparowany.

    Ponieważ malloc daje wskaźnik jak standard kazał, bez żadnych tricków itd.... są krzaki

    Jeden ze skutków, że język C nie bardzo pasuje do architektur 'harward' a w dialekcie avr-gcc został do tego lekko zgwałcony.

    __memx
    This is a 24-bit address space that linearizes flash and RAM: If the high bit of the address is set, data is read from RAM using the lower two bytes as RAM address. If the high bit of the address is clear, data is read from flash with RAMPZ set according to the high byte of the address.
  • REKLAMA
  • #3 15875367
    Pff
    Poziom 10  
    P. Jacku czy możliwe jest utworzenie takiej zmiennej w avr gcc? Mógłby Pan nakierować w którą stronę ruszyć . Pozdrawiam .
  • REKLAMA
  • Pomocny post
    #4 15875391
    JacekCz
    Poziom 42  
    W moim odczuciu funkcja biblioteczna jest nieadekwatnie zaplanowana. Wypowiadam się o tyle, że nie rozumiem "co poeta miał na myśli". Wg mnie funkcja biblioteczna powinna miec cechy uniwersalności, a klient (kod wywołujący) ma dostosować się w razie niestandardowego użycia. Może być, że autor tego kodu ma rację (wydajność w/s ram), ale to w szerszym oglądzie by trzeba.

    a) Więc w mojej idei "klasycznego C" argument bez tego __memx, bufor zadziała, a wywołanie dla stałej by trzeba skopiować z flasha do ram. Pociąga to niewielkie koszty w chwilowym ram.

    b) Lub nie zmieniać i dogrzebać się w dokumentacji jak typowo się dostosowuje wskaźnik 16bit do konwencji __memx 24bit
    https://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html
    (pierwsza pozycja z googla, może są lepsze) Pewnie jakies gotowe makro siostrzane do PSTR

    Jestem poza komputerem developerskim, nie pomogę więcej.

    EDIT. prorok czy ki ciort ;) Chyba dokładnie PSTR (wyczytane, nie sprawdzone). Czyli wariant b)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 15875421
    Pff
    Poziom 10  
    Wszystko zadziałało , ja jak głupi próbowałem wskaźniki zmienić . Dzięki wielkie za pomoc .
REKLAMA