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



Teraz jest 2 kwi 2026, o 21:11


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 6 cze 2014, o 08:55 
Offline
Nowy

Dołączył(a): 24 sty 2014
Posty: 23
Pomógł: 0

Witam

Szukam rozwiązania jak w temacie. Mam wyświetlacz który działa po SPI. niestety przy wykonaniu jakiej kolwiek operacji na nim otrzymuję efekt "wlewania" zmian na ekran. Narazie pracuję na procku z 8MHz zegarem planuję przyśpieszyć do 12-16Mhz na zewnętrznym kwarcu. i tu pytanie

1) znam noty katalogowe dla procesorów atmega ale czy ktoś przyśpieszał te procki powyżej podanych częstotliwości w nocie? Jeżeli tak to jakie i na ile dało się je podkręcic? czy potrzebne było jakieś chłodzenie czy co kolwiek?

2) inicjalizuję moje SPI tak
Kod:
SPCR |= (1<<SPE)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA);
   SPSR |= (1<<SPI2X);

czy mogę jeszcze coś ustawić aby zwiększyć SCK? teoretycznie ten wiświetlacz może działać przy SCK 25Mhz.

3) zanim zabiorę się za napisanie biblioteki dla komunikacji równoległej po D[0-17] chciał bym się upewnić że taka komunikacja jest szybsza niż SPI. Czy może się ktoś wypowiedzieć?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 10:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

mokrowski napisał(a):
W praktyce możesz oczekiwać że MCU o katalogowym zegarze 20 MHz, możesz popędzić do 25 MHz "na bank" . W porównaniu do 8MHz więc będziesz miał ~ 3x szybciej. Niektóre egzemplarze wytrzymują 30MHz ale (myślę i przypuszczam) że jeśli coś ma nie zadziałać przy przetaktowaniu pierwsze to peryferia komunikacyjne. Rdzeń wysiada ostatni nie tylko w MCU :-/


Przy zewnętrznym generatorze nawet przy 40 MHz nie zauważyłem problemów.
Obecnie odpaliłem przy taktowaniu 33MHz UART i bez problemu działa 115200. RX i TX :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 10:44 

Pomógł: 0

Jest kilka ciekawych graficznych projektów z użyciem AVR na forum. Ale rewelacji się po 8bitowym nie spodziewaj, to nie tylko kwestia prędkości SPI, ale i konieczności przerzucania sporej ilości danych.
Np. taki 429i STMa ma już podwójne buforowanie, wsparcie dla przeźroczystości itp. Można w sumie prostą implementacją biblioteki zrobić ikonki jak na win7 z obsługą dotykową.

Na AVRku jest nawet "palmtop" na forum, oraz Mirek w zielonej pokazuje pazura, ale mimo wszystko przewalanie nawet 32kb obrazka to dla AVRka trochę tytaniczna praca.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 11:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

rezasurmar napisał(a):
ale mimo wszystko przewalanie nawet 32kb obrazka to dla AVRka trochę tytaniczna praca.


No 8 bitów to 8 bitów....
Ale ja tak sobie wspominam jak to było kiedyś. :) W latach 80-tych. Komputery typu Atari 800XL czy 65/130XE. Procesor 6502, taktowany 1,77 MHz
16 KB ROM. A ile rzeczy działało. :)
W porównaniu z tym to AVRki to są demony prędkości.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 11:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 05 sie 2013
Posty: 1154
Lokalizacja: Lublin / Kraków
Pomógł: 72

mokrowski napisał(a):
Co zadziała przez 5-10 min to nie wiem i producent także nie wie

Akurat układ z tym generatorem 33 MHz działa u mnie już ponad poł roku.
Jest w nim tak:
1. LCD HD44780
2. 3 PWMy
3. Timer1 i jego ICP obsługujący podczerwień.
4. Przerwanie od Timera2 jako podstawa czasu
5. I teraz dodatkowo UART.

MCU to ATmega328.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 11:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

Moja Atmega 32 bezproblemowo współpracowała z kwarcem 24,576MHz, SPI działało jak powinno, nie zauważyłem żadnych problemów ;)

Wysłane z mojego Nexusa 5 przy użyciu Tapatalka ;)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 13:38 
Offline
Nowy

Dołączył(a): 24 sty 2014
Posty: 23
Pomógł: 0

Dziękuję za wypowiedzi

@mokrowski - tak chodziło mi o porównanie prędkości tych 2 sposobów transmisji danych a nie zwiększenia mocy obliczeniowej, bo nawet przy 8Mhz procek się nudzi w moim programie.
Co do wyświetlacza to sterownik ili9325c 240x320TFT

Czy są jakieś wersje procesorów z rodziny atmega które nie mają dzielnika częstotliwości dla SPI w stosunku do częstotliwości procesora? to /2 boli najbardziej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 13:43 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 sty 2013
Posty: 328
Lokalizacja: Rzgów k. Łodzi
Pomógł: 11

Nie ma takiego procka. Z AVR to jedynie Xmega jest szybsza, bo domyślnie pędzi na 32 MHz, a pętla PLL pozwala jeszcze bardziej przyspieszać ;)

Wysłane z mojego Nexusa 5 przy użyciu Tapatalka ;)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 17:09 
Offline
Nowy

Dołączył(a): 24 sty 2014
Posty: 23
Pomógł: 0

mokrowski napisał(a):
MoherPower napisał(a):
Teraz masz:
8MHz / 2 (dzielnik SPI) = 4 MHz (wysyłanie _bitów_) -> 4.000.000 bit/s
możesz mieć:
25MHz / 2 (dzielnik SPI) = 12.5 MHz (wysyłanie _bitów_) -> 12.500.000 bit/s

Co do ustawień to SPI2X oraz dzielnik 2 to już szczyt możliwości samej kostki.
http://3.14.by/en/read/arduino-liquid-nitrogen-overclocking

zastanawiam się troszkę w kwesti tych wyliczeń. otóż.

mam wyświetlacz 320*240 co daje mi 76800 pikseli.

tak wygląda funkcja kasowania lcd.

Kod:
[syntax=c]void ILI9325c_Clear( uint16_t Color)
{
   uint32_t index=0;
   uint8_t color_high=(Color >>  8), color_low=(Color & 0xFF);
   ILI9325c_SetCursor(0,0);
   ILI9325c_WriteIndex(0x0022);
   SPI_ILI9325c_SELECT;
    ILI9325c_WriteDataStart();


   for( index = 0; index < (uint32_t)MAX_X * MAX_Y; index++ )
   {
      SPI_Transmit(color_high);      /* Write D8..D15                */
      SPI_Transmit(color_low);      /* Write D0..D7                 */
   }
   SPI_ILI9325c_RELEASE;
}[/syntax]

a zatem poza stratą kilku taktów zegara na ustawienie lini CS, konwersje 16 bit na 2x8 bit i wyslanie komend sterujących, mamy praktycznie pentlę w której cały czas wysyłamy do SPI to samo.
i teraz tak ..
76800 pikseli * 16 bit = 1,228,800 bitów. czyli 1/10 ilości jaką mogę wysłać w 1 sek przy taktowaniu 25MHz (ja wsadziłęm kwarc 32Mhz). Z tego wynikało by że mogę mieć frame rate 10 klatek na sek. Ale tu ciekawostka
przy wykożystaniu wskazanej funkcji oraz (dla całkowitej jasności) funkcji
Kod:
[syntax=c]uint8_t SPI_Transmit( uint8_t bajt ) {
   SPDR = bajt;
   while( !(SPSR & (1<<SPIF)) );
   return SPDR;
}[/syntax]

w rzeczywistości uzyskuję ok 1,5 sek na zapełnienie ekranu!!! to jest 15 razy wolniej niż byśmy oczekiwali na podstawie teoretycznych wyliczeń. gdzie tak mocno zatykamy transmisję???



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 19:57 

Pomógł: 0

sq8dsr napisał(a):
16 KB ROM. A ile rzeczy działało.


Tylko bierz uwagę, że to było przy rozdzielczości 320x240 przy 16kolorach ;) bez przenikania, podwójnego buforowania, a spritów mogło być tylko 8 ;).



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 20:22 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Wywołanie funkcji i powrót sporo taktów pożera. Najlepiej widać to w pliku lss z folderu Release (dodatkowo należy w specyfikacji procesora znaleźć tabelkę Instruction set summary). Wywołanie funkcji to instrukcja asemblerowa call - 5 cykli, a powrót to ret - 5 cykli. Możesz spróbować tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

To coś da, ale pozostaje ten nieszczęsny for ze zmienną index o rozmiarze 32 bity. Procesor 8-bitowy wrzuci sobie tą zmienną do 4 rejestrów i porównanie ze stałą 32-bitową zajmie pewnie 4 cykle i inkrementacja też 4. Szybciej pewnie będzie jakbyś wysyłał po 2 piksele i miał 2 fory i w każdym zmienną 8-bitową np.:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


PS. do wstawiania kodu w C używa się samego syntax=C, a do kodu z pliku lss możesz sobie użyć Code

_________________
Dragonus Cracovus: Biomagia



Ostatnio edytowano 7 cze 2014, o 09:58 przez Krauser, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 cze 2014, o 21:49 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 cze 2013
Posty: 988
Lokalizacja: Byram, MS 39272
Pomógł: 55

Atmega8 bez problemu chodzi na 20MHz.

_________________
Pomysły na podpis - wyślij SMSa +1 769 243 0011



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2014, o 10:19 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

mokrowski napisał(a):
Tylko to jest wyświetlacz 320x240 a 320 się nie zmieści w uint8_t.
Dlatego zaproponowałem wysyłać dane o 2 pikselach, a wartość do porównania to MAX_X / 2. Nawet inkrementacja/dekrementacja 16-bitowej zmiennej to nie 2 operacje. Zmiana młodszego bajtu może wymagać zmiany starszego, a więc dochodzi to dodatkowe sprawdzenie.

_________________
Dragonus Cracovus: Biomagia



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: 13 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO