logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

FT800 - różne wartości kalibracji dotyku po każdym uruchomieniu

OlegTor 25 Sty 2019 21:11 2187 43
Najlepsze odpowiedzi

Dlaczego po każdej kalibracji FT800 zapisuje nieco inne wartości macierzy dotyku i jak poprawnie zapisać je na stałe?

To jest normalne: przy każdej kalibracji nie trafisz idealnie w te same punkty, więc współczynniki macierzy będą się trochę różnić [#17730368][#17730847] Jeśli dotyk działa poprawnie po kalibracji, nie warto walczyć o identyczne liczby — lepiej wykonać jednorazową kalibrację, zapisać jej wynik do pamięci nieulotnej i przy starcie wczytywać go z powrotem do rejestrów FT800 [#17730688][#17740366] Autor pokazał też, że dla FT800 akceptowalne są różne zestawy współczynników, o ile ostatecznie transformacja działa poprawnie [#17741832] Jeśli po odczycie i ponownym zapisie touch przestaje działać, problem jest raczej w obsłudze rejestrów niż w samej kalibracji — np. nie należy zapisywać REG_CMD_READ, a warto też sprawdzić poprawność odczytu/zapisu i ewentualnie kolejność bajtów [#17751893][#17747720][#17968573]
Wygenerowane przez model językowy.
  • #1 17730232
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Witam,

    Zdobyłem tanio ekran FT800. Mam jednak z nim problem, a mianowicie chcę na stałe zapisać wartości kalibracji dotyku, ale ciągle po kalibracji macierz pokazuje różne wartości.
    Korzystałem z tematu: https://www.elektroda.pl/rtvforum/topic3486318.html
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Z powyższego kodu za każdym uruchomieniem i po kalibracji otrzymuje różne dane.
    Dlaczego tak się dzieje?

    Korzystam z HALa i STM32f103.

    Pozdrawiam
  • #2 17730368
    oloam
    Poziom 22  
    Posty: 683
    Pomógł: 50
    Ocena: 197
    OlegTor napisał:
    Z powyższego kodu za każdym uruchomieniem i po kalibracji otrzymuje różne dane.

    To raczej prawidlowo. Za kazdym razem gdy kalibrujesz ekran nie trafisz idealnie w ten sam punkt co przy wczesniejszej kalibracji. Jak bardzo zmieniaja ci sie te dane? Bity 0-15 to miejsca po przecinku, bity 16-30 rprezentuja liczbe calkowita. Sprawdz sobie w jakim zakresie te liczby sie zmieniaja i bedziesz mial odpowiedz.
  • #3 17730546
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Największy rozrzut w zakresie bitów 16-30 mam w REG_TOUCH_TRANSFORM_C i REG_TOUCH_TRANSFORM_F.
    No chyba, że mam błędy w kodzie. Co oznacza wskaźnik we (uint8_t *)txt ?

    Albo HAL w HAL_UART_Transmit_DMA coś miesza...
  • #4 17730688
    AndrzejKor
    Poziom 13  
    Posty: 58
    Pomógł: 8
    Ocena: 5
    Dobry wieczór

    Obsługiwałem FT800 i rzeczywiście każda kalibracja daje inne wartości w macierzy.
    Ja do kontroli kalibracji napisałem funkcję wyświetlającą małe klawisze circa (5mmx5mm)
    położone w odległości 1mm od siebie. Od użytkownika wymagałem, aby nacisnął kolejno wszystkie
    9 sztuk bez błędu. Jeżeli się to uda, to znaczy , że kalibracja jest wykonana poprawnie i nie ma co
    sobie zawracać głowy różnymi wartościami. Wynik kalibracji zapisywałem we flashu i odczytywałem przy starcie
    programu. Jeżeli we flashu było 0xFFFFFFFF to znaczyło, że kalibracja nie jest zapisana w pamięci i trzeba
    ją wykonać na początku programu.
    Jeżeli nie, to kalibracja była dostępna z menu konfiguracji urządzenia.

    Z ukłonami
    Andrzej Korycki
  • #5 17730847
    oloam
    Poziom 22  
    Posty: 683
    Pomógł: 50
    Ocena: 197
    Tak jak pisalem wyzej, za kazdym razem nie trafisz dokladnie w ten sam punkt. dlatego za kazdym razem masz inne wyniki.
    Zapisz jednorazowo kalibracje. Po resecie wczytaj ja do rejestrow i sprawdz czy dotyk dziala poprawnie.
    AndrzejKor napisał:
    Jeżeli się to uda, to znaczy , że kalibracja jest wykonana poprawnie i nie ma co
    sobie zawracać głowy różnymi wartościami.
  • #6 17731237
    AndrzejKor
    Poziom 13  
    Posty: 58
    Pomógł: 8
    Ocena: 5
    Dziędobry

    OlegTor napisał:

    Co oznacza wskaźnik we (uint8_t *)txt ?


    Najprawdopodobniej funkcja, którą wołasz, czyli HAL_UART_Transmit_DMA jako drugi parametr
    ma zadeklarowany wskaźnik na uint8_t. W celu uniknięcia ostrzeżeń kompilatora wykonane jest takie
    rzutowanie. A swoją drogą, to możesz to usunąć, bo txt u Ciebie jest właśnie wskaźnikiem na uin8_t (Pierwszy post w tym wątku).
    A sprintf i strlen(txt) nie dają ostrzeżenia ?

    Tak czy inaczej, będzie Ci łatwiej, jak zapoznasz się z rozdziałem o wskaźnikach w K&R.

    Z ukłonami
    Andrzej Korycki
  • #7 17731357
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Co do ostrzeżeń to sprintf daje: format '%X' expects argument of type 'unsigned int', but argument 8 has type 'uint32_t {aka long unsigned int}' [-Wformat=]
    Mimo że było: uint32_t ts0 = ft800memRead32( REG_TOUCH_TRANSFORM_A );
    podobnie dla strlen(txt): pointer targets in passing argument 1 of 'strlen' differ in signedness [-Wpointer-sign]
    Z chęcią bym chciał zrozumieć jak interpretować niektóre ostrzeżenia. Czym jest skrót K&R?
  • #8 17731369
    Konto nie istnieje
    Poziom 1  
  • #9 17731402
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Tak na szybko zapytam, czy te ostrzeżenia kompilatora mogą wpłynąć na niepoprawny przekaz danych do terminala w PC i dlatego zapis macierzy "dotyku" działa niepoprawnie?
  • #10 17731409
    AndrzejKor
    Poziom 13  
    Posty: 58
    Pomógł: 8
    Ocena: 5
    Wobec takiego pytania :
    OlegTor napisał:
    Czym jest skrót K&R?

    rozszerzam moją propozycję lektury o pozostałe rozdziały tejże książki.
    Innymi słowy : będzie ciężko, a wręcz chyba się nie uda, napisać jakiegokolwiek programu z sensem
    bez poświęcenia czasu na K&R w całości.

    Dodano po 14 [minuty]:

    OlegTor napisał:
    Tak na szybko zapytam, czy te ostrzeżenia kompilatora mogą wpłynąć na niepoprawny przekaz danych do terminala w PC i dlatego zapis macierzy "dotyku" działa niepoprawnie?


    I tu odpowiedź może być tylko filozoficzna : mogą ale nie muszą.

    A o jakim terminalu teraz jest mowa ?
    Bo wyglądało mi na to, żeś ekran z procesorem podłączył do stm32 z rodziny 103 i ten procesor programowany jest z PC za pośrednictwem
    któregoś ze środowisk dla stm32. Czy jestem całkiem w mylnym błędzie ?

    Z ukłonami
    Andrzej Korycki
  • #11 17731456
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Korzystam akurat z Terminal v1.9, STMa programuje przez bootloader i FlyMcu.
  • #12 17734127
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Korzystając ze swojego tematu zapytam o jeden problem.
    Gdy przełączam w programie z jednego zbioru listy ekranowej na inną to na ekranie widać naprzemienne ciągłe miganie z poprzedniego układu na ekranie. Gdy korzystałem tylko z jednego okna ekranu to nie wiedziałem, że taki problem istnieje.

    W jaki sposób powinno się poprawnie skasować poprzedni wpis do FT800 i wprowadzić nową listę?
  • #13 17735724
    AndrzejKor
    Poziom 13  
    Posty: 58
    Pomógł: 8
    Ocena: 5
    Dobry wieczór
    Przed rysowaniem należy wywołać funkcję StartDisplayft800cmd()
    A po zakończonym rysowaniu EndDisplayft800cmd()
    I nic nie będzie mrygać.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Z ukłonami
    Andrzej Korycki
  • #14 17735759
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    AndrzejKor, korzystam z HALa i mam trochę inną składnię, ale podobny mam kod początku i końca obsługi wyświetlacza.
    Choć już rzuciło mi się w oczy niepotrzebne czekanie na zakończenie w EndDisplayft800cmd. Takie oczekiwanie ma sens jak mi się wydaje tylko na początku StartDisplayft800cmd.

    Do czego używasz funkcji cmd_execute, a w zasadzie ft800cmd?

    A jeśli chodzi o migotanie to po ponownym wgraniu tego samego kodu miganie ustąpiło. Nie wiem dlaczego wcześniej istniało...
  • #15 17739170
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Dalej nie rozumiem dlaczego mam za każdym razem różne odczyty z rejestrów macierzy dotyku.
    Zmodyfikowałem tylko kod z pierwszego postu, tak aby wyświetlał wartości tych 6 rejestrów na ekranie.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    i odrazu wyświetlam przez: cmd_number(40, 0, 21, 0, ts0); ...

    Rozrzut jest olbrzymi, od bliskich zera liczb znaczących po maksymalne wartości dla tych samych rejestrów. Może trzeba wolniej odczytywać dane, albo w ściśle określonych momentach?
  • #16 17740366
    oloam
    Poziom 22  
    Posty: 683
    Pomógł: 50
    Ocena: 197
    Po pierwsze czy zrobiles tak jak miales podpowiedziane - jednorazowa kalibracja i zapis jesj do pamieci nieulotnej, po resecie wczytanie danych. Czy wtedy dotyk dziala prawidlowo? To sa zalecania producenta.

    Po drugie moglbys wrzucis odczyty rejestrow kalibracyjnych (kilka, zeby mozna bylo je prownac).
  • #17 17741832
    AndrzejKor
    Poziom 13  
    Posty: 58
    Pomógł: 8
    Ocena: 5
    Dzień dobry

    Autor nie mógł wrzucić, to ja wrzucę, sześć różnych wyników kalibracji, każda akceptowalna.
    Kolejność jak w równaniach :
    x' = x * A + y * B + C
    y' = x * D + y * E + F str. 28 programmers guide.

    0x624B 0xFFFFFF5A 0xFFF21532
    0x193 0x5BB8 0xFFF1DFD2

    0x63F6 0xFFFFFD7B 0xFFF6775B
    0x87 0x68E7 0xFFDF44EB

    0x634F 0xC1 0xFFF04E4F
    0x229 0x6999 0xFFD945B7

    0x664F 0xFFFFF9D3 0xFFF41FA9
    0x1B3 0x688D 0xFFDBDD83

    0x65F8 0xFFFFFDAB 0xFFF262A0
    0x52 0x69B5 0xFFDEECE7

    0x6211 0x346 0xFFF0B961
    0xF3 0x6AF9 0xFFD9A2D1

    Z ukłonami
    Andrzej Korycki
  • #18 17744088
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    U mnie rozrzut jest trochę większy, ale zakładam że może to być normalne.
    Tylko, kalibruję następnie je odczytuję i od razu zapisuje do rejestrów, po czym dotyk przestaje normalnie działać.

    Jeśli pobrane wyniki z rejestrów są dobre to może błędnie zostają zapisane do rejestrów sterownika ekranu?

    Funkcja odczytu z HALa:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    odczyt przez: ts0 = ft800memRead32( REG_TOUCH_TRANSFORM_A ) dla ts0 jako unsigned long.

    Zapis w HALu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Zapis przez: ft800memWrite32( REG_TOUCH_TRANSFORM_A, ts0)

    Czy gdzieś w tym kodzie może kryć się problem?
  • #19 17744193
    AndrzejKor
    Poziom 13  
    Posty: 58
    Pomógł: 8
    Ocena: 5
    OlegTor napisał:

    Tylko, kalibruję następnie je odczytuję i od razu zapisuje do rejestrów, po czym dotyk przestaje normalnie działać.

    Jak skalibrowałeś, to w odpowiednich rejestrach już są wartości. Po co wysyłać je ponownie i w dodatku chyba źle ?
    OlegTor napisał:

    Czy gdzieś w tym kodzie może kryć się problem?


    Oj może.
    Timeout masz ustawiony na 0 - to trochę mało. Ale tu pewności nie mam żadnej.

    Z ukłonami
    Andrzej Korycki
  • #20 17744593
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    AndrzejKor napisał:
    OlegTor napisał:

    Tylko, kalibruję następnie je odczytuję i od razu zapisuje do rejestrów, po czym dotyk przestaje normalnie działać.

    Jak skalibrowałeś, to w odpowiednich rejestrach już są wartości. Po co wysyłać je ponownie i w dodatku chyba źle ?
    Po to żeby sprawdzić poprawność odczytu i zapisu do rejestrów.
    Więc gdzie kryje się problem zapisu do tych rejestrów?
  • #21 17745411
    oloam
    Poziom 22  
    Posty: 683
    Pomógł: 50
    Ocena: 197
    OlegTor napisał:
    Tylko, kalibruję następnie je odczytuję i od razu zapisuje do rejestrów...
    OlegTor napisał:
    Po to żeby sprawdzić poprawność odczytu i zapisu do rejestrów.

    Zrob jeszcze jeden odc zyt i sprawdz czy w rejestrach sa te dane, ktore zapisales.
    Jak mozesz wrzuc jeszcze konfiguracje spi.
  • #22 17746668
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    O to chodzi, że zapis do rejestrów jest niepoprawny.
    Dlatego wyżej pokazałem kody w których kryje się błąd zapisu do rejestrów.

    Czy widać w nich gdzie jest problem?

    Zauważyłem, że w powyższych kodach makro MEM_READ=0, a MEM_WRITE=0x80.

    Konfiguracja SPI jest raczej poprawna, ponieważ poza dotykiem wszystko działa (chyba, że o czymś nie wiem...).
  • Pomocny post
    #23 17747720
    oloam
    Poziom 22  
    Posty: 683
    Pomógł: 50
    Ocena: 197
    OlegTor napisał:
    Czy widać w nich gdzie jest problem?

    W zapisie nie widze, Dlatego prosilem:
    oloam napisał:
    Zrob jeszcze jeden odc zyt i sprawdz czy w rejestrach sa te dane, ktore zapisales.

    Jezeli otzrzymasz takie same dane to nie problem w zapisie.
    OlegTor napisał:
    ...MEM_WRITE=0x80.
    - Prawidlowo.
    OlegTor napisał:
    Konfiguracja SPI jest raczej poprawna, ponieważ poza dotykiem wszystko działa (chyba, że o czymś nie wiem...).

    Ja tez nie wiem bo jej nawet nie widzialem, ale jak jestes pewien, ze jest ok,to raczej zostaje :
    - niepoprawne definicje adresow rejestrow ft8xx
    -usterka sprzetowa

    Nie rozumie dlaczego kod stanowi taka tajemnice? Wkleilbys wszystko co jest wykonywane do kalibracji i wtedy mozna analizowac...
  • #24 17748696
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Kod konfiguracji niestanowi tajemnicy ponieważ generuje go automatycznie CubeMX i dlatego go nie wstawiałem. Procesor taktowany jest 72MHz, SPI na 9MBits/s, CPOL-low, CPHA-1 edge.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Czy tu może kryć się problem?
    Na pewno te przesunięcie adresowe MEM_WRITE=0x80 jest normalne?
  • #25 17748833
    oloam
    Poziom 22  
    Posty: 683
    Pomógł: 50
    Ocena: 197
    SPI wyglada ok.
    Wciaz nie napisales czy po zapisie i ponownym odczycie masz takie same w rejestrach co zapisywales (i jakie one sa)?
    Rozumie, ze adres REG_TOUCH_TRANSFORM_A masz 0x10251c (tez nie napisales) a nastepne o 0x4 wyzsze (?)
    OlegTor napisał:
    Na pewno te przesunięcie adresowe MEM_WRITE=0x80 jest normalne?

    Cytat:
    4.1.5Host Memory WriteFor SPI memory write transaction, the host sends a ‘1’bit and ‘0’bit, followed by the 22-bit address. This is followed by the write data.


    Moze jeszcze byc sytuacja ze nie ustawiasz czulosci dotyku w rejestrze REG_TOUCH_RZTHRESH (zalecane 1200). Ekran jest skalibrowany poprawnie ale czulosc zbyt wysoka i nie reaguje poprawnie( domyslnie po resecie 0xffff)
  • #26 17749458
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Przecież napisałem wyżej, że odczytuje rejestry i te dane ponownie zapisuje do odpowiednich rejestrów. Gdy odczytuje je(tą samą funkcją), sprawdzając czy są poprawne to okazuje się że są zupełnie inne (wszystkie są zerowe oprócz REG_TOUCH_TRANSFORM_A)
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Gdy odczytuje je(tą samą funkcją), sprawdzając czy są poprawne to okazuje się że są zupełnie inne (wszystkie są zerowe oprócz REG_TOUCH_TRANSFORM_A)
  • #27 17749514
    oloam
    Poziom 22  
    Posty: 683
    Pomógł: 50
    Ocena: 197
    OlegTor napisał:
    Gdy odczytuje je(tą samą funkcją), sprawdzając czy są poprawne to okazuje się że są zupełnie inne (wszystkie są zerowe oprócz REG_TOUCH_TRANSFORM_A)

    Tego nie pisales.
    Moze pokasz jaki masz kod w calosci od kalibracji do drugiego odczytu (po wczesniejszym zapisie), bo do tej pory wszystko jest ok.
    Troche dziwi mnie tez to miganie ekranu , ktore opisales wczesniej.
    Podaj jeszcze prosze typ/model wyswietlacza i jego kod inicjalizacji
  • #28 17750753
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Napisałeś że przsunięcie między adresami MEM_READ=0, a MEM_WRITE=0x80. jest poprawne. Możesz to wytłumaczyć dlaczego normalną rzeczą jest inny adres zapisu i odczytu tego samego rejestru?

    Miganie jest zależne od tego jakie wyświetlane obiekty wpisuję do FT800, ale tego jeszcze nieogarnąłem...
  • Pomocny post
    #29 17750963
    oloam
    Poziom 22  
    Posty: 683
    Pomógł: 50
    Ocena: 197
    OlegTor napisał:
    ft800cmdWrite(FT800_CLK48M);
    <- ustawienia domyslne
    OlegTor napisał:
    ft800memWrite8(REG_PCLK, ZERO);
    <-ustawienia domyslne
    OlegTor napisał:
    ft800memWrite8(REG_TOUCH_MODE, 3);
    <-ustawienia domyslne
    OlegTor napisał:
    ft800memWrite8(REG_TOUCH_ADC_MODE, 1);
    <-ustawienia domyslne
    OlegTor napisał:
    ft800memWrite16(REG_TOUCH_CHARGE, 5000);
    <- wywal lub zmien na domyslne 6000, nie wiem jaki to ma wplyw na dotyk ale zmiejszasz czas podawania napiecia przed probkowaniem dotyku
    OlegTor napisał:
    ft800memWrite8(REG_TOUCH_SETTLE, 3);
    <-ustawienia domyslne
    OlegTor napisał:
    ft800memWrite8(REG_TOUCH_OVERSAMPLE, 7);
    <-ustawienia domyslne

    Tu wyglada wszystko ok.
    Prosilem tez o rodzaj wyswietlacza (datasheet) zeby sprawdzic ustawienia synchronizacji i odswiezania.
    Nie widze tez kodu kalibracji.
    Poki co te fragmenty kodu wygladaja ok.
    OlegTor napisał:
    Napisałeś że przsunięcie między adresami MEM_READ=0, a MEM_WRITE=0x80. jest poprawne. Możesz to wytłumaczyć dlaczego normalną rzeczą jest inny adres zapisu i odczytu tego samego rejestru?

    Wszystko jest w datasheet:
    FT800 - różne wartości kalibracji dotyku po każdym uruchomieniu
    FT800 - różne wartości kalibracji dotyku po każdym uruchomieniu
  • #30 17751566
    OlegTor
    Poziom 10  
    Posty: 193
    Pomógł: 1
    Ocena: 12
    Nie wiem czy to są dane ekranu, ponieważ odkupiłem go od kolegi i nie wiem w jakim sklepie została kupiona, ale na płytce sterownika jest napisane FT800CB.

    Kalibracja:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

Podsumowanie tematu

✨ Użytkownik napotkał problem z ekranem FT800, polegający na tym, że wartości kalibracji dotyku różnią się po każdym uruchomieniu. W odpowiedziach podano, że różnice te są normalne, ponieważ kalibracja nie zawsze trafia w ten sam punkt. Użytkownicy sugerowali zapisanie wartości kalibracji w pamięci nieulotnej oraz ponowne ich wczytanie po restarcie. Wskazano również na konieczność sprawdzenia poprawności odczytu i zapisu do rejestrów, a także na możliwość, że problem może wynikać z błędów w kodzie lub zbyt szybkiej transmisji danych. Dodatkowo, użytkownicy podzielili się swoimi doświadczeniami z kalibracją oraz kodem, który może pomóc w rozwiązaniu problemu.
Wygenerowane przez model językowy.
REKLAMA