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.

Atmega32 [C] - Nie działa SPI z xpt2046

p0ld3k 03 Kwi 2015 19:20 1674 27
  • #1 03 Kwi 2015 19:20
    p0ld3k
    Poziom 8  

    Witam,
    siedzę nad tym już któreś popołudnie i nie mogę sobie poradzić.
    Mam wyświetlacz TFT ze sterownikiem SSD1963 i na pokładznie jest jeszcze sterownik do panelu dotykowego xpt2046. Z wyświetlaczem jakoś sobie poradziłem, natomiast z dotyku działa tylko sygnał IRQ, chociaż i to ostatnio szwankuje...
    Oto kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zwracana wartość to cały czas 8190. Jest jeszcze problem z sygnałem IRQ, gdy linie sterownicze nie są podłączone to działa za każdym razem, a jak je podłącze do mikrokontrolera to łapie raz na jakiś czas. Linia CS xpt2046 jest na stałe podłączona do GND.

    0 27
  • #2 03 Kwi 2015 20:57
    Drako1988
    Poziom 20  

    Witaj

    Nie wiem z jaką częstotliwością taktujesz procesor, ale patrząc na kod problem masz pewnie w sterowaniu sygnałem zegara.

    We wszystkich funkcjach obsługi SPI masz:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Natomiast zgodnie z notą max częstotliwość zegara SPI dla XPT2046 to 2,5MHz.
    U Ciebie częstotliwość zegara teoretycznie == FCPU/2, czyli jeśli masz kwarc 16MHz to zegar SPI masz 8MHz a to trochę za dużo.
    Wstaw jakiś delay pomiędzy SCK_1 i SCK_0 może to pomoże.

    0
  • #3 03 Kwi 2015 22:18
    p0ld3k
    Poziom 8  

    Atmega taktowana jest zegarem 8MHz, powstawiałem opóźnienia i teraz wynik jest za każdym razem równy 0, próbowałem różnych opóźnień (od 1us do 20us) w różncyh miejscach i dalej to samo, jedynie przerwanie IRQ jest za każdym razem prawidłowo generowane (przy dotknięciu ekranu).
    EDIT:
    Działa ;)
    Problem był z definicją wejścia, bez względy na to czy MISO było podłączone do VCC czy GND, wynik zawsze był ten sam (po dodaniu opóźnień).
    Dzięki za pomoc ;)

    0
  • #4 25 Sty 2016 00:58
    Arek1111111111
    Poziom 7  

    Witam, jak powinna wyglądać prawidłowa inicjalizacja tego wejścia aby kod był poprawny?

    0
  • #5 24 Paź 2016 22:04
    kris27ok
    Poziom 10  

    witam zmodyfikowany kod pod sprzętowe SPI niestety nie działa brak wyświetlania informacji o współrzędnych
    czekam na sugestie...
    avr mega 32 zegar wewn 8MHz
    main fragment

    Kod: c
    Zaloguj się, aby zobaczyć kod

    oraz obsługa touch
    Kod: c
    Zaloguj się, aby zobaczyć kod

    funkcja send
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 11 Lis 2016 14:02
    kris27ok
    Poziom 10  

    ???
    Czy ktoś ma jakiś pomysł

    0
  • #7 11 Lis 2016 15:48
    BlueDraco
    Specjalista - Mikrokontrolery

    Popisałeś jakieś bzdury. Zacznij od procedury, która nadaje i jednocześnie odbiera bajt po SPI. Używając tylko tej, bez dodatkowego machania liniami SPI, nadaj i odbierz 6 bajtów - nadajesz polecenia, odbierasz dane z XPT.

    0
  • #8 18 Lis 2016 22:52
    kris27ok
    Poziom 10  

    Kod: c
    Zaloguj się, aby zobaczyć kod


    obsługa

    Kod: c
    Zaloguj się, aby zobaczyć kod


    i w main

    printf(spr);

    a teraz??

    0
  • #9 18 Lis 2016 23:33
    BlueDraco
    Specjalista - Mikrokontrolery

    1. Miała być procedura nadawania/odbioru jednego bajtu.
    2. Popatrz na typy argumentów Twojej funkcji, typ wartości zwracanej i na jej wywołanie - błąd na błędzie. Korzystaj z podpowiedzi kompilatora i doprowadć program do takiej postaci, żeby nie było żadnych ostrzeżeń.
    3. Masz problemy z podstawami języka C, a nie z XPT2046.

    0
  • #10 19 Lis 2016 17:11
    kris27ok
    Poziom 10  

    1.wysyłanie i obieranie 1 bajtu było w poprzednich listingach

    Kod: c
    Zaloguj się, aby zobaczyć kod


    2. wywołanie
    spr= spi_fast_shift(0xD0);
    tez nie działa

    --tak wiem zmienne tablicowe zdefiniowane do tamtej funkcji i wywołanie zmiennej z tablicy....

    0
  • #11 19 Lis 2016 20:35
    BlueDraco
    Specjalista - Mikrokontrolery

    A wysyłania i odbioru 6 bajtów jak nie było, tak nie ma...

    0
  • #12 20 Lis 2016 21:52
    kris27ok
    Poziom 10  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #13 20 Lis 2016 22:13
    BlueDraco
    Specjalista - Mikrokontrolery

    Odbioru jakoś tu nie widzę. Kręcisz się w kółko i ignorujesz rady.

    0
  • #14 20 Lis 2016 22:16
    kris27ok
    Poziom 10  

    raczej nie ignoruje tylko od poczatku po kolei

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #15 20 Lis 2016 22:31
    BlueDraco
    Specjalista - Mikrokontrolery

    raczej np.:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    słowo extern w Twoim kodzie powyżej jest bez sensu i zapewne generuje błąd kompilacji.

    0
  • #16 20 Lis 2016 22:52
    kris27ok
    Poziom 10  

    to tak jak to chyba

    Kod: c
    Zaloguj się, aby zobaczyć kod

    a extern nie generuje bledu po poprostu zewnętrzna zmienna

    0
  • #17 20 Lis 2016 23:03
    BlueDraco
    Specjalista - Mikrokontrolery

    extern uint8_t get_data(uint8_t * data)

    oznacza deklarację procedury zdefiniowanej w innym pliku, a Ty właśnie ją tu definiujesz.

    dane wysyłane po SPI mają po 8 bitów,a Ty deklarujesz argumenty procedury transmisji jako wskaćniki na dane 16-bitowe, co oczywiście powoduej serię ostrzeżeń kompilatora, które ignorujesz, zamiast doprowadzić kod do postaci bez ostrzeżeń.

    Błąd na błędzie i koszmarny bałagan w tym programie.

    0
  • #18 20 Lis 2016 23:18
    kris27ok
    Poziom 10  

    1. extern jak najbardziej właściwie ponieważ zmienna jest w pliku wykonawczym do XPT a nie w głównym --pochopna ocena
    2. zatem nie ma ostrzeżeń ani błedu skoro program wchodzi do uPC!!
    3 z zmiennej 16 bit można wyciągnąć 8 bit ale ok zatem może być

    Kod: c
    Zaloguj się, aby zobaczyć kod


    co de facto było na początku i nie było błędem tylko zbędną deklaracja

    0
  • #19 20 Lis 2016 23:24
    grko
    Poziom 33  

    BlueDraco napisał:
    extern uint8_t get_data(uint8_t * data)

    oznacza deklarację procedury zdefiniowanej w innym pliku, a Ty właśnie ją tu definiujesz.


    To jest nieprawda. Każda deklaracja (nie statyczna) funkcji podlega linkowaniu zewnętrznemu. Więc extern przy deklaracji funkcji jest zbędne aczkolwiek nie jest błędem.

    BlueDraco napisał:

    dane wysyłane po SPI mają po 8 bitów,a Ty deklarujesz argumenty procedury transmisji jako wskaćniki na dane 16-bitowe, co oczywiście powoduej serię ostrzeżeń kompilatora, które ignorujesz, zamiast doprowadzić kod do postaci bez ostrzeżeń.


    Oświecisz nas może jakie to ostrzeżenia generuje?

    0
  • #20 20 Lis 2016 23:48
    BlueDraco
    Specjalista - Mikrokontrolery

    grko:

    Czy Ty sam definiujesz funkcje poprzedzając je słowem extern? Zatem wesprzyj zdanie Autora wątku, że jest to wlaściwa technika pisania programów.

    Błędem w kodzie powyżej było deklarowanie argumentów funkcji typu uint16_t* i przekazywanie w wywołaniu wskaźników na uint8_t.

    ... więc jak zwykle się czepiasz ...

    0
  • #21 20 Lis 2016 23:59
    grko
    Poziom 33  

    BlueDraco napisał:
    grko:

    Czy Ty sam definiujesz funkcje poprzedzając je słowem extern? Zatem wesprzyj zdanie Autora wątku, że jest to wlaściwa technika pisania programów.


    Po pierwsze, to Ty czepiasz się tego extern od kilku postów. Wypadałoby to jednak sprostować.

    BlueDraco napisał:
    grko:
    Błędem w kodzie powyżej było deklarowanie argumentów funkcji typu uint16_t* i przekazywanie w wywołaniu wskaźników na uint8_t.


    Gdzie niby kris27ok przekazuje wskaźniki na uint8_t do tej funkcji? Możesz łaskawie wskazać ten post? Ja widzę tylko to co wkleił kris27ok, czyli:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Niech lepiej to sprostuje kris27ok. Oba wywołania wyglądają na błędne (niezgodne z deklaracją funkcji).

    0
  • #22 22 Lis 2016 12:32
    kris27ok
    Poziom 10  

    Kod: c
    Zaloguj się, aby zobaczyć kod



    obsługa i przypisanie
    Kod: c
    Zaloguj się, aby zobaczyć kod


    ?? czy za bardzo kombinuje??

    0
  • #23 22 Lis 2016 13:17
    BlueDraco
    Specjalista - Mikrokontrolery

    Proponuję zacząć od "Hello, world" na PC i zrozumienia, czym jest stała, zmienna, wskaźnik i tablica w C.

    0
  • #24 22 Lis 2016 14:02
    kris27ok
    Poziom 10  

    Myślę ze lepiej będzie odpowiadać merytorycznie na problem a nie pokazywać swoją

    int_8t "wyższość" !! na forum ostatnie Mega krytyki kodu sprowadziły się do podania się procedury identycznej w działaniu jak na początku. w programowania zbyt duża ilość kwadracików może czasem zapełnić pamieć i zablokować kod procesora ale to nie jest przedmiotem dyskusji.

    Procedura działa tylko wyświetlane są błędne dane ... x, y

    0
  • #25 22 Lis 2016 14:26
    BlueDraco
    Specjalista - Mikrokontrolery

    Ano procedura działa, tylko zupełnie inaczej, niż to sobie wyobrażasz. Podejrzewam, że nie wiesz, co znajduje się w pamięci RAM pod adreesami 0x60 i 0xD0, a to właśnie stamtąd próbujesz wysyłać kolejno do drugi bajt do XPT2046. To, co odbierasz (podobno 6 bajtów) próbujesz zapisać do dwubajtowej zmiennej wskaźnikowej, a pustą wartość funkcji (czyli coś, czego nie ma) próbujesz zapisać do zmiennej. Ten kod nie ma nawet szans się skompilować.

    0
  • #26 22 Lis 2016 14:43
    kris27ok
    Poziom 10  

    BlueDraco napisał:
    RAM pod adreesami 0x60 i 0xD0,


    chyba 0x90 ... to tak na szybko

    0
  • #27 22 Lis 2016 14:47
    2675900
    Użytkownik usunął konto