Skocz do zawartości

Atmega32 LCD16x2 menu we FLASH'u nie działa.


Pomocna odpowiedź

Witam próbuje zrobić proste menu ale zajmuje za dużo pamięci SRAM, dlatego postanowiłem umieścić je w pamięci FLSAH mikrokontroler,

niestety nie dział to poprawnie mianowicie nie wyświetla nic albo po kolei wszystkie znaki (krzaki) bez przerwy.

kod :

const char T1[] PROGMEM = {"DS1307"};
const char T2[] PROGMEM = {"TESTER"};
const char * menu[2] PROGMEM = {T1, T2};

//odczytuje za pomocą:

LCD_Write_Text((char *) pgm_read_word_near(& menu[1]));

// funkcja wyświetlania bo może tu jest problem 

void LCD_Write_Text(uint8_t * Text){
    while(* Text)
        Send_Data(* Text++);
}

 dodam że po skasowaniu wszystkich "PROGMEM", a do funkcji wyświetlania wpisania po prostu "menu[0]" działa bez zarzutu.

i jeszcze podkreśla mi "pgm........" i wyskakuje problem "nieznana nazwa rejestru r0".

Gdzie popełniam błąd.

Z góry dzięki za odpowiedz.

Link to post
Share on other sites

po zamianie na __flash wyrzuca mi błędy "oczekiwano na znaku ";"" dla wszystkich 3 linijek 

 

const __flash char T1[] = "DS1307";
const __flash char T2[] = "TESTER";

const __flash char * const __flash menu[2]  = {T1, T2};

dlaczego? nawet po skopiowaniu linijki ze strony tak jest.

Link to post
Share on other sites

Jeśli chodzi o  wersję z PROGMEM, to przyczyną nieprawidłowego działania jest funkcja LCD_Write_Text(). Akceptuje ona tylko wskaźniki do pamięci RAM, więc stamtąd są wyświetlane dane, a nie z pamięci FLASH, w której tak na prawdę znajduje się tekst do wyświetlenia. Rozwiązaniem tego błędu może być np. utworzenie dodatkowej funkcji, która będzie odczytywała i wyświetlała dane dane z pamięci FLASH:

// dane w pamięci FLASH
const char T1[] PROGMEM = "DS1307";
const char T2[] PROGMEM = "TESTER";
const char * const menu[2] PROGMEM = {T1, T2};

// funkcja
void LCD_Write_Text_P(const char * Text){
    uint8_t c;
    while ( (c = pgm_read_byte(Text++)) )
        Send_Data( c );
}

// wywołanie funkcji
LCD_Write_Text_P( pgm_read_ptr(&menu[1]) );

 

Jeśli chodzi o wersję z __flash, to nie wiem, jakiej wersji kompilatora używasz, ale starsze wersje avr-gcc (bodajże poniżej 4.7) nie obsługują tego kwalifikatora, więc być może stąd ten błąd. Niemniej używając kwalifikatora __flash nadal potrzebujesz dwóch osobnych funkcji do wyświetlania z RAM i z FLASH. By utworzyć jedną uniwersalną funkcję, która będzie wyświetlała dane zarówno z RAM jak i z FLASH, należy użyć kwalifikatora __memx.

Link to post
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.