Skocz do zawartości
KrzyMr

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.

Udostępnij ten post


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.

Udostępnij ten post


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.

Udostępnij ten post


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...