• 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
#1
Poniewaz jak pisalem chce zbudowac generator na bazie Ad9850 sterowany Arduino Nano i chce aby byly generowane rozne zestawy czestotliwosci. Zbudowalem kilka programow zawierajacych rozne zestawy ale wszystkie one roznia sie wylacznie parametrami typu: nazwa zestawu, tablica czestotliwosci, ilosc czestotliwosci w tablicy i ewentualnie czas trwania emisji pojedynczej czestotliwosci. Postanowilem po zapoznaniu sie z dokumentacja zbudowac funkcje ktora bedzie uruchamiala i sterowala AD9850 oraz wyswietlacz LCD 16x2 na podstawie dostarczonych informacji o: nazwie zestawu, ilosci czestotliwosci w zestawie, oraz tablicy czestotliwosci do wygenerowania w danym zestawie.
Po wielu probach udalo mi sie wykonac program ktory przechodzi test kompilacji poprawnie ale niestety nie dziala poprawnie bowiem dziala tylko przekazanie nazwy do funkcji i ilosci czestotliwosci w zestawie natomiast tablica czestotliwosci nie jest odczytywana w zwiazku z tym generator generuje przypadkowe czestotliwosci.
Ponizej kod programu "Funkcja1":

Kod:
//include LCD library
#include <LiquidCrystal.h>
// include the DDS Library:
#include <DDS.h>
int ledpin = 13;
//Instatiate LCD
LiquidCrystal lcd(11, 10, 9, 8, 7, 6);
 // Instantiate the DDS...
  DDS dds(5, 4, 3, 2);
/*unsigned long freq[] = {60, 820, 2500, 20000, 65000, 207460, 479930, 527000, 749000, 986220,
110, 240, 620, 850, 118330, 209180, 321000, 544100, 631170, 705000,
350, 12800, 88500, 125680, 240000, 470000, 592500, 625230, 723010, 70,
570, 87500, 175160, 322060, 476500, 667000, 742000, 985670}; */
//list of a frequencies here above
//int n = 38;  //number of a frequencies in an array
char Name[10];
int n();
unsigned long freq[100];
//Tu zaczyna sie funkcja
void wykonaj(char Name[10], int n, unsigned long freq[100])
{
   for (int i=0; i<n; i++)
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(Name);
  lcd.print(" ");
  lcd.print(i);
  digitalWrite(ledpin, HIGH);
  dds.setFrequency(freq[i]);
  lcd.setCursor(0, 1);
  lcd.print(freq[i]);
  lcd.print(" Hz");
  delay(180000);
  if (i == n);
  {
    digitalWrite(ledpin, LOW);
    dds.init();
    lcd.clear();
    lcd.print("Koniec");
  }
  }
}
void setup()
{
     // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
// initialize the LED output
pinMode(ledpin, OUTPUT);
    // start up the DDS...   
  dds.init();  
  // (Optional) trim if your xtal is not at 125MHz...
  // dds.trim(125000000); // enter actual osc freq
 
}

void loop() {
 wykonaj("Tinitus", 38, (60, 820, 2500, 20000, 65000, 207460, 479930, 527000, 749000, 986220,
110, 240, 620, 850, 118330, 209180, 321000, 544100, 631170, 705000,
350, 12800, 88500, 125680, 240000, 470000, 592500, 625230, 723010, 70,
570, 87500, 175160, 322060, 476500, 667000, 742000, 985670));
}

Uklad z funkcja ma umozliwic mi zbudowanie menu wyboru zestawu do uruchomienia przy pomocy switch/case
bo w kazdym case bedzie inny zestaw parametrow do uruchomienia tej samej funkcji.
Czy ktos moze mi wskazac blad ktory zrobilem?
Program w tej postaci jest weryfikowany poprawnie ale zestaw, tablica czestotliwosc podany w nawiasie nie jest przetwarzany przez funkcje.
Prosze o pomoc w rozwiazaniu problemu.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#2
W ten sposób nie przekazuje się wartości tablicy do funkcji.
Najpierw tworzysz tablicę, tak jak masz w komentarzu

unsigned long freq[] = {60, 820, 2500, 20000, 65000, 207460, 479930, 527000, 749000, 986220,
110, 240, 620, 850, 118330, 209180, 321000, 544100, 631170, 705000,
350, 12800, 88500, 125680, 240000, 470000, 592500, 625230, 723010, 70,
570, 87500, 175160, 322060, 476500, 667000, 742000, 985670};

potem przekazujesz tablicę do funkcji w ten sposób:
wykonaj (freq); (między innymi, bo możesz przekazać wskaźnik, co zresztą jest bardziejsze)

W nagłówku funkcji nie musisz podawać ilości elementów tablicy.
void wykonaj(string Name, int n, unsigned long freq[]);

Tak więc ostatecznie będzie coś w ten deseń:
wykonaj("Tinitus", 38, freq);
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#3
(26-07-2017, 12:46)Robson Kerman napisał(a): W ten sposób nie przekazuje się wartości tablicy do funkcji.
potem przekazujesz tablicę do funkcji w ten sposób:
wykonaj (freq); (między innymi, bo możesz przekazać wskaźnik, co zresztą jest bardziejsze)
Tak więc ostatecznie będzie coś w ten deseń:
wykonaj("Tinitus", 38, freq);
Czyli wynika z tego, ze kazdy "case numer" musi zawierac pelna definicje tablicy wraz z zawartoscia (bo nie moze ona byc globalna) oraz nazwe zestawu i liczbe czestotliwosci w zestawie oraz wywolanie funkcji? Zawartosc tablicy przekazuje sie przez jej zdefiniowana nazwe.
Zaraz sprobuje to przetestowac. Dziekuje!
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#4
Case nie musi zawierać tablicy, może ją pobierać z funkcji, albo z pliku, czy co tam chcesz.
Oczywiście tablice jak najbardziej powinny być lokalne, globalne to ZUO!!!.
Przekazując tablicę do funkcji, udostępniasz jej oryginał i pozwalasz ją modyfikować, modyfikacja jest globalna, ale funkcja sama nie zmodyfikuje Ci zmiennej nie przekazanej, co jest zajebistością tego języka.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#5
(26-07-2017, 15:52)Robson Kerman napisał(a): Case nie musi zawierać tablicy, może ją pobierać z funkcji, albo z pliku, czy co tam chcesz.
Oczywiście tablice jak najbardziej powinny być lokalne, globalne to ZUO!!!.
Przekazując tablicę do funkcji, udostępniasz jej oryginał i pozwalasz ją modyfikować, modyfikacja jest globalna, ale funkcja sama nie zmodyfikuje Ci zmiennej nie przekazanej, co jest zajebistością tego języka.

Dziekuje za pomoc! Program dziala.
Pewnie docelowo bede musial pobierac dane z pliku na SDcard bo 2k pamieci pozwala zdefiniowac nieco ponad 300 czestotliwosci w tablicach i wtedy brakuje pamieci do dzialania. Obecnie po skrotach w 4 tablicach mam zajete 61% pamieci RAM. W pamieci programu jest jeszcze sporo miejsca na obsluge modulu SD.
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#6
Wartości tablic na SD to świetny pomysł, ponieważ możesz sobie to modyfikować na PC, dokładać nowe itp.
Gdy miałem podobny problem (2500 tablic), to użyłem zamiast Arduino STM32 wraz z STlink, bo tam flash pokazuje się w komputerze jako dysk wymienny i możesz go wykorzystać zamiast SD.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.

[Obrazek: SsIndaG.jpg]
 
Odpowiedź
#7
Musze tylko opanowac poslugiwanie sie karta SD i manipulacja danymi. I to wcale nie musi byc karta o wielkiej pojemnosci.
Dzieki.
P.S. A moze lepiej uzyc karty z pamiecia EEPROM 256kB? Czy mozna ja wykorzystac jako magazyn tablic?
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#8
Wracam do tematu bo hardware juz gotowe nie bez problemow o czym w innych watkach.
Chodzi o przekazanie _zawartosci_ pliku o okreslonej nazwie odczytanego z karty do tablicy "freq[]".
Utknalem bo mam problemy z jezykiem programowania, ktorego nie znam.
Funkcja wyglada nastepujaco:

void odczytpliku(char Name[10], unsigned long freq[])
{
 File Preset;
 SD.begin(10);   //pin 10 to CS karty
 Preset = SD.open(Name,FILE_READ);                            
 Serial.println(Name); // dla kontroli
 lcd.print(Name);
 while (Preset.available())  //wykonuj pętlę dopókiwszystkie dane
    {                                 //nie zostaną zczytane
        Serial.write(Preset.read());  //wypisz zawartość pliku
     //   freq = Preset.read(); //tutaj jest problem bo pomimo iz funcja sie kompiluje to odczyt jest skaszaniony
     }
  Preset.close();   
}

Problem jest jak przekazac odczytana zawartosc pliku o okreslonej nazwie do tablicy nazwanej " freq[]" aby jej zawartosc mozna bylo przekazac potem do funkcji wykonaj, ktora zajmuje sie kolejnym generowaniem czestotliwosci z listy zawartej w tablicy.
Funkcja w tej postaci z linia wykomentowana daje na monitorze portu szeregowego nastepujacy wynik:
Eyes
{30,60,100,110,130,170,230,320,350,410,
500,700,730,800,850,950,2970,5170,5430,5500,
7500,8000,12690,15190,15870,17500,30000,32500,37500,42500,
47500,77500,87500,90000,93500,122060,157500,162120,175000,232030,
236420,312330,322530,326500,397500,434510,478500,526070,532410,534250,
653690,655200,667000,679930,722010,750000,753070,922530,927100}

Jest to wynik prawidlowy bowiem zawiera nazwe pliku oraz w nawiasach tablice zawierajaca zestaw czestotliwosci do wygenerowania przez inna funkcje. Problemem dla mnie jest: jak zrobic aby zestaw ujety w nawiasach zostal przekazany do tablicy freq[] lacznie z nawiasami?
Jesli uda mi sie to rozwiazac to bede mial jeszcze jedno zagadnienie do rozwiazania: jak przekazac do tablicy listing nazw plikow z karty? A moze po prostu utworzyc na karcie plik Katalog i w nim przygotowac wykaz plikow do odczytu i podstawienia do tablicy, ktora bedzie sluzyla do przegladania i wyboru pliku do odczytu i wygenerowania zestawu przez AD9850?
Mam nadzieje ze jednak ktos sie odezwie zanim sam znajde rozwiazanie metoda prob i bledow :-(
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#9
Mam jeszcze jeden problem "programistyczny". Jak policzyc w pliku odczytanym z karty ilosc czestotliwosci do wygenerowania? Jest to potrzebne przy funkcji wykonaj bowiem na wyswietlaczu pokazuje sie informacja o nazwie zestawu czestotliwosci, aktualnie generowanej czestotliwosci i ilosci czestotliwosci pozostalych do wygenerowania. Ta ostatnia informacja pozwala ocenic ile czasu jeszcze bedzie trwalo generowanie zestawu bowiem kazda czestotliwosc jest generowana przez 3 minuty.
Jesli nie znajde sposobu to bede sie musial obyc bez tej informacji i inaczej generowac (inna funkcja) kolejne czestotliwosci z zestawu.
Odnosnie liczenia nasuwa sie pomysl policzenia przecinkow w tablicy :-)
W zalaczeniu widok wyswietlacza podczas generowania zestawu.


Załączone pliki Miniatury
   
Poczatki zawsze sa trudne :-)
Arduino Mega256, Nano, Pro Mini.
 
Odpowiedź
#10
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ę.
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości