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



Teraz jest 16 maja 2026, o 18:15


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
Autor Wiadomość
PostNapisane: 13 lut 2016, o 12:04 
Offline
Nowy

Dołączył(a): 29 kwi 2015
Posty: 5
Pomógł: 0

Jest to mój pierwszy wątek więc Witam Wszystkich Forumowiczów.

Zachciało mi się wyświetlać na LCD graficznym teksty czcionką proporcjonalną.
Utworzyłem tablicę fontów graficznych od kodu 32-spacja do 127: // tu wklejam tylko fragment tablicy
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
gdzie pierwszy bajt mówi o ilości bajtów do odczytania na reprezentację graficzną znaku,
oraz drugą tablicę wskaźników na lokalizację znaków : // i tu wklejam tylko fragment tablicy
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

po odczytaniu kodu ASCII z klawiatury wołam procedurę wysłania na wskaźnik graficzny LCD obrazu znaku wciśniętego klawisza:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

procedura wysyłająca wygląda następująco:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i taka procedura kreśli mi na ekranie LCD tylko cyfrę 7, wynika to z podmiany zmiennej C=0x37,

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

gdy usunę tą linię kodu tak aby C=Klaw_press na wskaźniku wyświetlane są krzaczki lub nawet cała linijka jest czarna.
Proszę o pomoc, co źle robię, że ten kod nie działa.

Z góry za pomoc serdecznie dziękuję.

_________________
Krzysztof



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lut 2016, o 19:07 
Offline
Użytkownik

Dołączył(a): 05 lut 2014
Posty: 252
Lokalizacja: obok Częstochowy
Pomógł: 14

Masz tablicę znaków 8 bitowych, a tworzysz wskaźnik wskazujący na wartości 16 bitowe. Tak ma być ?
Nie znam tej biblioteki, ale może tutaj pies pogrzebany.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lut 2016, o 19:38 
Offline
Użytkownik
Avatar użytkownika

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

A czy m nie jest u Ciebie przypadkiem wartością pierwszego bajtu a nie wskaźnikiem na znak?

--
Pozdrawiam,
Rober



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lut 2016, o 21:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 17 paź 2014
Posty: 237
Lokalizacja: Rzeszów
Pomógł: 11

Do pgm_read_byte() wysyła się adres argumentu (na 99% - jeszcze dobrze się nie znajduję we wskaźnikach)

Poczytaj tutaj:

http://mirekk36.blogspot.com/2013/11/tablica-wskaznikow-we-flash-progmem.html

_________________
Mr. Nobody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2016, o 00:30 
Offline
Użytkownik
Avatar użytkownika

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

Przyjrzałem się na spokojnie dokładnie Twojemu kodowi. Poniżej poprawiony i sprawdzony. I działa poprawnie :):
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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2016, o 00:37 
Offline
Nowy

Dołączył(a): 29 kwi 2015
Posty: 5
Pomógł: 0

Witam.
Dziękuję kolegom za zainteresowanie, moim problemem. Problem rozwiązałem następująco"
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Teraz troszkę objaśnienia do tej procedury:
Tablice bitmap wyglądu znaku graficznego kodu ASCII mają zmiennej ilości bajtów, inna jest dla cyfry 1 - 3 bajty, i inna dla cyfry 2 -5 bajtów, dlatego utworzyłem tyle tablic ile chcę wyświetlić różnych znaków graficznych. Aby móc prawidłowo wyświetlić bitmapę znaku dodałem jako pierwszy bajt informujący z ilu bajtów składa się dana bitmapa znaku. Tak więc teraz dla cyfry 1 tablica ma 4 bajty, a dla cyfry 2 ma 6 bajtów.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Te tablice umieściłem w pamięci programu t.j. FLASH-u i są typu Read-only . Aby móc pobrać odpowiednią bitmapę znaku graficznego utworzyłem kolejną tablicę Znak[] uporządkowaną zgodnie z kodami znaków ASCII i przechowuję w niej adresy (wskaźniki - 2 bajtowe), do bitmap znaków. Ta tablica nie zawiera znaków nie drukowanych wiec pierwszym adresem jest adres bitmapy znaku - SPACJA kod 32.
I teraz chcąc wysłać do LCD znak SPACJA o kodzie 32 muszę odjąć ilość nie drukowanych znaków która wynosi 32, stąd adres tablicy bitmapy znaku SPACJA=32-32=0 a to jest pierwszy adres w tablicy Znak[] inaczej Znak[0]:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Mając adres tablicy z bitmapą znaku np: C32 odczytuję jej [0] element mówiący ile kolejnych bajtów zajmuje bitmapa wyglądu znaku, dodatkowo asekuracyjnie ograniczyłem maską 0x07 maksymalną wielość odczytywanej bitmapy - jest to równocześnie maksymalna szerokość wyświetlanego na LCD znaku. Odczytane bajty wysyłam do LCD i po wysłaniu całej bitmapy wysyłam jeszcze odstęp pomiędzy znakami o wielkości 1 piksela. W zależności czy znaki generuję na białym tle czy zanegowane (mówi o tym zmienna color) wysyłam odpowiednio 0x00 lub 0xFF.

Kończąc dziękuję za podpowiedź koledze APAP75.
Pozdrawiam wszystkich i do następnego "problemu" z C dla AVR-ów.

P.S. Właśnie w tej chwili odebrałem od kolegi rskup poprawki do mojego zapytania. Ze względu na porę zapoznam się z nimi jutro niemniej jednak bardzo serdecznie koledze dziękuję za odpowiedź.

_________________
Krzysztof



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2016, o 13:30 
Offline
Nowy

Dołączył(a): 29 kwi 2015
Posty: 5
Pomógł: 0

Witam.
Próbowałem zastosować kolegi rskup rozwiązanie mojego problemu, ale mam błędy odnoszące się do linijki kodu:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Kod:
undefined reference to `pgm_read_ptr'   KS0108.c   /LCD_64x128       C/C++ Problem
implicit declaration of function 'pgm_read_ptr' [-Wimplicit-function-declaration] KS0108.c   /LCD_64x128 line 294 C/C++ Problem
initialization makes pointer from integer without a cast [enabled by default]   KS0108.c   /LCD_64x128 line 294 C/C++ Problem

Niestety mój zasób wiedzy o C jest skromny i póki co nie wiem jak rozwiązać problem związany z makrem pgm_read_ptr dla kompilatora Eclipse Indigo na którym piszę swój program.
Może problem jest z moim dość starym tolchain-em ATMELA - gdzie nie ma tego makra?
A może kolega wie jak ten problem rozwiązać?
Za zaangażowanie dziękuję. Krzysztof

_________________
Krzysztof



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lut 2016, o 16:33 
Offline
Użytkownik
Avatar użytkownika

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

Tak, chyba masz starego toolchaina :(. Zamień tę linię na:
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

------------------------ [ Dodano po: 3 minutach ]

W nowym toolchanie masz pgm_read_ptr() definiowane jako:
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: 15 lut 2016, o 00:50 
Offline
Nowy

Dołączył(a): 29 kwi 2015
Posty: 5
Pomógł: 0

Witam.
Tak jak Robercie sugerowałeś wstawiłem poprawioną linię kodu
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i dalej są błędy
    Warnings(1 itm)
    initialization makes pointer from integer without a cast [enabled by default] KS0108.c /LCD_64x128 line 296 C/C++ Problem

ja spodziewam się mieć w ws adres odpowiedniej bitmapy w pamięci flash, a więc spodziewam się adresu 2 bajtowego, dlatego podmieniłem uint8_t na uint16_t, czyli zrobiłem 3 zmiany w zapisie- efekty poniżej:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
i jak widać ws musi być int lub uint16_t bo jest wskaźnikiem a więc 2 bajty.

Dziękuję Robercie, piszę dalszy ciąg programu, mam pomysł na zmniejszenie wielkości tablicy z bitmapami.
Będę tu czasami w tygodniu zaglądał, może coś ciekawego się urodzi w głowach naszych forumowiczów.
Pozdrawiam.

_________________
Krzysztof



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lut 2016, o 01:40 
Offline
Użytkownik
Avatar użytkownika

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

Jak masz deklarację wskaźnika *ws, to typ jaki podajesz nie oznacza wielkości zajmowanej przez sam wskaźnik, bo to jest zawsze stałe a ile zajmują miejsca wskazywane przez wskaźnik dane. Czyli
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
oznacza wskaźnik na elementy uint8_t. A
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
oznacza taki sam wskaźnik, ale wskazujący na element uint16_t. I dopiero jak zaczynasz operować na danych pod wskaźnikiem to zaczyna mieć znaczenie jaki jest to typ, bo mówi czy np. ma być pobrany jeden czy dwa bajty oraz np. przy inkrementacji czy przy zwiększaniu wskaźnika to ma być zwiększanie o jeden czy dwa bajty.

W moim przykładzie *ws zawiera już wskaźnik na konkretną bitmapę, bo ładowana do niej jest odpowiednia wartość 16 bitowa z tablicy Znak (czyli wartość wskaźnika) a ta bitmapa jest chyba 8 bitowa (definiowałeś jako char oraz czytałeś po jednym bajcie).



Czy zapis
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
lub zapis
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
także zgłasza Ci błąd?

--
Pozdrawiam,
Robert

------------------------ [ Dodano po: 14 minutach ]

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

także jest poprawny, dopóki mamy wielkość wskaźnika 16 bitów (a dla AVRów 8 bitowych to jest zawsze prawda :)) oraz wskaźnik wskazuje na 1 bajtowe elementy. Bo tutaj do ws ładujesz wartość 16 bitową, która jest faktycznie wskaźnikiem. A potem traktujesz to jako adres (czyli wskaźnik) na nowe dane. Jak inkrementujesz to zwiększasz o jeden bajt, więc dla twoich danych jest OK (gdybyś miał tablicę bitmap o wartościach uint16_t, to by nie zadziałało).

int to to samo co int16_t, więc jak zamieniłeś uint16_t (unsigned) na int (signed) to dopóki operujesz na pierwszych 32KB to nie zauważysz problemu.

A na pewno masz Atmel toolchaina a nie starego z WinAVR?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lut 2016, o 00:36 
Offline
Nowy

Dołączył(a): 29 kwi 2015
Posty: 5
Pomógł: 0

Witaj Robercie.
Wstawiłem po kolei wszystkie trzy linijki kodu i jest O.K.

Kod:
Jak masz deklarację wskaźnika *ws, to typ jaki podajesz nie oznacza wielkości zajmowanej przez sam wskaźnik

masz rację :oops: .

Kod:
A na pewno masz Atmel toolchaina a nie starego z WinAVR?

Mam Atmel toolchaina, bo ścieżka do AVR-GCC c:\...\Atmel\AVR tools\Toolchain\bin ,
i podobna do ....\include.

Czy ten zapis można uprościć?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Chodzi mi o wielkość wybranej [zmienna c] do wysłania na LCD tablicy bitmapy (ile bajtów wysłać?).
Np: adres cyfry 5=0x0344 a cyfry 4=0x034A to
ILE = 0x034A - 0x0344 = 6 - 1=5 bajtów (-1 w tej chwili bitmapa zawiera bajt mówiący o wielkości bitmapy i chcę go oszczędzić)
co odpowiada wielkości bitmapy cyfry 5 (pięć).

Pozdrawiam.

_________________
Krzysztof



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 lut 2016, o 00:29 
Offline
Użytkownik
Avatar użytkownika

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

Dobrze kombinujesz :)
Tylko musisz uważać, bo zdefiniowane zmienne mogą być umieszczane nie po kolei :(. A co ciekawe, to standardowo kompilator umieszcza je w odwrotnej kolejności niż wpisane w pliku *.c (zajrzyj do pliku *.lss powstające przy kompilacji). Czyli musisz odejmować odwrotnie:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
lub prościej, bo i tak masz już przeczytaną wartość dla ws:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Także musisz pamiętać o dodaniu jeszcze dodatkowego wpisu w Znak, by wszystkie znaki miały dostępny wskaźnik na początek i koniec. Oczywiście także musisz dodać zmienną na którą wskaźnik ze Znak będzie wskazywał, ale może ona być pusta:
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



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 12 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