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



Teraz jest 9 maja 2026, o 01:52


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 11 cze 2014, o 14:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Witam

Zagadnienie jak w temacie.
Staram się dopracować bibliotekę do obsługi wyświetlacza opartego o sterownik SANYO LC7981.
Biblioteka jest autorstwa Sebastian Schumb'a.

W kodzie znajduję że tak powiem elementarne najbardziej niskopoziomowe fukcje odpowiadające za wysłanie komendy do sterownika oraz za "pyknięcie" linią E (wykonanie komendy).
Biblioteka nie posiadała obsługi flagi zajętości. Więc ją dorobiłem.
Jako, że jest to wyświetlacz graficzny, szybkość wykonywania operacji ma znaczenie dużo większe niż w przypadku 44780.
Dodatkowo przeglądając notę sterownika okazało się czasy wykonania komend są dość krótkie (ns), więc obecność delay'ow na poziomie 30 us w tak elementarnych funkcjach wydaje się nie na miejscu.

Autor fukcje napisał tak:
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.


Jak widać fukcje są rodzaju INLINE i to zagnieżdżone.
Niestety w pliku lss nie zostały one rozwinięte. I wykonywany jest rozkaz call.
Wiem, że specyfikator INLINE nie jest dla kompilatora obligatoryjny i może on go nie zrealizować.
Funkcję strobe() (gdzie umieściłem sprawdzanie BF) oczywiście mogę literalnie (ręcznie) wkleić do lcd_write_command().

Ale czy da się jakoś zmusić kompilator, żeby jednak wykonał kompilację z uwzględnieniem specyfikatora INLINE?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 cze 2014, o 15:35 
Offline
Moderator
Avatar użytkownika

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

No to są funkcje KOBYŁY i powiem ci że dodatkowy narzut CALL jest niczym przy ich budowie

ale gdybyś się uparł to jest taki atrybut

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


Autor postu otrzymał pochwałę

_________________
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: 11 cze 2014, o 15:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

To prawda, kod urośnie mocno. Bo to jest wołane przecież przy każdej okazji. CALL to chyba 5 cykli i RET kolejne 5 cykli. Więc 10 cykli cykli zegarowych. To jest jakieś 500 - 600 ns. Najdłuższe czasy reakcji tego sterownika są na poziomie 250ns.

Te delay'e, szczególnie ten 30us, już usunąłem. Sprawdzam po prostu BF w pętli while. W trybie tekstowym (bo to ma własny tryb tekstowy, zresztą dość ciekawy) to nie jest tab bardzo odczuwalne, ale w trybie graficznym prędkość rysowania wzrosła masakrycznie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 cze 2014, o 16:12 
Offline
Moderator
Avatar użytkownika

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

sq8dsr napisał(a):
Sprawdzam po prostu BF w pętli while


a, no to dokładnie najlepszy sposób niż delaje

_________________
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: 11 cze 2014, o 16:45 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Obecnie funkcje wyglądają tak:

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.


Ja widać nie ma inline... Gdy je zrobiłem jako INLINE wyświetlacz zaczął się niepoprawnie zachowywać.
Zuważyłem to przy działaniu funkcji clear. Która wykonuje po prostu zapisanie spacjami całego obszaru pamięci sterownika. Rozpoczynając od pozycji 0,0. Kasowanie nie dochodzi do końca. Kilkanaście ostatnich bajtów pozostaje nietkniętych.
Gdy funkcje są bez INLINE, tak jak powyżej, wszystko jest OK.
Ma to jakiś związek z czasem trwania stanu wysokiego na linii E. Gdy tam wstawię opóźnienie o 3 cykle zegara wszystko działa dobrze.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 cze 2014, o 16:54 
Offline
Moderator
Avatar użytkownika

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

a co robią u ciebie takie funkcje jak np:

lcd_rw_low();

??

_________________
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: 11 cze 2014, o 17:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

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


Biblioteka nie jest moja. Ja się staram ją nieco udoskonalić. ;)
Autor tak dziwnie makra zdefiniował, że wyglądają jak funkcje.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 cze 2014, o 17:41 
Offline
Moderator
Avatar użytkownika

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

sq8dsr napisał(a):
Autor tak dziwnie makra zdefiniował, że wyglądają jak funkcje.


a no właśnie ;) bo jakby były dużymi literami napisane to od razu można byłoby się domyśleć że to proste makra i łatwiej myśleć o ich inline'owaniu ;)

ale skoro to jednak takie makra proste to dziwne że jak dasz inline na siłę to coś nie działa.

Próbowałeś np najpierw jedną z tych funkcji (najprosztą) zinlajnować i sprawdzić postępy ? poza tym wywalasz wtedy ten specyfikator static ?

_________________
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: 11 cze 2014, o 17:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Inline'owanie lcd_strobe() powoduje problem. Static usunąłem, on tam jest bo ta funkcja nie jest udostępniana poza poza plikiem.
Jak sądzę jest to związane właśnie z obsługą linii E. Widzę, że występują teraz poważne błędy w transmisji / odczycie danych przez sterownik.
Tak sobie myślę, że ten CALL (gdy nie ma inline) powoduje odsuniecie w czasie momentu w którym wystawiany jest sygnał E. I wtedy jest dobrze. Zapewne tam jest jakaś krytyczna zależność czasowa.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 cze 2014, o 18:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

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


I oczywiście działa.

------------------------ [ Dodano po: 12 minutach ]

mokrowski napisał(a):
Tyle pamiętam.... jak się rąbnołem w literce, to przepraszam...
Jak tym ,,gąbki nie wyciśniesz" to zostaje głębokie przeprojektowanie lub asembler i ,,babranie się w bitach" :-/


Jeju, ale tych atrybutów jest... Dobrze to wiedzieć. Ale ja zbym mało znam asemblera, żeby widzieć dokładnie istotę tych różnic.
Bo nawet jak nie piszemy w asm, to ostatecznie sposób pracy kompilatora się przekłada na to i trzeba wiedzieć, co do czego.
I tak jakoś (dzięki Mirkowi) nie przeraża mnie już widok pliku .lss :)

Ale obecnie jestem niemal pewny, że po inline'owaniu funkcji lcd_strobe() stan wysoki na linii E pojawiał się zbyt szybko i transmisja się "rozjeżdżała". Nie które bajty były odbierane poprawnie przez sterownik a niektóre nie.
Przyglądam się timeingom trasmisji z noty PDF:

Obrazek

Czas po którym (przy zapisie) powinno pojawić się E to jest minimum 90ns po ustawieniu lini RS i RW
Zanik E minimum 10ns przez zmianą na liniach RS i RW.
Ale procesor chodzi na 10MHz więc jeden cykl trwa 100ns. Więc teoretycznie nie powinno to przeszkadzać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 cze 2014, o 20:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

Sterownik już ogarnięty. Inlinowanie tych najbardziej niskopoziomowych funkcji skracało wykonanie kodu o kilka cykli. Co już było dla sterownika zbyt krótko. Po prostu nie spełniało to kryteriów czasowych wymaganych przez układ LC 7981.
Tak czy inaczej dorobiłem do biblioteki obsługę busy flag :) A delay'e na poziomie 500ns muszę w pewnych miejscach pozostać.
Dorobię trochę funkcji i się podzielę. LC 7981 nie jest może jakiś bardzo popularny, ale można spotkać wyświetlacze z tym sterownikiem.



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ł: 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