Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[STM32F103VCT6][C/KEIL] - Wyświetlacz LCD - Prędkościomierz analogowy

Sparrowhawk 18 Lis 2011 13:27 3069 14
  • #1 18 Lis 2011 13:27
    Sparrowhawk
    Poziom 21  

    Zrobiłem pewnego rodzaju prędkościomierz analagowy na zestawie HY-MINI. Dołączony wyświetlacz 240x320, obsługiwany jest za pomocą FSMC i biblioteki GLCD. Napiałem pewnego rodzaju, ponieważ prędkość podawana jest z komputera poprzez port szeregowy. Tło wskaźnika skonwertowałem z pliku .bmp do .c i załączyłem do projektu. Układ działa, ale jego działanie odbiega od moich wyobrażeń.

    Wskazówkę zrobiłem jako kilka linii prostych koloru białego, tworzących wypełniony trójkąt. Prędkość przeliczana jest na odpowiedni kąt obrotu wskazówki.

    Póki co pętla główna działa w oparciu o schemat: Nałóż tło -> Narysuj wskazówkę.

    Wskazówka rysowana jest za każdym razem, kiedy układ otrzyma nowe dane na USART1. Ponieważ za każdym razem, kiedy ma zostać narysowana wskazówka, rysowane jest wcześniej tło, wskazówka miga.

    Pomyślałem, że po narysowaniu wskazówki, zamiast wczytywać tło w postaci:
    LCD_RAM = Tlo[i], zastosować LCD_RAM |= Tlo[i]; Wskazówka powinna przestać migać, jednak, jak zakreśli kąt pełny, to na ekranie będzie namalowane koło.

    I nie mam pomysłu, co dalej. Ogólnie wygląd wskazówki mi się nie podoba, a pomysł z kreśleniem jej za pomocą linii, wydaje mi się taki jakiś dziwny. Nie wiem, czy nie lepiej, mieć obraz wskazówki skonwertowany do pliku C, tylko nie bardzo wiem, jak potem ten obrazek obracać.

    0 14
  • #2 18 Lis 2011 14:13
    Jado_one
    Poziom 22  

    A nie możesz najpierw dokonywać zmian w rysunku (widok wskazówki + tło) w jakimś buforze RAM, który na koniec prześlesz do wyświetlacza? To dałoby tylko jeden transfer danych na zmianę obrazu. Można by sobie zdefiniować wówczas stałą szybkość odświeżania obrazu - niezależnie od napływających danych - wszak to szybkość rakcji człowieka jest tutaj ograniczeniem :-)

    0
  • #3 18 Lis 2011 14:35
    Sparrowhawk
    Poziom 21  

    Ale chyba ciężko będzie bufor zrobić mając 48k RAM, skoro obraz tła zajmuje 150k.

    0
  • #4 19 Lis 2011 00:43
    atom1477
    Poziom 43  

    Niestety tutaj nic się nie da poradzić.
    Bez double bufferingu (czyli tego drugiego bufora) będzie migało.
    No chyba że narysowanie nowej wskazówki i w ogóle całego tła procesor zdążył by zrobić pomiędzy wyświetleniami kolejnych klatek.
    Może pokaż rysunek tła i wskazówki. Jeżeli wskazówka ma dostatecznie małą powierzchnię to jest jeszcze jeden sposób na to.

    0
  • #5 19 Lis 2011 01:47
    Sparrowhawk
    Poziom 21  

    Obraz tła:
    [STM32F103VCT6][C/KEIL] - Wyświetlacz LCD - Prędkościomierz analogowy

    Wskazówka, to trójkąt o szerokości podstawy 10 pix i wysokości 70 pix.

    Ale abyśmy się dobrze zrozumieli, procesor, jest w stanie narysować całość dość szybko. Problemem nie jest migotanie obrazu, tylko migotanie samej wskazówki, przy rysowaniu jej na nowo po zmianie pozycji.

    0
  • #6 19 Lis 2011 01:58
    atom1477
    Poziom 43  

    Cytat:
    Ale abyśmy się dobrze zrozumieli, procesor, jest w stanie narysować całość dość szybko. Problemem nie jest migotanie obrazu, tylko migotanie samej wskazówki, przy rysowaniu jej na nowo po zmianie pozycji.

    Migotania nie powoduje rysowanie wskazówki tylko jej zamalowywanie (rysowanie tła). Bo to przez zamalowywanie ona na chwilkę znika.
    W dodatku to zamalowywanie tła trwa najdłużej i dlatego tak bardzo to widać.
    Gdyby to rysowanie wskazówki powodowało migotanie to miał byś dwie wskazówki. Jedną dobrą (tą nową) i jedną migającą ale dość słabo (tą starą usuwaną z tła).

    No ale jeżeli rzeczywiście procesor się wyrobi z narysowaniem całego tła i nowej wskazówki pomiędzy odświeżeniami to synchronizuj po prostu rysowanie z wyświetlaniem (tak żeby rysowanie było pomiędzy 2 odświeżeniami wyświetlacza przez jego wewnętrzny sterownik). Zwykle jest pin do takiej synchronizacji (ale nie wiem jak się nazywa bo nigdy z tego nie korzystałem, no a u Ciebie to nie wiem jaki to wyświetlacz więc też Ci nie sprawdzę).

    PS. Widzę po białym pasku że to do samolotu :D

    0
  • #7 19 Lis 2011 10:52
    Jado_one
    Poziom 22  

    Być może powinieneś spróbować sposobu jaki się kiedyś wykorzystywało pisząc kiedyś tzw. scroll'a na C-64 ;-)
    Tzn. przesuwać strzałkę tylko o jeden pixel w lewo lub w prawo, uzupełniając z drugiej strony strzałki zwolniony obszar (o szerokości również jednego pixela) informacją pobraną z tła. W ten sposób minimalizujesz ilość przesyłanych danych i zmiany na obrazie. Oczywiście powstaje tutaj trudność w tym, że strzałka jest ukośnie względem ekranu i to utrudnia (matematyzuje) operacje na pixelach - ale pewnie można to ogarnąć.
    BTW: swojego czasu próbowałem napisać scrolla na mały ekran graficzny GLCD i teoretycznie działał, ale wskutek dużej bezwładności wyświetlania tego wyświetlacza, występował efekt smużenia i niestety efekt był mizerny.
    Jeżeli Twoj ekran też nie jest za szybki, to musisz się liczyć z pewnym smużeniem również - niezależnie od użytej metody uzupełniania danych na wyswietlaczu.

    0
  • #8 19 Lis 2011 10:56
    190175
    Użytkownik usunął konto  
  • #9 19 Lis 2011 10:58
    kaczart
    Poziom 14  

    Przed wyświetleniem wskazówki (w nowej pozycji) nie odświeżaj na nowo CAŁEGO tła tylko ten kawałek gdzie poprzednie położenie wskazówki zakrywało kawałek tła.

    0
  • #10 19 Lis 2011 11:27
    atom1477
    Poziom 43  

    No właśnie ten mój sposób też na tym polega. Czyli narysowanie "wskazówki" ale o kolorze tła i drugiej już tej normalnej w kolorze białym.
    Tą w kolorze tła rysujesz w miejscu poprzedniej białej wskazówki a tą białą w nowej pozycji otrzymanej przez UARTa.,

    0
  • #11 19 Lis 2011 14:04
    kaczart
    Poziom 14  

    I jeszcze pytanie - z jakiego LCD dokładnie korzystasz? Wiele LCD ma tak żałosne parametry odświeżania że czas jaki mija od wygaszenia jednego piksela do zapalenia drugiego jest rzędu pojedynczych dziesiątych sekundy (bez problemu widoczne gołym okiem)

    0
  • #12 19 Lis 2011 14:08
    atom1477
    Poziom 43  

    Tylko że powolne odświeżanie akurat by zmniejszyło efekt migotania a więc było by zaletą.

    0
  • #13 19 Lis 2011 14:13
    kaczart
    Poziom 14  

    racja, tylko smużenie byłoby widoczne

    0
  • #14 19 Lis 2011 15:49
    atom1477
    Poziom 43  

    No tak. Ale problemem jest migotanie.
    Więc to nie wina powolnej reakcji pixeli.

    0