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



Teraz jest 23 lis 2024, o 09:33


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 23 ] 
Autor Wiadomość
PostNapisane: 10 lut 2015, o 20:01 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

Witam,

Mam taki projekt, w którym muszę umieścić dużo danych w pamięci Flash. Są to 16-bitowe próbki dźwiękowe. Sęk w tym, że jak zacząłem dodawać kolejne sample, wyskoczył błąd, że tablica jest za duża. W opisie PGM Space wyczytałem, że jest ograniczenie do 64kb, przy czym ja zmieściłem zaledwie 43 kB (16-bitowe słowa są zapisywane podwójnie, wiem).

Czy jest jakiś inny sposób, by umieścić więcej danych w pamięci FLASH? Mam procka z 256kb FLASH, w sumie po to taki duży kupiłem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2015, o 21:04 
Offline
Użytkownik

Dołączył(a): 26 lut 2014
Posty: 227
Lokalizacja: LDZ
Pomógł: 22

Tutaj masz odpowiedź na swój problem: http://www.avrfreaks.net/comment/331000#comment-331000. Generalnie poczytaj cały temat. Jedynym wyjściem jest podzielenie tablicy na mniejsze (tabliczki ;)).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2015, o 21:59 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

Kurcze, chyba nie ma na to rady, gdyż pointery do tablic PGM SPACE są 16-bitowe i mogą adresować do 64 kB.
Podział na mniejsze tablice spowoduje utrudnienia, gdyż będę musiał IFować a to zabierze trochę cennych cykli zegarowych.
Teraz mam wygodnie:

unsigned int VCO[7][2048] PROGMEM =
{
{ },
{ },
.
.
.
{ },
};

i mogę wybierać tablic zmieniając pointer X, a Y wybiera w pętli odczytującej sampla.
a z oddzielnymi tablicami trzeba będzie kombinować.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 lut 2015, o 23:06 

Pomógł: 0

Cytuj:
Kurcze, chyba nie ma na to rady
Ależ jest. Nazywa się __memx :) Lekturka.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 01:05 
Offline
Użytkownik
Avatar użytkownika

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

Owszem pgm_read_word_far() czyta dane powyżej 64kB ale to i tak nie pozwoli na zadeklarowanie tablicy większej niż 64kB. To pozwoli tylko poczytać dane powyżej tego pułapu.

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 09:23 

Pomógł: 0

Wiem, że już procka kupiłeś, ale czy nie zastanawiałeś się, czy nie lepiej było by zastosować pamięć FLASH po SPI. Na zasadzie jak w karcie SD.
Wtedy wystarczy że odwoływał byś się podobnie jak do FAT, ewentualnie stworzyć własny system plików. Odpadła by ci konieczność operowania tak dużymi tablicami, co raczej nie jest zbyt wydajne w 8bitowym procesorze.



Góra
  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 09:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Można by wykorzystać też szybką (20MHz) pamięć szeregową z podtrzymaniem bateryjnym
na SPI



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 10:31 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

Sęk w tym, że mam już nie tylko procka, ale i cały układ na docelowej płytce zrobiony i uruchomiony i nie spodziewałem się, że będą akurat takie z tym trudności. Zewnętrzna pamięć wiec będzie ostatecznością. Po co w takim razie w prockach aż 256kb flash, na program?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 10:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Cytuj:
Po co w takim razie w prockach aż 256kb flash, na program?

jak to po co -- na program

Nie mogłem się powstrzymać oczywiście to żart :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 11:32 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

WoodPaker napisał(a):
Owszem pgm_read_word_far() czyta dane powyżej 64kB ale to i tak nie pozwoli na zadeklarowanie tablicy większej niż 64kB. To pozwoli tylko poczytać dane powyżej tego pułapu.


To po co w takim razie możliwość czytania powyżej 64kB, jak nie da się zadeklarować większej tablicy? W takim razie ta instrukcja jest bezużyteczna, bo i tak nie będzie czego czytać powyżej tej granicy, bo kompilator nie pozwoli. Chyba, ze jest jakiś inny sposób wpisania do Flash więcej danych?



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

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

Żeby trzymać tam zmienne. Ja odnoszę wrażenie, że kolega nie do końca rozumie jaka jest różnica pomiędzy tablicą, a jedna zmienną.
Ta instrukcja wcale nie jest bezużyteczna. Tylko proszę zauważyć, że funkcja ta służy do odczytu słowa (word), jeszcze jest jedna do odczytu bajtu (byte).

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 12:03 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

Niveasoft napisał(a):
Ty wiesz ile bajtów ma każdy sampl. Nie jestem biegły w temacie, bo nie było mi to potrzebne, ale czy nie można zmusić kompilatora by umieścił Ci to pod znanym Ci adresem i czytać określona ilość bajtów? Jesteście przyzwyczajeni że kompilator dzieli za Was po kolei, ale na pewno jest sposób żeby zrobił to tak jak chcesz. Miejsca masz tyle że możesz się wstrzelić bezpiecznie w jakiś obszar.


Właśnie nad tym myślałem. Mogę "na siłę" wpisać w pamięć flash wszystkie dane, tylko nie wiem jak tego dokonać. Aż tak biegły w C nie jestem, uczę się go jeszcze od niecałe pół roku. 1 sampl ma 2048 słów (Word).

WoodPaker napisał(a):
Żeby trzymać tam zmienne. Ja odnoszę wrażenie, że kolega nie do końca rozumie jaka jest różnica pomiędzy tablicą, a jedna zmienną.
Ta instrukcja wcale nie jest bezużyteczna. Tylko proszę zauważyć, że funkcja ta służy do odczytu słowa (word), jeszcze jest jedna do odczytu bajtu (byte).


Nie bardzo rozumiem. Można przecież zadeklarować w PGM Space full pojedynczych zmiennych, ale mi chodzi o tablice, czyli zbiór jakichś wartości.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 12:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Ja to rozumiem w ten sposób ,że jedna zmienna (np. tablica w jednym wymiarze)
nie może być większa niż 64kB ale już dwie tablice o rozmiarze do 64kb
mogą być i kompilator to odpowiednio umieści w różnych komórkach
pamięci flash.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 12:17 
Offline
Użytkownik
Avatar użytkownika

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

Miałem na myśli to, że zadeklarowanie tablicy w następujący sposób tablica[2048][33] nie zadziała gdyż przekraczasz magiczny próg 64kB ale gdy wpiszesz 65536 słów co da nam 128kB to odwołać się do części z nich będzie można używając pgm_read_word_far().
Oczywiście można zrobić jeszcze inaczej. Mianowicie stworzyć procedurę do zapisywania tych danych w pamięci poprzez pgm_write_word_far() i odczyt poprzez pgm_read_word_far()]. W sumie to będzie pętla i kilka linijek kodu. Niestety trzeba się liczyć z tym, że to ukradnie kilka cennych taktów zegara, o których wspominałeś wcześniej.

Zaba napisał(a):
nie może być większa niż 64kB ale już dwie tablice o rozmiarze do 64kb
mogą być i kompilator to odpowiednio umieści w różnych komórkach
pamięci flash.

Ja też tak to rozumiem.

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 14:32 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

mokrowski napisał(a):
Hmm... A czy kolega może pokazać jak deklaruje taką tablicę? Tę która mu się nie mieści... Kod poproszę..

Jest w drugim moim poście tego wątku szkielet. Nie będę tu przecież podawał tych ciągów liczb. jest to tablica dwuwymiarowa, jako pierwszy wymiar podaje się numer sampla, drugi wymiar to numer kolejnej próbki.

Skoro instrukcja pgm_write_word() (far czy bez far) potrafi umieścić coś w pamięci Flash,to można by zrobić procedurę, która wykona to wszystko raz, zaraz po zaprogramowaniu procka i potem się zdezaktywuje. Kolejne włączenia zasilania i start programu to byłyby już tylko odczytanie tablic pgm_read_word_far(). Nie wiem, czy dobrze myślę?

Teraz są to próbki dźwiękowe, ale kiedyś może będę chciał umieścić we Flashu grafikę dla wyświetlacza, wtedy metoda rozszerzona byłaby jak znalazł.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lut 2015, o 19:14 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

Wow, będę to musiał jutro wypróbować. Czy ta instrukcja z FAR będzie czytać także poniżej 64 kB?
Normalnie to czytam tak:

DACB.CH0DATA = pgm_read_word(&VCO[adres1][X1])>>5;

a teraz wystarczy czytać to tak:
DACB.CH0DATA = pgm_read_word_far(&VCO[adres1][X1])>>5; ?

zmienna "adres1" to numer sampla, a X1 odczytuje kolejne próbki. Przekazuję odczytane dane wprost do rejestru przetwornika DAC, po przeskalowaniu z 16 na 12 bit.

EDIT

Wpisałem w program to wszystko, jak pokazał Kolega powyżej. Program się skompilował, ale jego działanie jest nieco dziwne. Pojawiają mi się połączone kolejno przebiegi, a całość przeskakuje. Z założenia program ma odtwarzać w kółko jeden przebieg (sampla), a teraz odtwarza po półtora, i pojawiają się tylko 4 pierwsze zapisane sample (odczyt na oscyloskopie).

W dodatku wyskakuje ostrzeżenie:
"warning: cast from pointer to integer of different size" i wskazuje na linię:

"DACB.CH0DATA = pgm_read_word_far(&VCO[adres1][X1>>5])>>5;"

Nie mam pomysłu, jak poprawnie zapisać czytanie. Przejrzałem takie strony:
http://linux.die.net/man/3/pgmspace
http://www.avrfreaks.net/forum/tut-c-gcc-and-progmem-attribute?page=all
Wiem już jak czytać pointery, tylko jak nimi zaadresować konkretną tablicę i czytać z niej dane?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 maja 2015, o 16:56 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27309
Lokalizacja: Szczecin
Pomógł: 1041

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

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 maja 2015, o 13:46 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

Próbuję zaimplementować to, co napisałeś, ale nie bardzo rozumiem, jak potem użyć zarówno indeksu tablicy z przebiegiem, jak i odwołania do konkretnego elementu. Cześć kodu działa, np. stworzenie tablicy wskaźników do tablicy, ale ten enum to jakiś wyrwany z kontekstu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 maja 2015, o 14:37 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27309
Lokalizacja: Szczecin
Pomógł: 1041

enum nie jest wyrwany z kontekstu - mogą to być indeksy tablicy wskaźników tablice[], tyle że przyjazne dla oka - dzięki czemu później mogę sobie wołać

tablice[ sinus ];

i już mam wskaźnik do wskaźnika na pierwszy element wzorca sinusa ... odczytuję go i lecę bajt po bajcie

---------------------

Nie wiem czy masz Greenbooka - ale tam jest taki fajny rozdział o fontach na kolorowych wyświetlaczach GLCD, W zasadzie to można byłoby jota prawie w jotę użyć tamtej metody do fontów ;) Tyle że zamiast fontów i zamiast rysowania fontów na GLCD pobieralibyśmy zworce (sample) i zamiast je rysować to wysyłalibyśmy sobie bajt po bajcie dalej do jakiegoś tam twojego generatora

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 maja 2015, o 18:36 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

Zdaje się, że enumerowanie nazw tablic może stać się utrudnieniem. Chciałbym raczej wstawiać wartość zmiennej ADRES, którą to inkrementuję/dekrementuję przy pomocy klawiszy i tym samym wybieram klawiszami aktualnie odtwarzaną falę. Inna zmienna, X1 zwiększa się w przerwaniach o jakiś pewien krok, zależny od częstotliwości. Tak więc klawiszami ustawiam rodzaj fali,a przerwania powodują przeczesywanie tablicy, odczytywanie kolejnych zapisanych próbek i generowanie fali.

Niestety nie mam Greenbooka, niedawno kupiłem BlueBooka i go studiuję.

Dziękuję, że uruchomiłeś mi powiadomienia na maila o otrzymanej odpowiedzi :) Nie mogłem znaleźć tej opcji.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 maja 2015, o 18:43 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27309
Lokalizacja: Szczecin
Pomógł: 1041

m@ciej napisał(a):
Zdaje się, że enumerowanie nazw tablic może stać się utrudnieniem.

Ale posłuchaj - ja nie mam pojęcia jak ty to tam dalej będziesz wykorzystywał, więc nie mówię że MA BYĆ enumerowanie ;) pokazałem to jako swego rodzaju przykład - indeksowania ... .no co za problem indeksować to za pomocą jakiejś zmiennej ? czy no nie wiem DOWOLNIE ... przecież nie jestem w stanie pisać z tobą twojego kodu ;) więc pokazuję przykłady a sposoby zastosowania no już pewnie sam znajdziesz. Możesz to indeksować jak chcesz , w przerwaniach czy bez przerwań - co za różnica ?

m@ciej napisał(a):
Niestety nie mam Greenbooka,

Ok to nie jest problem - no bo tu dostałeś jakiś trop dzięki tak na prawdę pomysłowi, który podsunął kolega "mokrowski"

Cytuj:
Dziękuję, że uruchomiłeś mi powiadomienia na maila o otrzymanej odpowiedzi

ależ ja nic tobie nie włączałem - nie mam pojęcia o co chodzi niestety ;) dlaczego nagle otrzymujesz

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 maja 2015, o 19:05 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

Hehh, Zdaję się, że nie mam jeszcze dostatecznej wiedzy na temat C, by to dobrze pojąć. Mam nadzieje, ze w BlueBooku jest to wyjaśnione, ale jeszcze do tego nie dotarłem.

A z tymi powiadomieniami, zgłosiłem Ci ten problem na maila, i powiadomienia się pojawiły. A jako, że jesteś adminem tego forum wywnioskowałem, ze to Twoja zasługa :) Jakby nie było, powiadomienia są, i się z tego cieszę :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 cze 2015, o 11:08 
Offline
Użytkownik

Dołączył(a): 08 gru 2014
Posty: 53
Lokalizacja: Sz-n
Pomógł: 0

Wracając do tematu. Napisałem taki oto kod:

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


i dostaję takie oto warningi:
../main.c:83:10: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
../main.c:83:8: warning: assignment makes pointer from integer without a cast [enabled by default]

Starałem się zrobić wszystko, jak kol. Mirek pokazał, i nadal jest coś nie tak :(

O co chodzi z "castowaniem", jak to rozumieć?



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