Skocz do zawartości

Blue Pill plus i8080 16bit dla ILI9341


virtualny

Pomocna odpowiedź

Dnia 29.08.2023 o 16:40, virtualny napisał:

A tak trzeba podawać 2 razy współrzędne plota, które są wielkości 16 bitów przez najmłodsze 8 bitów magistrali - po prostu strata czasu...

Cała klatka jest rysowana (generowana) od początku za każdym razem, czy tylko wybrane piksele są gaszone i zapalane?

Edytowano przez matsobdev
Link do komentarza
Share on other sites

Co klatkę liczonych jest 512 pixeli, następnie są sprawdzane i oznaczane czy znajdują się w zakresie widocznym na ekranie. Od linii (rastra) 310 z (320) następuje wymazanie pixeli postawionych w poprzedniej ramce i natychmiast po tym stawiane są nowe doty w ilości do 512 - czyli wybrane pixele są wygaszane i zapalane. Niestety mamy tutaj  opóźnienie wynikające z wymagań sterownika:

 

1. Po pierwsze nie mogę zastosować rozkazu (bo taki nie istnieje) typu "Put_Pixel(x,y, color)", aby raz podać współrzędne X i Y oraz kolor pixela, tylko muszę podać okno (start x, start y, end x, end y) o wielkości 1 pixela w x i y, czyli:

    LCD_WriteReg(ILI_CASET);
    LCD_WriteData(y0);
    LCD_WriteData(y0);
    LCD_WriteReg(ILI_PASET);
    LCD_WriteData(x0);
    LCD_WriteData(x0);
    LCD_WriteReg(ILI_RAMWR);
    LCD_WriteData(Color);

2. Po drugie w wypadku tego rozkazu, pomimo że magistrala jest 16 bitowa przesyłanie danych X i Y jest wyłącznie przez najniższe 8 bitów magistrali, pomimo że X i Y są wielkościami 16 bitowymi - czyli tak naprawdę wykonywane jest to tak:

    LCD_WriteReg(ILI_CASET);
    LCD_WriteData(y0 >> 8);
    LCD_WriteData(y0);
    LCD_WriteData(y0 >> 8);
    LCD_WriteData(y0);
    LCD_WriteReg(ILI_PASET);
    LCD_WriteData(x0 >> 8);
    LCD_WriteData(x0);
    LCD_WriteData(x0 >> 8);
    LCD_WriteData(x0);
    LCD_WriteReg(ILI_RAMWR);
    LCD_WriteData(Color);

A wszystko tylko dla 1 pixela czyli 3 zapisy do rejestrów i 9 razy wystawianie danej na magistrali (za każdym razem po wystawieniu danej trzeba "kliknąć 2 razy linią NWE! 0/1 ) -zamiast :

    LCD_WriteReg(PIXEL); // mój wyimaginowany rejestr i rozkaz optymalizujący stawianie pixela
    LCD_WriteData(y0);
    LCD_WriteData(x0);
    LCD_WriteData(Color);

W poprzednim moim poście, zamieszczona procedura stawia w pętli do 512 dotów, gdzie przez referencje podany jest w R0 wskaźnik do tablicy współrzędnych X, R1 współrzędnych Y, R2 przez wartość ilość dotów do postawienia i R3 przez wartość kolor. Z C tą procedurę wywołuje się:

//Set_Many_Plots(uint16_t * plots_X, uint16_t * plots_y, uint32_t ManyPlots, uint16_t color );
Set_Many_Plots(& plots_X, & plots_y, ManyPlots, color );

 

Czyli nawet stawianie samych plotów zamiast pełnej ramki jest upierdliwe. Dodatkowo dochodzimy do pewnej granicy, ponieważ flash może być "access'owany" do bodajże 24MHz i postawienie tego na maszynie 160MHz zwiększy tylko ilość waitstate'ów, a kod się szybciej nie wykona jeżeli nie mamy jakiegoś cashe na podorędziu.

  • Lubię! 1
Link do komentarza
Share on other sites

To nie zmniejszy ilości przesyłanych danych do wyświetlacza, ani tym bardziej możliwego odświeżania tak aby zmieścić się czasie rysowania klatki przez wyświetlacz, co najwyżej "uprości". A mianowicie siłowe wysyłanie całej klatki na bieżąco (czy częściowego) bufora, bez selektywnego gaszenia tego co było wcześniej na ekranie. Nie trzeba wtedy sterować wyświetlaczem (wystarczy raz wydać polecenie zapisu do pamięci), tylko wprost zarzucić strumień - 240 * 320 * RGB565 = 150 KB. Jak się zapełni pamięć wyświetlacza, to następne dane zapisują się od początku pamięci.

Edytowano przez matsobdev
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

512 x 12 zapisów z czego 11 ignoruje 8 najstarszych bitów magistrali to tak policzyłbym "plus-minus" 8 "pełnych" zapisów na 1 dot, co daje 4KB dla 512 dotów versus 150KB "brutal force" na ramkę, gdzie oprócz przesyłania danych trzeba jeszcze doty poobracać w 3 osiach... No i mała ilośc RAM w bluepillu... Coś takiego to na czymś bardziej wypasionym z własnym i DMA transferującym go do LCD framebufforem.

 

 

 

edit:

UPS... plus drugie 4KB na zapalenie nowych vectordotów - razem 8KB

Edytowano przez virtualny
Link do komentarza
Share on other sites

To ja będę tym narzekającym na design PCB 😄 

  1. Widzę bardzo niemiłe przecięcia ścieżek (aka. nie są pod kątem prostym). To bardzo szybka droga do dużej ilości problemów z zakłóceniami.
  2. Energia nie płynie ścieżkami, tylko polem między nimi. Masa i ścieżki sygnałowe powinny być jak najbliżej siebie. Czy jest jakiś powód, dla którego nie zastosowałeś pola masowego na całej płytce? 
  3. Osobiście unikam przelotek jak ognia, ale czasem jednak je trzeba stosować. Tutaj obowiązuje zasada parzystości - dwie przelotki. Jedna dla sygnału, druga zaraz obok dla masy. Zwykle nie jest to aż tak istotne, ale jak pojawią się wyższe częstotliwości to zacznie to być całkiem problematyczne.
  4. NIGDY NIE PRZECINAJ ŚCIEŻKI SYGNAŁOWEJ I MOCY (chyba, że naprawdę nie ma już żadnej innej możliwości, ale to wtedy tylko i wyłącznie przecięcie pod kątem 90 stopni).

To byłoby chyba na tyle. W każdym razie pomysł dość interesujący, chociaż osobiście ostatnio wolę styl retro i wszystko w THT.

Ref: 

 

Edytowano przez H1M4W4R1
  • Lubię! 2
Link do komentarza
Share on other sites

12 godzin temu, H1M4W4R1 napisał:

Widzę bardzo niemiłe przecięcia ścieżek (aka. nie są pod kątem prostym). To bardzo szybka droga do dużej ilości problemów z zakłóceniami.

Nie jestem pewien o co chodzi, prawdopodobnie o routing linii 5V albo 3V gdzie ścieżki mają po 60 milsów...

12 godzin temu, H1M4W4R1 napisał:

Czy jest jakiś powód, dla którego nie zastosowałeś pola masowego na całej płytce? 

Wylewka masowa jest po obu stronach, tylko że tego nie pokazałem. Pokazałem  routing bez przelotek na liniach sygnałowych.

pcb.thumb.jpg.03cb41e1c76920b1dc32ae201fcf2415.jpg

13 godzin temu, H1M4W4R1 napisał:

Osobiście unikam przelotek jak ognia, ale czasem jednak je trzeba stosować. Tutaj obowiązuje zasada parzystości - dwie przelotki. Jedna dla sygnału, druga zaraz obok dla masy. Zwykle nie jest to aż tak istotne, ale jak pojawią się wyższe częstotliwości to zacznie to być całkiem problematyczne.

Linie sygnałowe są bez przelotek (UDAŁO SIĘ), w miejsce przelotek zastosowałem na liniach 3 i 5V pady dwuwarstwowe (jak się uprzeć, to też przelotka tylko w powiększeniu) plus miejscowe wylewki 3 i 5V (ponieważ było dużo miejsca) żeby mieć dobre przejście linii 3 i 5V pomiędzy warstwami. Z tych samych powodów zastosowałem pady łączące wylewki GND zamiast przelotek 12mils. Częstotliwości maksymalne jakie się tu pojawiają, to strob zapisu na linii NWE, który mógłby działać z prędkością 18MHz, i który celowo został obniżony do 9 MHZ, pomiędzy strob intencjonalnie "wplecono" kolejne zadania - widać w zamieszczonej procedurze Set_Many_Plots(uint16_t * plots_X, uint16_t * plots_y, uint32_t ManyPlots, uint16_t color ) :

 

      
//===========================================
       STR    R7, [R5, #0x0C]    // store lowest 8 bits into GPIO_A as our low byte DATABUS   


        MOV    R6, R10, LSR #8    // intentionally delay for databus stabilise
        STR    R11,[R5, #0x0410]  // [GPIO_B->BSRR] NWE = 0, RS = 1 [GPIO B]
        AND    R7, 0xFF00         //INTENTIONALLY DELAY FOR SLOW DOWN WRITE STROBE // mask 8 high bits
        STR    R9, [R5, #0x0410]  // [GPIO_B->BSRR] NWE = 1        
//============================================

 

(W innym wątku robiłem doświadczenia z jaką maksymalną prędkością da się "machać" programowo pinem, tudzież ile cykli rdzenia zajmuje wykonanie wybranego rozkazu.)

13 godzin temu, H1M4W4R1 napisał:

NIGDY NIE PRZECINAJ ŚCIEŻKI SYGNAŁOWEJ I MOCY (chyba, że naprawdę nie ma już żadnej innej możliwości, ale to wtedy tylko i wyłącznie przecięcie pod kątem 90 stopni).

Dzięki za wartościową radę.

I dzięki za dobry filmik.

 

 

 

Link do komentarza
Share on other sites

2 godziny temu, virtualny napisał:

Częstotliwości maksymalne jakie się tu pojawiają, to strob zapisu na linii NWE, który mógłby działać z prędkością 18MHz

Czyli na oko może on powodować zakłócenia harmoniczne aż do ~500MHz, czyli bez problemu zahacza o fale radiowe 😉 (Nawet przy obniżeniu o połowę).

2 godziny temu, virtualny napisał:

Nie jestem pewien o co chodzi, prawdopodobnie o routing linii 5V albo 3V gdzie ścieżki mają po 60 milsów...

Chodzi o kąt pomiędzy ścieżką na TOP i BOT. Powinny zawsze mieć 90 stopni, by fale EM nie wchodziły ze sobą w interferencje. W pierwszym poście jest tego dość sporo, a najbardziej w oczy rzuca się 3V3 przecinające się z liniami sygnałowymi po lewej stronie.

Bazowałem na routingu pokazanym w pierwszym poście, stąd sporo elementów było w formie pytań 😛 

2 godziny temu, virtualny napisał:

pcb.thumb.jpg.03cb41e1c76920b1dc32ae201fcf2415.jpg

Jak podsyłasz routing to lepszy jest zrzut ekranu z edytora zamiast podglądu PCB 😉 (Ten z czerwonymi i niebieskimi ścieżkami, bo łatwiej znaleźć potencjalne błędy). To taka rada na przyszłość 😉 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.