Skocz do zawartości

Jak odczytywać wykresy przesyłu danych ?


w1941srobot

Pomocna odpowiedź

Witam borykam się z problemem 😐 odczytywania takich oto wykresów i teraz czas na pytanie czy są może jakieś poradniki odnośnie takich rzeczy, sam bym poszukał ale nie mam jakiegoś punktu zaczepienia. Potrzebne jest mi to do np. obsługi w BASCOMIE wyświetlaczy od noki 3310, układu w myszy optycznej ADNS2051 który teoretycznie może służyć jako detektor koloru. Proszę o wszystkie zagadnienia związane z tym bajerem. Głownie chodzi o wysyłanie danych przez SPI w BASCOMIE są oto takie komendy: SPIOUT, ale o ile się nie mylę działałoby to tylko z drugim uC ale nie z np. wyświetlaczem. Proszę o pomoc i polecenia jakichś poradników w ktorych opisany jest protokół spi używanie go w bascomie wszystko związane z tymi wykresami i działaniem. 😐 Może nie do końca dobrze to wyjaśniłem ale nw jak to opisać dokładnie.

Link do komentarza
Share on other sites

Głownie chodzi o wysyłanie danych przez SPI w BASCOMIE są oto takie komendy: SPIOUT, ale o ile się nie mylę działałoby to tylko z drugim uC ale nie z np. wyświetlaczem.

SPI to SPI. Nie zależy od języka programowania. Nie ważne jest też co z czym się komunikuje. Istotne jest jedynie aby jedno z tych urządzeń pełniło rolę 'mastera'.

Tutaj masz opis SPI. Porównaj przebiegi czasowe komunikacji Twojego urządzenia i tych z dokumentacji SPI. Jest duża szansa, że będą bardzo podobne.

Nie wiem jak obsługuje się SPI w BASCOMIE, pewnie coś o tym jest w dokumentacji. Jeżeli nie to możesz napisać własne funkcje opierając się o datasheet procka.

Link do komentarza
Share on other sites

Potrzebne jest mi to do np. obsługi w BASCOMIE wyświetlaczy od noki 3310

Z tego co pamiętam, to na necie jest bardzo dużo gotowych kodów w Bascomie do tego wyświetlacza. Sam kiedyś nawet z tego korzystałem.

Link do komentarza
Share on other sites

Protokół SPI to jedno, natomiast samo odczytywanie wykresów to drugie.

Spójrz na ten górny wykres z SCLK i SDIO. Najważniejsze na tych wykresach są:

a) zbocza (moment ustawienia sygnału na jakąś wartość)

b) ewentualne dodatkowe informacje o czasie (czyli np. minimalny czas pomiędzy kolejnymi zboczami itp.)

Teraz na tym górnym wykresie łatwo zauważysz, że jak SCLK (czyli sygnał zegarowy) idzie w dół to SDIO zmienia swoją wartość. Natomiast jak SCLK idzie w górę to SDIO utrzymuje swoją wartość (i reprezentuje jakieś dane np, odpowiednio 0, A6,A5,...).

Wniosek jest taki, że jak sterujesz SDIO to powinieneś zmieniać jego stan w momencie gdy SCLK zmienia się na 0. No i odwrotnie jak czytasz wartość z SDIO to powinieneś to robić w momencie gdy SCLK zmienia wartość na 1.

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

Teraz na tym górnym wykresie łatwo zauważysz, że jak SCLK (czyli sygnał zegarowy) idzie w dół to SDIO zmienia swoją wartość. Natomiast jak SCLK idzie w górę to SDIO utrzymuje swoją wartość (i reprezentuje jakieś dane np, odpowiednio 0, A6,A5,...).

Wniosek jest taki, że jak sterujesz SDIO to powinieneś zmieniać jego stan w momencie gdy SCLK zmienia się na 0. No i odwrotnie jak czytasz wartość z SDIO to powinieneś to robić w momencie gdy SCLK zmienia wartość na 1.

Mowisz o roznych trybach pracy SPI czy jeszcze o czyms innym?

b) ewentualne dodatkowe informacje o czasie (czyli np. minimalny czas pomiędzy kolejnymi zboczami itp.)

To chyba zalezy od czestotliwosci SPI. Faktycznie, jezeli dokumentacja nie okresla tego wprost to wtedy nalezy to przeanalizowac. Jednak mysle ze do testow i nauki najlepiej korzystac z najnizszej dostepnej predkosci.

Do takiej zabawy z SPI i innymi protokolami przydatny jest 'analizator stanow logicznych'. ja dzieki temu zrozumialem zasade dzialania SPI i I2C. Za kilka zlotych mozesz sobie zlozyc taki analizator, ktory spokojnie wystarcza tdo podejrzenia komunikacji.link

Link do komentarza
Share on other sites

Chodzi mi o ustwianie czasów w atmedze, jak je ustawiać za pomocą bascoma. Tak dla przykładu mógłby ktoś opisać wysłanie jednej komendy do wyświetlacza nokia 3310 :->.

I czy coś takiego miałoby prawo działać sklepałem to z tutoriala o spi na forbot. Jest to program wysyłający komendę odwracająca pixele na ekreanie.

$regfile = "m8def.dat"                                      'zadeklarowanie użytego procesora
$crystal = 1000000                                          'zadeklarowanie szybkości wewnętrznego kwarcu
'$noramclear



$ASM

ldi r16,&B00101100
out DDRD,r16                 'porty mosi sck ss jako    wyjscia
ldi r16,&B01010000
out SPCR, r16
                ' konfiguracja spi
ldi r19,&B00001101             ' bajt do wyslania (odwraca pixele na ekranie)


out SPDR, r19                 ' wpisanie bajtu z e19 do rejestru SPDR
Czekaj_na_wyslanie:
sbis spdr, spif                  'sprawdzanie czy wyslalo
rjmp Czekaj_na_wyslanie
$END ASM

[ Dodano: 24-08-2012, 13:14 ]

Protokół SPI to jedno, natomiast samo odczytywanie wykresów to drugie.

Spójrz na ten górny wykres z SCLK i SDIO. Najważniejsze na tych wykresach są:

a) zbocza (moment ustawienia sygnału na jakąś wartość)

b) ewentualne dodatkowe informacje o czasie (czyli np. minimalny czas pomiędzy kolejnymi zboczami itp.)

Teraz na tym górnym wykresie łatwo zauważysz, że jak SCLK (czyli sygnał zegarowy) idzie w dół to SDIO zmienia swoją wartość. Natomiast jak SCLK idzie w górę to SDIO utrzymuje swoją wartość (i reprezentuje jakieś dane np, odpowiednio 0, A6,A5,...).

Wniosek jest taki, że jak sterujesz SDIO to powinieneś zmieniać jego stan w momencie gdy SCLK zmienia się na 0. No i odwrotnie jak czytasz wartość z SDIO to powinieneś to robić w momencie gdy SCLK zmienia wartość na 1.

Czyli tak jeśli np. według tego wykresu (wyświetlacz nokia 3310):

Chciałbym wysłać jakąś komendę muszę zrobić tak w datasheet jest napisanie że wysłanie komendy odbywa się poprzez ustawienie lini D/C w stan niski. może przedstawie pomysł w pseudo algorytmie 😃: Najpierw konfiguruje SPI, plus do tego muszę zaciągnąć dodatkowe porty (D/C czyli np. PB2 i RES czyli PB1), Ustawiam stan niski w porcie PB2 na odpowiedni czas, /SCE ustawiam na niski tak samo na odpowiedni czas ale skąd mam wiedzieć kiedy ustawić stan wysoki, potem na SCLK podaje 010 cały czas do puki nie wyślę tego bajtu? Czy ktoś może to przedstawić bascomie jak ustawiać te porty 🙁.

Link do komentarza
Share on other sites

Jeżeli chodzi o wyświetlacz z N3310, to zalerzy jaki model ci sie trafi, bo istnieje pewna pułapaka. 😕 widoczna na zdjęciu.

Obrazek

Na szczęście jest naprawialna.

Wiem czytałem o ty male teraz głownie chodzi mi o obsługę tego wyświetlacza w bascomie,
widziałem na necie gotowy program ale ja chciałbym wykonać go samodzielnie 🙂.

Link do komentarza
Share on other sites

Podane na wykresach czasy są ważne, bo od ich spełnienia zależy prawidłowe funkcjonowanie interfejsu. Z jednej strony są to czasy które Ty musisz zapewnić a z drugiej są wartości gwarantowane przez producenta scalaka - wtedy powinieneś z nich skorzystać.

Na pierwszym rysynku jaki zamieściłeś pokazana jest wymiana danych z czujnikiem myszy (jak rozumiem). Zauważ, że transmisja jest dwyukierunkowa ale po jednym drucie - to nie jest typowe dla kanonicznego SPI. W AVRach, w typowym przypadku gdy procesor jest masterem SPI masz jedną linię do nadawania (MOSI) a drugą linią (MISO) odbierasz dane. Nie można ich tak po prostu zewrzeć, bo linia MOSI nigdy nie pozwoli by ktoś jeszcze ją zajął. W takim przypadku musisz podjąć decyzję czy chcesz korzystać z wbudowanego, sprzętowego interfejsu SPI czy będziesz gadał z tym 2051 programowo. W pierwszym przypadku musisz stworzyć fragment (gałąź) SPI z linią danych dwukierunkową, odseparowaną od reszty bramką trójstanową. To nic wielkiego, robię tak często i to żadnafilozofia. Korzystasz wtedy z wszelkich dobrodziejstw sprzętu: automatycznej transmisji bajtów, przerwań i programowanej szybkości. W drugim przypadku podłączasz po prostu ten czujnik do którychś mniej cennych wyprowadzeń procesora a całość protokołu robisz "ręcznie". Będzie Ci potrzebna wyjściowa linia zegara oraz dwukierunkowa linia danych - kierunkiem będziesz musiał sterować programowo, za pomocą manipulacji w odpowiednim rejestrze DDR.

Nie wiesz kiedy zmieniać stany? To popatrz na wykres. 2051 wymaga, by dane pojawiły się najpóźniej na 60ns oprzed narastającym zboczem zegara i były tam obecne jeszcze przez conajmniej 120ns (niech żyje umiejętność zachowywania proporcji na rysunku). To mało czasu (w stosunku do szybkości procesora), choć w świecie systemów cyfrowych standartem byłyby czasy odpowiednio np. 0 i 5ns 🙂

Cykl pracy Twojego procesora przy zegarze 8MHz to 125ns. Nawet jeżeli wykonasz tuż po sobie dwie instrukcje asemblerowe: jedną wystawiającą bit na linię danych i drugą ustawiającą linię zegara w stan 1 to i tak czas 60ns zostanie zachowany - nazywa się to setup time. W przypadku czasu przetrzymywania danych (hold time) nie jest już tak różowo i gdybyś zaraz po ustawieniu zegara w stan 1 zmienił stan linii danych, byłoby na styk. Przy szybszym zegarze procesora mogłoby już nie zadziałać. Na szczęście procesor ma do wykonania kilka innych rzeczy zanim wystawi nową daną, trzeba przecież przesunąć jakiś rejestr, sprawdzić stan bitu przeznaczonego do nadania i wreszcie go wystawić na port. Z wykresu wygląda, że 2501 jest przywyczajony do "parkowania" zegara w stanie wysokim, tak więc jeśli Twoja sekwencja będzie wyglądała mniej więcej tak:

1. DATA=kolejny bit do nadania

2. CLK=0

2. CLK=1

4. Przygotuj kolejny bit do nadania, odlicz licznik bitów itp

5. Powtórz od kroku 1

to będzie OK. Poniżej 8MHz kolejność kroków 1 i 2 jest dowolna - w każdym przypadku czas 60ns będzie zachowany.

Na wykresie pokazano natomiast pewien szczególny przypadek, gdy zmienia się kierunek transmisji. Nie znam tego układu ale zakładam, że najpierw wysyłasz do niego jakąś komendę (adres rejestru itp) a następnie coś do niego piszesz (wtedy jest prosto) albo chcesz coś odczytać. I właśnie w tym drugim przypadku, po wysłaniu 8 bitów musisz poczekać aż 100us. To bardzo długo (dla procesora) ale coż, widocznie wewnątrz 2501 też siedzi coś inteligentnego i potrzebuje czasu na załapanie o co chodzi i przygotowanie danych do wysłania. Dopiero po tym czasie możesz wystartować sekwencję odczytu bajtu, zmieniając oczywiście wcześniej kierunek odpowiedniej linii portu na wejściowy. Zauważ, że 2501 nie wysteruje swojej linii danych dopóki nie zobaczy pierwszego opadającego zbocza zegara więc nie ma obawy, że nie zdążysz ze swoją zmianą kierunku i że przez chwilę będzie konflikt dwóch wyjść na jednym drucie. Najwyżej przez jakiś czas linia danych nie będzie sterowana przez nikogo (stan wysokiej impedancji, Hi-Z) a w celu ustalenia jakiegoś sensownego stanu możesz ją podciągnąć opornikiem np. 10k do plusa zasilania.

Sposób z bramką trójstanową na linii MOSI na pewno sam wymyślisz.

Wyświetlacz? Pokaż wykresy i zapytaj o konkrety.

Link do komentarza
Share on other sites

Dzięki trochę mi to rozjaśniliście 🙂, ok marek1707 wyswietlacz: nokia 3310 to jest wykres:

w datascheet pisze że bity są przesyłane przy stanie CLK wysokim który ma trwać 100ns jak i stan niski 100ns, tylko jest ale jak tak czytam to pisze że zaraz po wysłaniu bajtu do rej. SPDR odbywa się wysłanie tego bajtu do np. wyświetlacza to jak ja mam sprawić aby wysyłało po 1 bicie w stanie wysokim CLK trwającym 100ns w języku BASCMI ?. A tu tak w punktach moje przypuszczenia, proszę o sprawdzenie i wyjaśnienie niejasności :

1. Konfiguracja Sprzętowego SPI

2. Utworzenie zmiennej bajt która zawiera komendę do wyświetlacza

3. Wprowadzam stan niski na SCE ( jak? skąd mam wiedzieć na ile? skoro 1 wyslanie bitu trwa 100X2ns to muszę ustawić stan niski na 1600ns ? )

4. Wprowadzam stan niski na D/C (na ile?, i czy można taką komendą PORTB.1 = 1)

5. CLK = 0 na 100ns (jak tak sobie ustawiać w BASCOMIE, skoro odrazu po wpisaniu do SPDR wysyła)

6 ClK = 1 na 100ns

7. Wysłanie 1 bitu, tylko jak wysłać pojedynczo 🙁?

8. Do punktu 1.

Link do komentarza
Share on other sites

Bity nie są przesyłane "przy stanie CLK wysokim" tylko są zatrzaskiwane (zapamiętywane przez odbiornik) przy pewnym kierunku zbocza zegara. Ważny jest tylko jeden moment, zbocze a nie stan linii - powinieneś to wyraźnie odróżniać. Z rysunku wychodzi, że tak jak pisał Mirek musisz zapewnić jedynie to, by podczas zbocza narastającego dane były ważne.

1. Jest opisana w dokumentacji procesora, nie ma się co rozwodzić. Zadaj konkretne pytanie. Oczywiście konfigurację robisz tylko raz chyba, że różne urządzenia podłączone do szyny szeregowej wymagają różnych protokołów. W tym przypadku znajdź taki tryb (1 z 4) który zapewni "parkowanie" zegara w stanie 0 i pojawienie się danych przed pierwszym zboczem zegara. Potem już pójdzie samo.

2. No jasne..

3. Po prostu zanim coś załadujesz do rejestru SPDR wyzeruj linię SCE.

4. Z rysunku widać, że wyświetlacz jest zainteresowany stanem linii D/C tylko podczas trwania ostatniego bitu. Przed i po tym czasie może tam być cokolwiek. Nic nie stoi na przeszkodzie, byś ustawił odpowiedni stan D/C przed wysłaniem każdego bajtu, czyli przed załadowaniem rejestru SPDR.

5,6,7 - tego zupełnie nie rozumiem. Bajt wysyła się sam. Czekasz tylko na odpowiedni bit gotowości oznaczający, że sprzęt wysłał dane szeregowo z zadaną prędkością - ustawiłeś ją przecież podczas konfiguracji. Po wysłaniu bajtu podnosisz SCE, nie martwisz się stanem D/C (i tak ją znów dobrze ustawisz przed nastepną transmisją) i koniec.

Czy transmisje do tego wyświetlacza są tylko 1-bajtowe? Jeżeli nie, funkcja wysyłająca całe "zestawy" danych musi uaktywniać SCE przed pierwszym bajtem i podnosić do stanu wysokiego po ostatim bajcie - to chyba oczywiste.

EDIT: literówki

EDIT2: Dobra, odkorkowało mi się w głowie. Przygotowuję "na wczoraj" projekt w firmie i trochę mam odleciany dzień. Używałem tego wyświetlacza, nic trudnego. W danych katalogowych kontrolera masz wszystkie komendy i czasy opisane. Nic tylko robić 🙂 Może umówmy się, że używamy tej wersji pliku:

http://www.amontec.com/lcd_controller_pcd8544.pdf

i przez odwołania do konkretnych stron lub rysunków będziemy mówić o szczegółach, OK?

To zadziała pod warunkiem, że właśnie ten kontroler masz w swoim LCD. O ile pamiętam były różne wykonania tego modułu.

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

A nie prościej wykorzystać sobie sprzętowy SPI, który siedzi w ATMEGA8. Ustawiasz sobie tylko szybkość SPI na 2MHz (MAX dla N3310 jak pamiętam to 4MHz), odpowiednio zbocza i tyle.

Wszystko można wtedy ładnie oprogramować w przerwaniach od SPI i stworzyć w pełny działający w tle system obsługi LCD. Trochę więcej może i pracy z tym, ale jak to sobie dobrze zrobisz to masz gotową fajną bibliotekę do RTOSa praktycznie.

PS. Co chcesz wyświetlać na tym LCd ? Tylko napisy czy grafikę też ?

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.