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



Teraz jest 29 mar 2024, o 00:15


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 56 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 26 kwi 2018, o 13:34 
Offline
Użytkownik

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

Witam wszystkich.

Ostatnio ćwiczyłem sobie wyświetlanie znaków na wyświetlaczu lcd 4x20. Zainspirowała mnie do tego biblioteka Mirka
do obsługi enkodera i wyświetlania tychże znaków. Postanowiłem sam trochę pokombinować z przyciskami i takie tam....
Na koniec napisałem króciutki programik, który sam wyświetla znaki co pół sekundy od znaku 33 do 126. Wszystko jest
fajnie, tylko po drodze jest sporo znaków, których nie używam, lub używam rzadko, a muszę się przewijać (np. przycisk)
przez ten gąszcz. Moje pytanie jest następujące, jak mogę pominąć te niechciane i mieć tylko podstawowe cyfry i litery.
Czy trzeba stworzyć jakąś tablicę z konkretnymi interesującymi mnie znakami i jakoś wczytywać, czy jest to jakoś
możliwe? Będę wdzięczny za podpowiedzi. Poniżej mój kod. Jeśli można coś w nim poprawić???


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  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2018, o 14:12 
Offline
Użytkownik
Avatar użytkownika

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

Witam,
Jeżeli dobrze rozumiem co chcesz uzyskać,
to powołałbym tablicę, a w niej w kolejnych pozycjach trzymał wybrane wartości planowane do wyświetlenia .
Np. w tab=[33,34,..]
Teraz tab[0]; zawiera 33'
tab[1]; zawiera 34 itd.
inkrementacja pozycji w tablicy powoduje odczytanie ustalonej wcześniej wartości.

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2018, o 20:44 
Offline
Użytkownik

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

Witaj Daro69.
Dzięki wielkie za chęć pomocy. Puki co , to mi nie wychodzi. Idę trochę na ślepo. Książki zostawiłem w pracy i czytam o tablicach z netu.
Pewnie coś źle robię. Zrobiłem coś takiego tylko dla przykładu i sprawdzenia

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


Próbuję wyświetlić z pod indeksu 0, czyli 60

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


Ale może nie wszystko zrozumiałem. Jutro poczytam i może zaskoczę, czego jeszcze nie wiem. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2018, o 20:57 
Offline
Moderator
Avatar użytkownika

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

Robert_1967 napisał(a):
lcd_int(tab[0]);

toż sama nazwa funkcji mówi, że nie wyświetlasz znaku ASCII tylko liczbę z tablicy o indeksie = 0

_________________
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: 26 kwi 2018, o 21:20 
Offline
Użytkownik

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

Witaj Mirku.
Dziękuję za wskazanie mi babola. To wszystko chyba ze zmęczenia. Przecież poprzedni kod napisałem dobrze. ale nie to jest największą
głupotą. Przyznam się, a co mi tam. Na płytce stykowej mam lcd 4x20, a tu w domu atb i 2x16 i wysyłałem poza ekran :oops: :oops: :oops: .
No niestety czasami nie mam umiaru i nie potrafię zrobić sobie przerwy. Dziękuję kolegom za pomoc. Teraz pojąłem.

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  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2018, o 21:29 
Offline
Użytkownik
Avatar użytkownika

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

tak sobie własnie czytam to co napisane w kodzie.
Nie wnikając w szczegóły takie jak np.
for_ (....poz < 126;... a wewnątrz w if'ie oczekiwanie na poz... > 126 ?
Pomysł: możesz omijać niepotrzebne znaki np. :;<=>?@ znajdujące się pomiędzy 9 a A.
przed wyswietleniem na ekranie sprawdzasz czy wartość jest poza interesującym Cię znakiem, jeżeli tak to "przeganiasz ją na następny" . dziwny - ale taki prosty pomysł.


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

i całość inkrementować lub dekrementować oraz wyświetlać i wartość znaku, jak i sam znak. zerknij do tablicy "czarów" :) , czym się różni wartość 0 od znaku '0' ;).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2018, o 21:54 
Offline
Użytkownik

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

Dzięki Daro69.
Każdy pomysł jest, jeśli mamy pożądany efekt :) . Warte przemyślenia. Nie wiem, czy zasugerowałeś jakiś błąd ?:

Nie wnikając w szczegóły takie jak np.
for_ (....poz < 126;... a wewnątrz w if'ie oczekiwanie na poz... > 126 ?

Nie wiem, jak cytować, edytować tekst...

Tak napisałem, bo wydawało mi się to logiczne, tzn. jeśli pozycja jest mniejsza od 126, to zwiększ ++ , ale kiedy przekroczy wartość 126,
to już nie zwiększaj, tylko podstaw, przypisz 33 i wyświetlaj od nowa od 33 do 126. Te liczby są oczywiście umowne.

Wiem, że od czasu do czasu męczę te wyświetlacze na forum, ale co jakiś czas zajmuję się czym innym i nieraz 3 miesiące nic z lcd nowego
nie robię. Teraz wymyśliłem sobie takie zadanie i z tond te posty. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2018, o 21:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

A nie prościej i czytelniej będzie tak bez bawienia w tablice?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


--
Pozdrawiam,
Robert


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 kwi 2018, o 23:03 
Offline
Użytkownik

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

Dziękuję rskup
Ale ciekawe rozwiązanie zademonstrowałeś :) . Takie to proste, jak się na to patrzy. A niedawno ćwiczyłem sobie menu na case i break.
I tu się kłania mała wyobraźnia początkujących :lol: . Przyznam, że z tablicami też mi się podoba, bo pomogło mi to zrozumieć na żywym
organizmie, jak z tymi tablicami jest. Inaczej jest przy czytaniu rozdziałów (wydaje się wszystko zrozumiałe, do puki nie odłoży się książki)
, a inaczej z przelaniem tej wiedzy na zestaw atb. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2018, o 16:35 
Offline
Użytkownik
Avatar użytkownika

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

Robert_1967 napisał(a):
Nie wiem, czy zasugerowałeś jakiś błąd ?:
Nie wnikając w...

zerknij, być może to tylko literówka przy przepisywaniu.
Robert_1967 napisał(a):
for(uint8_t pozycja_w_tabeli_asci = 33;         pozycja_w_tabeli_asci < 126;    pozycja_w_tabeli_asci++)
                {
                        if(pozycja_w_tabeli_asci >126)  pozycja_w_tabeli_asci = 33;
                        ....
                }

pętla for będzie obsługiwana tak długo, dopóki zmienna 'pozycja_w_tabeli' będzie mniejsza od 126. Tak ?
to teraz zerknij na ifa wewnątrz tego for'a. na jaką wartość zmiennej czekamy. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2018, o 20:28 
Offline
Użytkownik

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

Witaj Daro69
Dzięki za wytrwałość w wyprowadzaniu mnie z błędu. Istotnie jest byk. Źle interpretowałem zapis. znak z pod pozycji 126 nie wyświetlał się. Poprawiłem
na:

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


Teraz dogania do znaku z pod pozycji 126 i następnie wraca do 33. Jednak miałeś rację :roll: . Pomijam jeszcze fakt użycia _delay_ms(x), który
jak wiemy zatrzymuje pętlę, ale robiłem testy z timerem i wtedy było ok. Dodałem dwa przyciski dół góra i w trakcie, kiedy program sam inkrementował
znaki, to ja dodatkowo mogłem przeskakiwać po znakach przyciskami. Z delayem przyciski nie chciały działać.

A wracając do tablic, to pojedyncze znaki wyświetlam, ale kombinowałem z wyświetleniem większej ilości i mi nie szło. Pojedyncze wyświetlam tak:

Zaraz po inkludach, przed main

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


A potem w pętli:

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


Z tabeli pod indeksem 4 wyświetlam, ale jak tu zrobić na przykład przyciskiem po kolei z tablicy, albo z pętlą for, a żeby pobierało po kolei z tablicy
i wyświetlało, tak, jak poprzedni przykład, to nie doszedłem. Nie jest mi to aktualnie do niczego potrzebne, to tylko zabawa, ale też i nauka. Czuję
zawsze jakiś dyskomfort, jeśli zostawiam zadanie bez zakończenia. No ale nic. Trzeba iść dalej. A jeszcze ten kod, który napisał wcześniej inny nasz kolega:

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


Wcześniej jakoś nie spotkałem. Nie wiedziałem, że tak można z tymi kropkami zrobić zakres od do. Ciekawe. Pozdrawiam. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2018, o 21:12 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Robert_1967 napisał(a):
Wcześniej jakoś nie spotkałem. Nie wiedziałem, że tak można z tymi kropkami zrobić zakres od do.

Trzeba tylko pamiętać, że zakresy case nie są zawarte w standardzie języka C. Jest to dostępne jako rozszerzenie kompilatora GCC. Jest też akceptowane bodajże przez clang/LLVM, jednak nie wszystkie kompilatory taką technikę obsługują.

Oczywiście jeśli korzystamy tylko z kompilatora GCC, to jak najbardziej można, a nawet należy z tej możliwości korzystać ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2018, o 21:41 
Offline
Użytkownik
Avatar użytkownika

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

Robert_1967 napisał(a):
Z tabeli pod indeksem 4 wyświetlam, ale jak tu zrobić na przykład przyciskiem po kolei z tablicy, albo z pętlą for, a żeby pobierało po kolei z tablicy
i wyświetlało,

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

a czemu by nie podmienić '4' na zmienną 'nr_pozycji'.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

teraz można inkrementoeać i dekrementować dowolnie tę zmienną w pętli gł. zarówno z klawisza jak i innych zdarzeń .
Robert_1967 napisał(a):
Wcześniej jakoś nie spotkałem.

Nie jesteś przypadkiem odosobnionym. :roll: :D
ew. tak.
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  
cytowanie selektywne  Cytuj  
PostNapisane: 27 kwi 2018, o 21:45 
Offline
Użytkownik

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

Dzięki andrews
Taki kawałek kodu, a jak cieszy ;) . Pewnie, że skorzystam, jak zajdzie taka potrzeba. Jeszcze nie próbowałem, ale myślę, że w ten sposób mogę
wyznaczać jakieś inne zakresy, np poziomy na wejściu ADC, czy coś w tym stylu ?. Sprawdzę przy okazji. Pozdrawiam.

------------------------ [ Dodano po: 7 minutach ]

Dzięki Daro69
Chyba rozumiem ideę. Wielkie dzięki. Dzisiaj sobie już chyba odpuszczę, bo jestem padnięty. Pierwsze koszenie w tym roku, a mam trochę trawy i
metrów. Poza tym ostatnio dużo przesiedziałem przy C i mam mętlik w głowie. Jutro wieczorkiem popiszę i sprawdzę. Pozdrawiam wszystkich zakręconych w C :lol:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2018, o 08:48 
Offline
Użytkownik

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

Witam po małej przerwie.
Sorki, że temat na jakiś czas odpuściłem, ale zaczął się długi weekend i remont domu,a wiec nie było czasu. Dzisiaj usiadłem i
przemyślałem pomysł Daro69. napisałem i działa tak, jak tego chciałem. Wygląda to następująco:

Utworzyłem tablicę:

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


powołałem zmienną uint8_t pozycja_do_edycji; i zastosowałem pętlę for:

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


Dodatkowo wyświetlam wartość HEX poszczególnych znaków. Może ktoś powiedzieć, że robię pracę dyplomową z
tak prostego zagadnienia, ale tu o zrozumienie prostych mechanizmów chodzi, a z tym miałem problem. Już od dawna
obsługiwałem wyświetlanie na lcd, ale tak na prawdę nie rozumiałem w pełni, o co kaman, a bazowanie na czyichś kodach
ma krótkie nogi, co niejednokrotnie doświadczeni koledzy pisali...Dzięki kolegom za pomoc. Można pewnie jeszcze inaczej,
ale już odpuszczam, bo inne tematy trzeba ćwiczyć :D .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2018, o 11:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Tak tylko abyś wiedział, bo może kiedyś będziesz chciał użyć jakiego małego avr-ka
Robert_1967 napisał(a):
Utworzyłem tablicę:
Tylko taka metoda jest bardzo pamięciożerna, bo tablica trzymana jest w RAMie. A we flashu jest procedura załadowania tych wartości do RAMu.
Jak koniecznie chcesz mieć dane w tablicy to umieść tablicę we flashu.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2018, o 12:28 
Offline
Użytkownik

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

Witam kolegę i dzięki za zaglądanie do mojego tematu.
Oczywiście masz absolutną rację, ale jak napisałem wcześniej, to traktowałem ten temat czysto eksperymentalnie i do nauki.
Gdybym dzisiaj potrzebował coś zrobić, to w 100% zastosowałbym Twoje rozwiązanie, ponieważ jest proste, przejrzyste i łatwe
do zrozumienia. Jeśli potrzebuję stałych tekstów, to zawsze ładuję do flasha. Patrząc po datach moich postów już trochę się
interesuję C, ale szedłem zawsze na skróty i wiedziałem, że jak wstawię taki oto fragment kodu, to ma mi to działać. Ewentualna
mała adaptacja do moich potrzeb, ale w końcu dotarło do mnie, że tak się nie da. Czytam BB i GB, ale ciężko ze zrozumieniem.
Nie mówię tu, że książki są źle napisane, tylko może akurat ta dziedzina przyswaja mi się wolniej, a jestem niecierpliwy. W związku
z powyższym wracam co jakiś czas do początku i wałkuję temat. Z perspektywy czasu widzę to wszystko trochę jaśniej i coraz
częściej załapuję, czego wcześniej nie mogłem.
Tu bardziej zależało mi na zrozumieniu pewnych niedociągnięć z tablicami, dla tego tak się ich trzymałem. Dodatkowo lepiej zrozumiałem
pętlę for i tworzenie zmiennej lokalnej no i przy okazji wyszło, że przy wyświetlaniu znaku mogę użyć np. cyfry lub hex.
Oczywiście w książkach to jest, ale się nie wczytywałem dokładnie i teraz muszę nadrabiać...Najważniejsze, że jest jakiś postęp
samodzielności :roll: :lol: . Pozdrawiam. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2018, o 15:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Robert_1967 napisał(a):
Najważniejsze, że jest jakiś postęp samodzielności :roll: :lol:
Z tą zajętością RAMu to jak napisałem
Cytuj:
Tak tylko abyś wiedział
jest to informacyjnie. Ale, tak jak piszesz - ucząc się, warto zrobić sobie test patrząc ile zajmuje pamięci RAM/flash projekt z tablica w RAM a ile jak dasz ją do flasha.

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2018, o 16:22 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2561
Pomógł: 126

A do porównywania zajętości to polecam użyć EclipseGadget lub MkClipse’a.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 maja 2018, o 18:38 
Offline
Użytkownik

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

Dziękuję kolegom.
Jutro napiszę z tablicą we flash i porównam. Jednym słowem zastosuję się do wskazówek i dam znać o efektach. Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2018, o 07:22 
Offline
Użytkownik

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

Witam ponownie.
A więc przerobiłem tablicę do flasha i zajętość pamięci wygląda następująco:

Tablica w RAM:

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



Obrazek

Tablica FLASH:

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


Obrazek

Oczywiście kompiluję tylko z jedna tablicą. Niestety nie mogę tego poprawnie wyświetlić. Przy tablicach typu:

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


wyświetlam 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 w tym przypadku powiem szczerze, że próbuję na różne sposoby i nie idzie. Jak ja lubię utrudniać sobie życie :cry: .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2018, o 11:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

Zajrzyj do biblioteki i zobacz czym się różni funkcja lcd_str_P() od lcd_str().
I na tej postawie dodaj sobie funkcję lcd_char_P() z funkcji lcd_char(), lub po prostu w kodzie gdzie wywołujesz lcd_char() dodaj pgm_read_byte() :)

--
Pozdrawiam,
Robert



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2018, o 20:21 
Offline
Użytkownik

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

Dzięki rskup
Trochę dzisiaj pokombinowałem. W zasadzie utworzyłem bliźniaczą funkcję w lcd.c i lcd.h (wiadomo, o które biblioteki chodzi) z nazwą lcd_char_P.
Niestety nie rozumiem do końca składni tych funkcji. Nigdy się nad nimi nie rozwodziłem, tylko po prostu używałem i różne przerabianie po omacku nie
przynosi spodziewanych efektów. Z resztą to oczywiste. Coś tam się wyświetla, ale z różnym skutkiem. Odpuszczę chyba na razie ten temat, bo dużo
czasu umyka, a równolegle ćwiczę inne zagadnienia z C. Dzięki za cierpliwość. Robert.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 maja 2018, o 22:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 11 mar 2014
Posty: 1475
Pomógł: 167

A próbowałeś na początek zmianę by w głównej części programu odczytać wartość z tablicy z flasha i wysłać jak zwykły znak z RAMu?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
A dopiero potem przeniesienie tego do funkcji lcd_char_P()?

--
Pozdrawiam,
Robert



Ostatnio edytowano 9 maja 2018, o 11:23 przez rskup, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2018, o 07:01 
Offline
Użytkownik

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

Witaj rskup
Próbowałem różnie, ale efekt jest zawsze podobny, tzn. wyświetla mi się nie to, co trzeba. Wygląda to tak, jakby nie wczytywał
z tablicy, albo wczytywał część z tablicy, a część z wyświetlacza. Ja mam podgląd znaku mnie interesującego i liczby dziesiętnej
tego znaku, co widać w kodzie. W tablicy mam od 48-122 z przerwami oczywiście. jako liczby dziesiętne pokazują mi się wartości
z cyfrą początkową 2, 3 (czytaj 200, 300.....), których w tablicy przecież nie mam. Jako znaki, pokazują mi się oprócz cyfr i liter
także inne znaki, krzaki itp...Dodatkowo zmiana wyświetlania ma odbywać się co 0,5s, a jest tak, że nieraz zatrzymuje się na
jakimś znaku i czeka np. 1,5s (jakby w tle szło dalej) i ponownie wyświetla inny znak. Kiedy tą samą tablice miałem w ramie, to
wszystko działało perfekt. Dałbym spokój z tym tematem, ale nie lubię nierozwiązanych problemów, poświęciłem temu zagadnieniu
trochę cennego czasu. Ja rozumiem, że nic nie przychodzi od razu i C to mnóstwo godzin we dnie i w nocy ;)

Na wszelki wypadek wrzucam cały kod, bo może z tego wszystkiego popełniam jakiś kardynalny błąd i z tond te niepowodzenia.

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


Na koniec jeszcze zapytam, czy przy wyświetlaniu liczb dziesiętnych i hex też powinienem zmienić funkcje do wyświetlania ?
(mowa o sytuacji, kiedy kompiluję z tablicą we flash). Z tego, co widzę na lcd, to wyświetlanie jest prawidłowe, aczkolwiek
coś zauważyłem.
Kiedy mam na ekranie DEC 46, to jednocześnie HEX mam 2e, a char mam f. Według tabeli ASCII czar f odpowiada DEC 102
i HEX 66. Co jest nie ok? Ale teraz zamieszałem... :lol: . No ale może innym to się kiedyś przydać :roll: .



Ostatnio edytowano 9 maja 2018, o 10:16 przez Robert_1967, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2018, o 09:34 
Offline
Użytkownik
Avatar użytkownika

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

Hejo,
A pamiętasz jak pisałem że for... <.... coś...
A potem if( coś == ?...
:)

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2018, o 09:59 
Offline
Użytkownik

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

Siemka Daro69
Witam i pozdrawiam. Pamiętam. Może dalej źle napisałem te zakresy. No tak mi się wydaje po mojemu, ale jak odkomentuję
tablicę w ram i zakomentuję tablicę we flash, to wszystko z tablicy wyświetla się prawidłowo. Zaczyna od znaku z numerem 48
i dobiega do znaku z numerem 122 i od nowa. Nie zmieniam nic w pętli for. No może poza dodaniem lcd_char( pgm_read_byte(tab_znaki[pozycja_do_edycji]) ); , jak zasugerował rskup. Popatrzę jeszcze raz, czy to coś pomoże, ale nie wiem
, czy tu tkwi błąd. Dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2018, o 10:25 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

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


Rzutowanie być może nie zawsze jest konieczne, ale najlepiej wartość zwracaną przez pgm_read_byte() rzutować do typu, jaki akceptuje dana funkcja (nie jestem pewien, czy wszystkie typy dobrze odgadłem ;) ).

Robert_1967 napisał(a):
Na koniec jeszcze zapytam, czy przy wyświetlaniu liczb dziesiętnych i hex też powinienem zmienić funkcje do wyświetlania ?
(mowa o sytuacji, kiedy kompiluję z tablicą we flash). Z tego, co widzę na lcd, to wyświetlanie jest prawidłowe, aczkolwiek
coś zauważyłem.

Jeśli funkcja oczekuje jakiejś wartości, odczytujesz ją z FLASH za pomocą makr pgm_read_xxx() i przekazujesz tak jak pokazałem wyżej. Modyfikacji wymagają funkcje, które oczekują wskaźnika do zmiennej czy też tablicy. Jeśli przekazywany wskaźnik jest wskaźnikiem do FLASH, ciało funkcji musi odczytywać wskazywane dane za pomocą ww. makr.

Można ewentualnie zmienić sposób obsługi danych we FLASH na kwalifikatory __flash i __memx. wtedy pewne problemy znikają, bo nie ma potrzeby stosowania ww. makr, a do odczytu danych z FLASH stosuje się taki sam zapis, jak w przypadku danych w RAM.
AVR-GCC - dane w pamięci FLASH


Autor postu otrzymał pochwałę


Ostatnio edytowano 9 maja 2018, o 10:51 przez andrews, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2018, o 10:48 
Offline
Użytkownik

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

Wielkie dzięki kolegom za chęć pomocy.
Zrobiłem na początek bez rzutowania, ale od razu przyniosło pożądany efekt. Chodziło o ten znak &. O ile coś pamiętam, to
jest chyba znak pobierania adresu, czy coś około...sorki za wyrażenie. I tu kłania się znikoma wiedza na ten temat. Trzeba
będzie wałkować :lol: . Sprawdzę również z rzutowaniem, ale teraz wszystko śmiga prawidłowo, no i dało wiele do myślenia.
Jeszcze raz dzięki. Czas nie poszedł na marne.
Teraz tylko muszę dokończyć tą funkcję lcd_char_P(), bo pewnie nie raz będzie przydatna. Pozdrawiam. Robert.

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  
cytowanie selektywne  Cytuj  
PostNapisane: 9 maja 2018, o 19:20 
Offline
Użytkownik
Avatar użytkownika

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

hejka,
a ja dalej swoje z uporem maniaka. ;)
Robert_1967 napisał(a):
                for (uint8_t pozycja_do_edycji=0;        pozycja_do_edycji < 62; pozycja_do_edycji++)
                {
                        if(pozycja_do_edycji ==62)              pozycja_do_edycji = 0;
Robert_1967 napisał(a):
których w tablicy przecież nie mam. Jako znaki, pokazują mi się oprócz cyfr i liter
także inne znaki, krzaki itp..
Daro69 napisał(a):
A pamiętasz jak pisałem że for... <.... coś...
A potem if( coś == ?...
Robert_1967 napisał(a):
dobiega do znaku z numerem 122 i od nowa. Nie zmieniam nic w pętli for.
Robert_1967 napisał(a):
for (uint8_t pozycja_do_edycji=0;        pozycja_do_edycji < 62; pozycja_do_edycji++)
                {
                        if(pozycja_do_edycji ==63)              pozycja_do_edycji = 0;

podejrzewam że masz skopiowany projekt i w jednej kopii masz inne parametry a w drugiej inne.
w zależności którą skompilujesz - to albo coś działa bliżej oczekiwań, albo krzaczy bardziej. ;)
dziwne, bo i w pierwszym i w drugim wklejonym tu kawałku kodu, zmienna "pozycja_do_edycji" nie powinna się wyzerować.(ewentualnie może się zmienna 'przepełnić', i zacząć inkrementować od początku.)
może po prostu czegoś nie widzę co istnieje jeszcze dodatkowo w kodzie. :roll:



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: 56 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO