• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Funkcja zawierajaca tablice
#11
(10-09-2017, 13:07)namok napisał(a): Przekazywanie dużych zmiennych przez wartość to zły pomysł bo odkładają się na stosie co trwa i zajmuje pamięć. Przekazuj wskaźnik do tablicy a nie tablicę.

Kolego namok!
Twoj list nie jest odpowiedzia na moje pytanie tylko sugestia ze mozna inaczej (jak, tego nie wiem).
Bez uszczerbku dla dzialania programow moge przekazac do tablicy (w RAM) 200 czestotliwosci jednorazowo. Raczej watpie zebym musial umiescic w tablicy wiecej niz 200 czestotliwosci dla jednego presetu. Na razie w fazie testow tyle zajmuja czestotliwosci 4 presetow. Aplikacja nie jest krytyczna ze wzgledu na czas dzialania poszczegolnych funkcji a spodziewam sie ze odczyt zestawu 200 elementow do tablicy nie bedzie trwal wiecznosc.
Kolega pisze o tym aby czytac poprzednie posty a sam chyba nie przeczytal moich gdzie pisze wyraznie ze nie znam tego jezyka programowania i stwierdzenie "przekazuj wskaznik do tablicy a nie tablice" nic kompletnie mi nie mowi jak mam to napisac w tym jezyku zeby zadzialalo. A poza tym za kazda zmiana czestotliwosci na kolejna z listy bedzie ona musiala byc odczytana z pliku na karcie co tez trwa i wymaga uzycia funkcji odczytu z karty. Odczyt z karty odbywa sie bajtami a ja potrzebuje odczytywac liczby o roznej ilosci znakow np.: dwucyfrowe i siedmiocyfrowe oddzielone przecinkami. wiec wydaje mi sie ze przekazanie calosci w nawiasach klamrowych to tablicy bedzie prostsze technicznie do wykonania niz kombinowanie z odczytywaniem i odcyfrowywaniem liczb.
Tak wiec czekam az ktos sprostuje moj blad w funkcji powyzej.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#12
I oczywiscie sie nie doczekam :-(
Za to udalo mi sie znalezc podpowiedz na forum Majsterkowo jak policzyc przecinki zeby wiedziec ile czestotliwosci jest w danym pliku. Sprawdzilem dziala tylko jak przekazac wartosci czestotliwosci do tablicy tego nie wiem.
Po zainstalowaniu wymaganych bibliotek skurczylo sie miejsce w RAM na tyle ze bez uszczerbku dla dzialania programu moge wgrac do tablicy okolo 100 czestotliwosci. Nadal szukam  funkcji bibliotecznej ktora mi zalatw przekazanie danych rozdzielonych przecinkami do tablicy do pozniejszego wykonania przez generator.
Chyba musze lyknac troche podstaw jezyka zeby to ogarnac :-)
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#13
Witam,
Niestety ;-) @namok miał rację. @StaCh, nie możesz być ignorantem , bo będzie Tobie ciężko rozwiązać Twój problem. Masz podpowiedzi, ale z Twojej niewiedzy wynika, że nie są one pomocne. Musisz zapisywać na kartę dane w takim formacie, żeby jak najszybciej je odczytywać. Na tę chwilę to wpisujesz "coś" oddzielonego średnikami czy przecinkami, chcesz je liczyć , przy odczycie pomijać. Trochę to skomplikowane.
Koniecznie, ale to koniecznie poczytaj o zapisywaniu , odczytywaniu i rodzajach plików w języku C czy też C++. Wtedy Twój problem okaże się dużo prostszy do rozwiązania . O niebo prostszy, niż w przypadku sposobu, w jaki Ty to chcesz zrobić.. Zwłaszcza, że to co potrzebujesz można zrealizować na więcej niż jeden (prosty) sposób.
Pozdrawiam.
 
Odpowiedź
#14
Dziekuje za udzial w dyskusji ale:
wyjasnilem dokladnie o co mi chodzi i zrobie to jeszcze raz.
W kodzie mam tablice danych do odczytu i uruchomienia generatora. Tablica to wartosci liczbowe czestotliwosci do wygenerowania wedlug kolejnosci umieszczenia w tablicy.
Kod:
 {
 unsigned long freq[] = {
58160, 43520, 34720, 50368, 32000, 48640, 46592, 30720, 41728, 59520,
46528, 50368, 56320, 42240, 42624, 44160, 46528, 50176, 50368, 51200,
49920, 58880, 31968, 39824, 30720, 50176, 40640, 40960, 33152, 33376,
35008, 43840, 30720, 49152, 41360, 48000, 57600, 49600, 35008, 33376,
33152, 53248, 51328, 49664, 46528, 43840, 41600, 41344, 38400, 49152,
385000, 362000, 342000, 349000, 378000, 381000, 318000, 373000, 368000, 52500,
90000, 234250, 842000, 937410, 85540, 175000, 225360, 575830, 73300, 95750,
269710, 355080, 20000, 47500, 95310, 210500, 475950, 527000};
wykonaj("Dental", 78, freq);
 }
Funkcja wykonaj zajmuje sie przesylaniem czestotliwosci z tablicy do generatora AD9850 i wyswietlaniem informacji na LCD.
Poniewaz takich zestawow bedzie wiele skromna ilosc RAM nie pozwala na ich umieszczenie w kodzie tylko gdzies poza. Wybor padl na karte SD bo moge edytorem tekstu utworzyc plik Dental i zapisac tam te czestotliwosci oddzielone przecinkami jak w kodzie. Liczba 78 to jest liczba czestotliwosci do wygenerowania stad moj pomysl na policzenie przecinkow w pliku. Pojawil sie natomiast problem jak te dane z pliku na karcie przekazac do tablicy freq[] i o to wlasnie pytalem na forum.
Cala reszta programu dziala poprawnie jedynie wpisywanie zestawow do kodu blokuje pamiec i generuje ostrzezenia przy kompilacji przez co nie moge ich umiescic tyle ile potrzeba.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#15
Witam,
Ja zrobiłbym to w następujący sposób:
- skoro tworzysz plik tekstowy z częstotliwościami to dlaczego nie podawać jako pierwszej wartości ilości częstotliwości do wygenerowania?
- jako, że standardowa biblioteka służąca do obsługi karty SD traktuje plik jako ciąg znaków (czyli jest stream-em), a Tobie potrzebne są liczby typu long int to należy dokonywać konwersji. Tworzysz funkcję, która czyta kolejne znaki z pliku, aż do napotkania przecinka i tworzysz z tych znaków np. char* lub String. Jest nawet gotowa funkcja; https://www.arduino.cc/en/Reference/Stre...tringUntil
Oczytany string konwertujesz za pomocą funkcji parseInt()
Generujesz otrzymaną wartość.
Robisz to tyle razy ile wynosiła liczba na początku pliku.
Pozdrawiam,
Smaczek.
 
Odpowiedź
#16
Dziekuje za podpowiedz! To rozwiazanie powoduje ze przy kazdej zmianie wartosci do wygenerowania musze siegnac do karty aby odczytac kolejna wartosc. Zaleta jest, ze tablica nie zajmuje pamieci RAM a moim zdaniem wada taka, ze trzeba wielokrotnie odczytywac plik z karty tyle razy ile jest czestotliwosci plus 1 dla odczytania ilosci pozycji. Nie wiem jak wyglada trwalosc karty SD i czy wielokrotny odczyt ma na to wplyw.
Jesli w trakcie dopracowywania zalozen okaze sie, ze w zestawie moze sie znalezc wieksza liczba czestotliwosci do wygenerowania, ktora wczytana na raz moze zajac zbyt duzo RAM to ten sposob jest bezpieczniejszy bo nie przepelnie RAM. Na dzisiaj nie wiem ile moze byc maksymalnie czestotliwosci w zestawie jestem w kontakcie z autorem zestawow, ktory ma mi podac ten parametr. Nie wiem jakiego sprzetu/oprogramowania uzywa autor zestawow ale niektore zestawy dzieli na 2 lub 3 czesci. Ja chcialbym tego uniknac o ile sie da.
Jedno co juz wiem to, ze zaladowane biblioteki obslugi modulu karty SD, obslugi wyswietlacza po I2C i Menu startowe "zjadly" sporo RAM na wlasne potrzeby.
Jeszcze jedna sprawa: na Forum Arduino.cc jest informacja zeby jak mozna nie uzywac funkcji z zestawu String class uznawanego przez niektorych za niebezpieczny. Nie jestem w stanie z tym dyskutowac bo za malo wiem.
P.S. Projekt ewoluowal z prostego przekaznika wartosci z programu na PC poprzez virtualny port COM do generatora i wyrasta na Standalone.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#17
Witam,
Podane podpowiedź nie powoduje zwiększonej ilości odczytów z karty SD. Przecież odczyt z karty odbywa się sekwencyjnie. Jeśli otwierasz plik do odczytu to czytany jest od początku. Dopóki nie używa się odpowiednich funkcji lub też nie otwiera go na nowo to czytane są kolejne dane.
Podałem taki sposób rozwiązania problemu, bo skoro nie można zczytać za jednym razem wszystkich częstotliwości do tablicy w programie, to raczej trzeba to robić pojedynczo. Czytanie częstotliwości "grupami" może zabierać tyle czasu, że będzie to powodować przestój w zmianie częstotliwości generatora (nie wiem jak długo dana częstotliwość ma być generowana). W podanym rozwiązaniu odczyt i konwersja będzie trwać zbliżoną ilość czasu.
W podanym przykładzie: https://www.arduino.cc/en/Tutorial/ReadWrite realizowany jest odczyt z karty. Wystarczy lekka modyfikacja. Tam odczytany znak przekazywany jest do Serial-a (stream). Wystarczy dodać warunek napotkania przecinka, a następnie otrzymany ciąg (bez przecinka) przekonwertować za pomocą parseInt().
Częstotliwość generować przez określony czas i przeczytać kolejne znaki w otwartym do odczytu pliku.
Pozdrawiam,
Smaczek.
 
Odpowiedź
#18
Czestotliwosc jest generowana powyzej 2 minut, najczesciej 3 minuty. Zestaw 100 czestotliwosci pracuje przez 5 godzin. Przez caly ten czas plik na karcie bedzie otwarty do odczytu? A co bedzie jak napiecie zasilajace sie zmieni poza zakres tolerancji? Dlatego wolalbym aby zestaw zostal odczytany do tablicy w RAM tak jak mam dotychczas a potem przetwarzany dalej. Jeden z zestawow, ktory mam dostepny do testow zawiera 93 czestotliwosci.
Jesli liczba czestotliwosci w zestawie nie przekroczy 100 to wolalbym odczytac je ciagiem, przetworzyc na liczby i zachowac w tablicy w RAM do dalszego przetwarzania.
Projekt nie powstal na podstawie z gory skonkretyzowanych zalozen i dlatego jest tyle modyfikacji zarowno hardware jak  i software. Dolozenie modulu karty microSD wymusilo zmiane sterowania LCD na I2C na szczescie projektujac plytke drukowana przewidzialem mozliwosc dodawania modulow.
Znam ten tutorial i korzystalem z niego odczytujac dane z pliku na karcie. Na monitorze portu szeregowego wszystko wygladalo dobrze tylko jak z tego zrobic tablice liczb nie wiem.
100 czestotliwosci typu unsigned long zajmuje 400 bajtow po 4 bajty na liczbe to nie jest duzo plus przecinek 100 bajtow to daje razem okolo 500 bajtow.
Powinno sie zmiescic w RAM Nano i Pro Mini gdzie mamy 2kB RAM do dyspozycji.


Załączone pliki Miniatury
   
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#19
Witam,
Widzę, że Pan malkontent.
Jeśli coś się stanie z napięciem to i tak Arduino się zresetuje.
Możesz otworzyć plik i zczytac go do tablicy iluś elementowej. Możesz otworzyć, odczytać jedną, zapamiętać pozycję odczytanie, zamknąć, otworzyć, odczytać od następnej pozycji.
Napisz prostą funkcję, która przyjmuje ciąg cyfr z przecinkiem na końcu i zwraca liczbę. To wszystko.
 
Odpowiedź
#20
Opisowo wszystko jest jasne :-) mam juz przyklady odczytu pliku CSV bez uzycia string class bede nad nimi pracowal.
Program ma dzialac wedlug schematu:
wybieram nazwe zestawu z listy odczytanej z pliku catalog wyswietlonej na LCD
odczytuje funkcja ilosc czestotliwosci w zestawie szukajac przecinkow +1
odczytuje rekordy i zamieniam je na liczby long 
podstawiam liczby do tablicy
nastepnie generuje czestotliwosci z tablicy i wyswietlam informacje dla uzytkownika na LCD.
Jestem po prostu ostrozny bo wiem co uzytkownik moze zdzialac z urzadzeniem. Przez wiele lat bylem administratorem  sieci i systemow komputerowych w sieciach korporacji. Najwiekszym filozofom nie snilo sie co uzytkownik moze zrobic z komputerem z systemem Windows :-(
Na karcie ma byc jak najprosciej. Nazwa pliku a w pliku wartosci czestotliwosci oddzielone przecinkami.
Plik catalog zawiera wykaz nazw, oddzielonych przecinkami, dostepnych zestawow do wygenerowania.
P.S. Dotarla informacja od tworcy zestawow : zestaw zawiera do 60 czestotliwosci i jesli potrzeba wiecej to jest dzielony na czesci wiec ja tez tak zrobie.
Jak ktos bedzie kupowal czestotliwosci dla siebie to dostanie w takim ukladzie od dostawcy i przepisze na karte.
Zostawiam miejsce dla 100 czestotliwosci w RAM i wczytuje calosc..
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości