Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 5 mar 2026, o 18:01


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
Autor Wiadomość
PostNapisane: 24 lut 2017, o 13:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 cze 2016
Posty: 40
Lokalizacja: Łódź
Pomógł: 1

Witam wszystkich.
Jestem w trakcie "robienia" biblioteki do obsługi lcd. Wadą a zarazem i zaletą tego wyświetlacza jest 3-pinowa transmisja danych (CS,SDA,CLK)
AtMega posiada sprzętowy interfejs SPI ale 8-mio bitowy, a tutaj jest potrzebny jeszcze dziewiąty do opcji COMAND/DATA.
Moje programowe SPI wygląda tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Działa bezbłędnie ale chciałbym przyśpieszyć wysyłanie danych.
Czy można skonfigurować SPI sprzętowe aby dało się wysyłać dane w takim formacie jak w załączonym kodzie?
Ewentualnie jak można inaczej zrealizować kod aby wysyłanie było bardziej "sprzętowe" lub szybsze?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 14:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 368
Lokalizacja: Gliwice
Pomógł: 34

radek3035 napisał(a):
Ewentualnie jak można inaczej zrealizować kod aby wysyłanie było bardziej "sprzętowe" lub szybsze?


Powinieneś zajrzeć do mirkowego poradnika na temat magic ledów, gdzie były opisywane, dodatkowe optymalizacje kodu dla transmisji szeregowych.
W skrócie musisz rozwinąć pętlę "for" do pojedynczych instrukcji, zyskasz wtedy na czasie, ale stracisz na objętości kodu w pamięci flash.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 15:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 cze 2016
Posty: 40
Lokalizacja: Łódź
Pomógł: 1

Zrobiłem tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Troszkę pomogło i jest ciut szybciej. Ale to jeszcze za mało.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 16:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 265
Lokalizacja: Norwegia
Pomógł: 16

Kolego a czy nie mylisz przypadkiem magistrali SPI z i2C? w Atmega masz śliczne i2c gotowe do śmigania.

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 17:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 368
Lokalizacja: Gliwice
Pomógł: 34

SP2LUB napisał(a):
Kolego a czy nie mylisz przypadkiem magistrali SPI z i2C? w Atmega masz śliczne i2c gotowe do śmigania.

Myślę, że Kolega nic nie myli, ale dowiemy się gdy sam się wypowie:)
SDA - to Serial Data
CS - Chip Select
CLK - Clock

SDA to prawdopodobnie zbieżność nazw z TWI.
A reszta nazw to klasyka dla transmisji szeregowej, w szerokim rozumieniu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 18:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 cze 2016
Posty: 40
Lokalizacja: Łódź
Pomógł: 1

W datasheet jest napisane: 3-pin 9 bits Serial Peripheral Interface (SPI)
Nazwy nadałem sam. Tak jak Zealota napisał SDA - Serial Data etc.
Obrazek



Ostatnio edytowano 24 lut 2017, o 18:27 przez radek3035, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 18:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 265
Lokalizacja: Norwegia
Pomógł: 16

Ok ja tam sie nie znam, ale w magistrali SPI widzę MOSI i MISO natomiast nazwy linii które podajesz są charakterystyczne dla I2C. Tak samo wyświetlacz LCD który chcesz sterować jest zrobiony pewnie dla magistrali I2C.
Jak mówię ja się nie znam i początkujący jestem, ale SPI to SPI a I2C to I2C po coś te nazwy wprowadzono i łatwiej się poroznmiewać używając takich określeń. Tym bardziej że Atmega ma rozwiązania sprzętowe zarówno dla SPI jak i I2C więc nic tylko odpalać i śmigać.

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 18:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 cze 2016
Posty: 40
Lokalizacja: Łódź
Pomógł: 1

SP2LUB napisał(a):
Ok ja tam sie nie znam, ale w magistrali SPI widzę MOSI i MISO natomiast nazwy linii które podajesz są charakterystyczne dla I2C. Tak samo wyświetlacz LCD który chcesz sterować jest zrobiony pewnie dla magistrali I2C.
Jak mówię ja się nie znam i początkujący jestem, ale SPI to SPI a I2C to I2C po coś te nazwy wprowadzono i łatwiej się poroznmiewać używając takich określeń. Tym bardziej że Atmega ma rozwiązania sprzętowe zarówno dla SPI jak i I2C więc nic tylko odpalać i śmigać.

Tutaj MOSI i MISO jest na linii DATA. Jest dwukierunkowa. Tak jak w I2C ale nie adresujesz układu tylko wybierasz poprzez LOW na CS.
9-ty bit transmisji ustala czy nadajesz komendę(LOW) czy dane(HIGH), tzn. następne 8 bitów
Jak widać a załączonym wcześniej obrazku z datasheet, piny również mają nazwy CSX, SCL i SDA...



Ostatnio edytowano 24 lut 2017, o 18:43 przez radek3035, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 18:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 368
Lokalizacja: Gliwice
Pomógł: 34

radek3035 napisał(a):
W datasheet jest napisane: 3-pin 9 bits Serial Peripheral Interface (SPI)
Nazwy nadałem sam. Tak jak Zealota napisał SDA - Serial Data etc.
Obrazek


Zdradź może o jaki sterownik LCD chodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 18:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 cze 2016
Posty: 40
Lokalizacja: Łódź
Pomógł: 1

Napisałem sterownik dla SPFD54124. Działa ale chciałbym szybciej. No i tu jest 128x160 pixeli a myślę o większym troszkę i wtedy będzie jeszcze wolniej...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 19:02 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

To może powinieneś troszkę inaczej podejść do tej transmisji.
Zrobić sobie bufor obrazu w którym od razu na poszczególnych bitach
ustalasz co tam jest czyli dane przeplatasz tym bitem data. Wiem to
komplikuje obliczanie pozycji.
A potem jednym ciągiem wyrzucasz cały bufor na wyświetlacz korzystając
ze sprzętowego I2C czy TWI to już wsio ryba.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 19:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 cze 2016
Posty: 40
Lokalizacja: Łódź
Pomógł: 1

MirkoT napisał(a):
To może powinieneś troszkę inaczej podejść do tej transmisji.
Zrobić sobie bufor obrazu w którym od razu na poszczególnych bitach
ustalasz co tam jest czyli dane przeplatasz tym bitem data. Wiem to
komplikuje obliczanie pozycji.
A potem jednym ciągiem wyrzucasz cały bufor na wyświetlacz korzystając
ze sprzętowego I2C czy TWI to już wsio ryba.

Właśnie oglądam Magic Ledy p.Mirka i zaczynam mieć zarys pomysłu. Zajefajny poradnik i chyba sobie zafunduję książkę.
Natomiast bufor musiałby mieć 128*160*3 bajty to 61 440 bajtów..
Aczkolwiek można by wykorzystać Partial Area i buforować tylko potrzebny fragment.
Jeszcze raczkuję w C i AVR więc chętnie posłucham wszystkich którzy maja jakiś pomysł realizacji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 19:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 368
Lokalizacja: Gliwice
Pomógł: 34

radek3035 napisał(a):
Napisałem sterownik dla SPFD54124. Działa ale chciałbym szybciej. No i tu jest 128x160 pixeli a myślę o większym troszkę i wtedy będzie jeszcze wolniej...

Hmm a może taki "chytry sposób:
Dzielisz paczki na 8 bitowe. Każdy 9 bit jest bez znaczenia. Chodzi mi oczywiście o LSB.
Tworzysz więc 3 bajty, które wysyłasz po SPI sprzętowym, gdzie MSB jest oczywiście pierwszym wysłanym "bitem" dla każdej bajtu..
Pomiędzy każdy bajt, wysłany sprzętowo, "wrzucasz" jedno "tyknięcie" zegara, po to by sterownik będący cały czas w CS = low, tylko "odhaczył, ten 9 nic nie znaczący bit.
To 9 tyknięcie zegara należy dobrać czasowo tak by było zgodne z dokumentacją.
Prawdopodobnie wystarczy rzucić dwie komendy CLK_HI i CLK_LO, nawet bez dodatkowego opóźnienia i zbocze narastające "zaliczy" ostatni bit.
Oczywiście bajty z konkretnymi danymi w słowach 8 bitowych należy poprzestawiać przesunięciem bitowym.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Powyższy kod to taki niedoskonały zarys, ale mam nadzieję, że wiadomo o co chodzi.
Samo SPI w AVR po każdym wysłanym bajcie zatrzymuje zegar.
Dodatkowo należy oczywiście parametry dobrze ustawić CPOL, CPHA DORD i co tam jeszcze trzeba.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 20:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 cze 2016
Posty: 40
Lokalizacja: Łódź
Pomógł: 1

Zealota napisał(a):
Pomiędzy każdy bajt, wysłany sprzętowo, "wrzucasz" jedno "tyknięcie" zegara, po to by sterownik będący cały czas w CS = low, tylko "odhaczył, ten 9 nic nie znaczący bit.

bity idą od Msb czyli od D8 do D0, Pierwszy ustawiony na 'H' sygnalizuje że nadaję dane a na' L' że nadaję komendę. Nie da się go pominąć. Ustawiam CS na 'L'
Nadaję komendę a potem może być od zera do kilkudziesięciu danych nawet. Czyli pierwszy bit przesyłany na' L' i 8 bitów komendy potem bit danych 'H' i 8 bitów danych, bit 'H' i następne 8 bitów danych i następne... itd.. ewentualnie następny stan 'L' i 8 bitów nowej komendy i 'H' i 8 bit danych...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 20:39 
Offline
Użytkownik

Dołączył(a): 22 gru 2013
Posty: 296
Lokalizacja: Szczecin
Pomógł: 47

"Kto szuka ten błądzi"?
W poście #8 z tego linku po drobnych przeróbkach masz kod, który powinien załatwić Twój problem (mix of bit-bang and hardware SPI):
http://www.avrfreaks.net/forum/9-bit-spi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 20:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 368
Lokalizacja: Gliwice
Pomógł: 34

radek3035 napisał(a):
Zealota napisał(a):
Pomiędzy każdy bajt, wysłany sprzętowo, "wrzucasz" jedno "tyknięcie" zegara, po to by sterownik będący cały czas w CS = low, tylko "odhaczył, ten 9 nic nie znaczący bit.

bity idą od Msb czyli od D8 do D0, Pierwszy ustawiony na 'H' sygnalizuje że nadaję dane a na' L' że nadaję komendę. Nie da się go pominąć. Ustawiam CS na 'L'
Nadaję komendę a potem może być od zera do kilkudziesięciu danych nawet. Czyli pierwszy bit przesyłany na' L' i 8 bitów komendy potem bit danych 'H' i 8 bitów danych, bit 'H' i następne 8 bitów danych i następne... itd.. ewentualnie następny stan 'L' i 8 bitów nowej komendy i 'H' i 8 bit danych...


Hmm chyba nie zrozumieliśmy się :). Mi chodziło, że tę "drugą stronę" pomijamy :) Najpierw idzie MSB, czyli znacznik komendy albo danych i to oczywiście zostawiamy i po kolei następne bity, aż dochodzi do dwóch ostatnich, które nie mają znaczenia, a ostatni z nich, czyli LSB "nadajemy" poprzez to dodatkowe, softwarowe "tyknięcie".
Tutaj nie ma znaczenia czy L czy H bo sterownik to pomija.
Należy pamiętać, ze w HW SPI mozemy sobie ustawi czy LSB czy MSB ma iść pierwszy, oczywiście w tym wypadku MSB (nie ustawiamy bitu DORD)
Zrobiłem dodatkowe testy, zmodyfikowałem kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Okazuje się, że SPI musi być wyłączone, gdy chcemy sobie "tyknąć" softwarowo zegarem.
Wrzuciłem na atmege328p kod i z zrobiłem screeny z analizatora stanów:

Obrazek

Obrazek

Popatrz jak ładnie widać te 9 tyknięcie, jest nieco węższe, ale można regulować instrukcją nop.
Drugi obrazek to już prędkość 4MHz, oczywiście samego zegara SPI.

Oczywiście mogłem popełnić jakiś błąd myślowy, nie będę się upierał :), ale na razie wychodzi mi, że to może działać.

------------------------ [ Dodano po: 1 minucie ]

krish napisał(a):
"Kto szuka ten błądzi"?
W poście #8 z tego linku po drobnych przeróbkach masz kod, który powinien załatwić Twój problem (mix of bit-bang and hardware SPI):
http://www.avrfreaks.net/forum/9-bit-spi


Hehe, wydaje się, że właśnie chyba o tym pisałem w tych moich "wywodach" :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 lut 2017, o 21:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 cze 2016
Posty: 40
Lokalizacja: Łódź
Pomógł: 1

O tym samym myślałem,ale komendy wykorzystują całe 9 bitów a i data tylko w przypadku kolorów wykorzystuje 3 x 6 (18 bit color) a inne też całe 9 bitów.
Więc samym zegarem tego nie przeskoczę. Myślę że może wstawka assemblerowa by lepiej zadziałała ale jeszcze jestem zbyt "zielony" w te klocki.
Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 lut 2017, o 09:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2017
Posty: 368
Lokalizacja: Gliwice
Pomógł: 34

Jeśli chodzi o komendy i ostatni fragment z dokumentacji wydaje mi się że to nic nie zmienia w implementacji pomysłu.
Jest tylko jedna różnica, najpierw należy "wrzucić" nadmiarowy, dziewiąty bit (C/D) oczywiście w zależności czy 0 czy 1 ustawić wyjście MOSI, pamiętając o wyłączeniu sprzętowego SPI na ten czas. Następnie włączyć SPI i podać 8 kolejnych bitów.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Patrząc pobieżnie na ten sterownik i jego dokumentację wydaje się, ze sposób jego sterowania jest bardzo podobny do innych sterowników, nawet tych prostszych, jak popularne oledowe SSD1306.


Zajrzyj może na mirkowe poradniki o SSD1306. Przydałby Ci się również greenbook, bo tam był sposób programowania wyświetlaczy graficznych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 lut 2017, o 10:08 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 cze 2016
Posty: 40
Lokalizacja: Łódź
Pomógł: 1

Zabrałem się za napisanie tego w asm. Za przykład
Biorę wstawkę z poradnika o magic ledach.
Ale tam jest błąd chyba i zamiast jednego pinu
Zmienia sie cały port. Brak operacji or i and przed sts.
Aczkolwiek mogę się mylić bo dopiero raczkuje.
Jak ktoś się zna to niech mnie poprawi będę miał dodatkową wiedzę.
Zamówiłem dziś analizator stanów to będę mógł
sprawdzić tą wstawkę i dopracować kod czasowo.
;)
Wypociłem dziś taki kod:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

kompiluje się ,mikroprocesor pracuje ale na wyświetlaczu nic się nie dzieje.
Jakie błędy popełniłem?
Ps wyciąłem wszystkie "nopy" z kodu żeby był czytelniejszy.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 mar 2017, o 21:52 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 cze 2016
Posty: 40
Lokalizacja: Łódź
Pomógł: 1

Po walce z asemblerem udało mi się stworzyć działający kod ale wyszło jakoś wolno. Za cienki w uszach widać jeszcze jestem.
Zmontowałem więc kod w c++ i nawet udało mi się osiągnąć coś koło 2Mhz zegara.
Może komuś się przyda ;)
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tak to wygląda w analizatorze który niedawno mi dostarczono ;) (zajefajna rzecz, polecam)
Obrazek
Spróbuję w wolnej chwili powalczyć z kodem od Zealota.
Dzięki wszystkim za pomoc i zainteresowanie.
Pozdrawiam



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 paź 2017, o 08:08 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 14 kwi 2014
Posty: 9
Lokalizacja: Gdańsk
Pomógł: 0

Wałkuję ten sam temat w kontekście sterownika do LCD od Nokii 1202. Sposób z AVR Freaks działa (mix HW SPI i bit-banging), ale zastanawiam się czy próbowaliście przesłać np. 2 bajty przez SPI w taki sposób:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Najstarsze bity hi_byte zostaną przepchnięte i "wylecą" - zostanie tylko jeden bit określający DATA/COMMAND. Sterownik zinterpretuje tylko ten jeden bit i cały lo_byte. Machnięcie linią CS powinno zatrzasnąć te 9-bitów w rejestrze sterownika. Dobrze kombinuję?

Poniżej fragment noty do STE2007, który sugerowałby taki mechanizm:

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 25 paź 2017, o 20:45 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 14 kwi 2014
Posty: 9
Lokalizacja: Gdańsk
Pomógł: 0

Eh... Niestety. Po transferze 8 bitów na linii MOSI jest dodatkowe zbocze po zboczu zatrzaskującym na SCK, czyli występuje pierwszy warunek transferu do sterownika. Klapnięcie linią CS nic już wtedy nie wnosi - czyli zostaje mix SW i HW.
Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 kwi 2018, o 22:45 
Offline
Nowy

Dołączył(a): 26 maja 2015
Posty: 8
Pomógł: 0

Witajcie,

Poniższa koncepcja działa dla wyświetlacza.

Jeżeli mam wysłać 9 bitów a mam sprzętowo 8 bitów, to wysyłając kolejno 9 bajtów mam wysłane 8 tych 9-cio bitowych.
Nie trzeba się martwić o to, że jedno 9cio bitowe słowo jest zawsze w dwóch kolejnych transmisjach.

Jedyne co jest ważne, to
- trzymać cały czas linię CS aktywną
- zakończyć transmisję po przesłaniu wielokrotności paczek po 9 bajtów.

Jak brakuje danych do wysłania żeby zakończyć na wielokrotności 9 bajtów to podpowiadam, że mamy instrukcję NOP i można ich wstawić dowolnie dużo.

Poniżej obrazek jak to wygląda w praktyce. Dekodowane jest 9 bitowe SPI.

Andrzej

Obrazek



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO