Skocz do zawartości

Błędy przy odczycie danych z PROGMEM


PowerTGS440

Pomocna odpowiedź

Ktoś coś powie czemu tak (gdzie parametr tablicy pochodzi z zewnątrz):
nr_plik = 45312
nr_czas = 1233

lub inne przypadkowe losowe liczby pobiera,  
a przy parametrze wpisanym na stałe jest dobrze ?
nr_plik = 1
nr_czas = 240


O co chodzi ? jak to poprawnie wyłuskać z pamięci 

 

 

// --- pliki mp3 ------------------------------------------
const unsigned int mp3file000 [] PROGMEM  =  {   0,   150 };
const unsigned int mp3file001 [] PROGMEM  =  {   1,   240 };
const unsigned int mp3file002 [] PROGMEM  =  {   2,   340 };
const unsigned int mp3file003 [] PROGMEM  =  {   3,   250 };
const unsigned int mp3file004 [] PROGMEM  =  {   4,   300 };
const unsigned int mp3file005 [] PROGMEM  =  {   5,   310 };
const unsigned int mp3file006 [] PROGMEM  =  {   6,   320 };
const unsigned int mp3file007 [] PROGMEM  =  {   7,   350 };
const unsigned int mp3file008 [] PROGMEM  =  {   8,   350 };
const unsigned int mp3file009 [] PROGMEM  =  {   9,   350 };

/// - lista plików mp3 -------------------------------------
const unsigned int * const mp3file[] PROGMEM = 
{ 
		mp3file000, mp3file001, mp3file002, mp3file003, mp3file004, 
		mp3file005, mp3file006, mp3file007, mp3file008, mp3file009
};

unsigned int nr_plik = 0;
unsigned int nr_czas = 0;

// ---
void wydobyj_mp3_zPROGMEM(int nr)
{
   // TAK JEST ŹLE !!!
   nr_plik = pgm_read_word (  mp3file[nr] + 0 );  // nr_pliku do zmiennej
   nr_czas = pgm_read_word (  mp3file[nr] + 1 );  // czas trwania do zmiennej
   
   Serial.print(F("nr_plik = "));
   Serial.println(nr_plik);   
   Serial.print(F("nr_czas = "));
   Serial.println(nr_czas);
   
   // A TAK DZIAŁA !!!
   nr_plik = pgm_read_word (  mp3file[1] + 0 );  // nr_pliku do zmiennej
   nr_czas = pgm_read_word (  mp3file[1] + 1 );  // czas trwania do zmiennej    

   Serial.print(F("nr_plik = "));
   Serial.println(nr_plik);   
   Serial.print(F("nr_czas = "));
   Serial.println(nr_czas);   
}

void setup()
{
	Serial.begin(9600);
	wydobyj_mp3_zPROGMEM(1);	
}

void loop()
{

}

 

Dobra, zagadkę rozgryzłem 🙂 w pliku głównym SKETCH projektMP3.ino jest ok. Miałem to w pliku mp3file.cpp i takie cyrki, a powinno być w mp3file.h - teraz jest ok. 
Aczkolwiek i tak dziwne to trochę.

Edytowano przez PowerTGS440
Link do komentarza
Share on other sites

12 minut temu, PowerTGS440 napisał:

Aczkolwiek dziwne.

Pewnie że dziwne... że działa. Tablica mp3file siedzi w PROGMEM i musisz użyć pgm_cośtam żeby się do niej dobrać, a później również pgm_cośtam aby dobrać się do elementu który też siedzi w PROGMEM.

Nie prościej zrobić jedną płaską tablicę a nie tablicę tablic?

Link do komentarza
Share on other sites

(edytowany)

przecież wydobywa, ze stałym parametrem (1,2,3 itp) bezbłędnie, z parametrem jako zmienna źle. To mnie ciekawi dlaczego. problem już rozwiązałem - tylko czemu nie chciało to działać w dołączonym pliku *.cpp do projektu - jaki grzyb siedzi w [1] a [nr]
int nr = 1;
int nr_plik = pgm_read_word (  mp3file[nr] + 0 );  
jest z błędem
a tak dobrze to robi
int nr_plik = pgm_read_word (  mp3file[1] + 0 );  
OTO JEST PYTANIE, na które nie odpowiedziałeś ? i nie pgm_cośtam tylko pgm_read_word. A druga sprawa, nie płaska tablica by wylądała tak:
const int mp3[] PROGMEM = {0, 0,  1, 200, 2, 300, 3, 300 };
i wtedy
int nr_plik = pgm_read_word ( mp3 + 4 );
int czas    = pgm_read_word (mp3 + 5 );

a teraz wyciagnij nr. pliku i czas pliku np. setnego - bo wtedy juz trzeba sie zastawiac czy to 100, czy 200 - a nagle chce dodac jeszcze jakis parametr: nr.pliku, czas trwania, nr_folderu - bo się skończyl (max 255 sztuk moze byc) .
co przejrzyściej ?
int nr_plik = pgm_read_word ( mp3file[100] + 0 );
int czas    = pgm_read_word (mp3file[100] + 1 );
int folder  = pgm_read_word (mp3file[100] + 2);

 

Edytowano przez PowerTGS440
Link do komentarza
Share on other sites

A ciekawe, skąd kompilator ma wiedzieć co siedzi w mp3file[nr]  (bo mu potrzebna stała w tym miejscu).

No, ale jeśli rozwiązałeś to nie przeszkadzam.

A pgm_read_word to jeden z przypadków pgm_cośtam. Jeśli uważasz, że adres jest zawsze 16-bitowy to musisz nieco zmienić poglądy. Po pierwsze nie napisałeś co to za Arduino (dział jest o Arduino i ESP, a ESP ma po pierwsze 32-bitowe adresy, po drugie nie potrzebuje pgm_cośtamów w żadnej postaci).

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

(edytowany)

wiem czemy word a nie byte, takie rzeczy nie sa dla mnie tajemnica

pgm_read_byte - odczytuje 1-bajtową zmienną z pamięci programu np. byte, char
pgm_read_word - odczytuje 2-bajtową zmienną z pamięci programu np. int
pgm_read_dword - odczytuje 4-bajtową zmienną z pamięci np. long

a wiadomo ile pamięci mają Arduino, trzeba się nakombinować by upchać.

oto odpowiedź na problem. I działa też tam gdzie miało działać, więc nie muszę nic modyfikować, może komuś się przyda
 

void wydobyj_mp3_zPROGMEM(int nr)
{
  
	unsigned int * ptr = (unsigned int*) pgm_read_word(&mp3file[nr]);
	nr_plik = pgm_read_word ( & ptr[0] );
	nr_czas = pgm_read_word ( & ptr[1] );
   
	Serial.print(F("nr_plik = "));
	Serial.println(nr_plik);   
	Serial.print(F("nr_czas = "));
	Serial.println(nr_czas);
  
}

 

Edytowano przez PowerTGS440
Link do komentarza
Share on other sites

(edytowany)
1 godzinę temu, ethanak napisał:

A ciekawe, skąd kompilator ma wiedzieć co siedzi w mp3file[nr]  (bo mu potrzebna stała w tym miejscu).

a to co to jest ? int nr = 1; zmienna nie stała, na co mi ciagle tą sama tablicę ? 
coś się PAN mota, na przyszłość nie dołączać do rozmowy proszę...jak się udaje tylko, że coś się wie. A po drugie po to są tablice by wybierać w sposób dynamiczne która ma być użyta.  Jaka stała ? Wg. tego toku rozumowania : mp3file[1].wlacz, mp3file[2].wlacz GŁUPOTA SKOŃCZONA !!!

Edytowano przez PowerTGS440
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.