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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 13 lip 2025, o 04:50


    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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: 27415
    Lokalizacja: Szczecin
    Pomógł: 1043

    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 ] [ Zaznacz wszystko ]
    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 3 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO