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

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • 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.