Witam.
Realizuję prosty projekt generatora wideo na VGA opartego o Atmegę1284p - obraz jest generowany z pamięci RAM dosyć chałupniczą metodą: aby osiągnąć rozdzielczość 53x240 pikseli (!) tworzę 53 tablice (rozdzielczość pozioma) uint8 o rozmiarze 240 wpisów (rozdzielczość pionowa) a następnie ustawiam PORTC po kolei każdą tablicą o indeksie linii. Przykład:
Oczywiście aby uzyskać 240 linii w 480 liniowym standardzie dubluję każdą linię.
Jak można się domyślić, problem jest z rozdzielczością poziomą.. obsługa tablicy i zmiennej oznaczającej numer linii jest powolna - dramatycznie obniża ona rozdzielczość obrazu - z około 500 cykli procesora udaje mi się wycisnąć jedynie 53 piksele (po "podkręceniu" timingów VGA - np. redukcji czasu synchronizacji poziomej udaje mi się wyciągnąć 56 pikseli, jednak oczywiście metoda pobierania pikseli z RAM jest tak samo powolna).
Próbowałem z bezpośrednim (a może robię coś nie tak?) dostępem do RAM poprzez funkcję gdzie ADRES jest fragmentem adresu dla danego piksela, jednak wyszło na to samo.
Więc, przechodząc do sedna - w jaki sposób można wydajniej pobierać dane z pamięci RAM?
Wszystkie zmienne są typu volatile uint8_t.
Używam procesora Atmega1284p z kwarcem 20MHz. Obraz VGA generowany jest w przerwaniach. Ja sam jestem bardziej początkującym programistą atmeg, jednak wydaje mi się, że podstawy znam (kilka małych projektów w C mam za sobą)
.
PS. Używam wewnętrznego RAM'u (16 KB) - obraz 53x240 zajmuje znaczną część pamięci, jednak nie potrzebuję 240 linii obrazu - z rozdzielczości 120x120 będę całkowicie zadowolony.
Dziękuję za pomoc i pozdrawiam
nkp123
Realizuję prosty projekt generatora wideo na VGA opartego o Atmegę1284p - obraz jest generowany z pamięci RAM dosyć chałupniczą metodą: aby osiągnąć rozdzielczość 53x240 pikseli (!) tworzę 53 tablice (rozdzielczość pozioma) uint8 o rozmiarze 240 wpisów (rozdzielczość pionowa) a następnie ustawiam PORTC po kolei każdą tablicą o indeksie linii. Przykład:
Kod: C / C++
Oczywiście aby uzyskać 240 linii w 480 liniowym standardzie dubluję każdą linię.
Jak można się domyślić, problem jest z rozdzielczością poziomą.. obsługa tablicy i zmiennej oznaczającej numer linii jest powolna - dramatycznie obniża ona rozdzielczość obrazu - z około 500 cykli procesora udaje mi się wycisnąć jedynie 53 piksele (po "podkręceniu" timingów VGA - np. redukcji czasu synchronizacji poziomej udaje mi się wyciągnąć 56 pikseli, jednak oczywiście metoda pobierania pikseli z RAM jest tak samo powolna).
Próbowałem z bezpośrednim (a może robię coś nie tak?) dostępem do RAM poprzez funkcję
Kod: C / C++
Więc, przechodząc do sedna - w jaki sposób można wydajniej pobierać dane z pamięci RAM?
Wszystkie zmienne są typu volatile uint8_t.
Używam procesora Atmega1284p z kwarcem 20MHz. Obraz VGA generowany jest w przerwaniach. Ja sam jestem bardziej początkującym programistą atmeg, jednak wydaje mi się, że podstawy znam (kilka małych projektów w C mam za sobą)
PS. Używam wewnętrznego RAM'u (16 KB) - obraz 53x240 zajmuje znaczną część pamięci, jednak nie potrzebuję 240 linii obrazu - z rozdzielczości 120x120 będę całkowicie zadowolony.
Dziękuję za pomoc i pozdrawiam
nkp123
