logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega][C] - Transakcyjna obsługa LCD - odczyt danych z flash

dzidav8 29 Paź 2015 23:10 1065 4
REKLAMA
  • #1 15107236
    dzidav8
    Poziom 9  
    Witam, używam do obsługi wyświetlacza LCD HD44780 bibliotek z książki Tomasza Francuza. Program działa, ale mam problem jak go zmusić do odczytywania stringów z flasha.

    Próbuje stworzyć tablicę etykiet we flashu do zmiany lokalizacji językowej programu, aktualizacja wyświetlania jest w przerwaniu:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    defines:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Oczywiście powyższe wypociny nie działają, wyświetlane są losowe znaki. Byłbym wdzięczny za podpowiedź co robię źle.
  • REKLAMA
  • #2 15107766
    BlueDraco
    Specjalista - Mikrokontrolery
    Skąd niby procedura LCD_PutText_B miałaby wiedzieć, że łańcuch jest w pamięci Flash, a nie RAM?

    To są właśnie uroki programowania AVR z wieloma przestrzeniami adresowymi.
  • REKLAMA
  • #3 15107883
    dzidav8
    Poziom 9  
    No ja rozumiem ze właśnie w tym jest problem.

    Mam te funkcje:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Które potrzebuje przerobić żeby czytały stringa z flasha. Nie wiem jakiej jest długości, więc pgm_read_byte/word się nie nadają.
    W innej części programu używam tablicy we flash z atrybutem __flash i działa bez żadnych dodatków do odczytu z flasha - tu nie chce, coś mi się miesza w związku z tym tu jest przekazanie przez wskaźnik.
  • REKLAMA
  • Pomocny post
    #4 15108521
    tmf
    VIP Zasłużony dla elektroda
    A dlaczego nie możesz użyć pgm_read_byte/word? Przy pomocy tych makr odczytujesz string aż do napotkania znaku NUL, który go kończy. Alternatywnie wymień strcpy na strcpy_P, tylko, ze wtedy funkcja będzie działać wyłącznie na stringach z FLASH.
  • #5 15108720
    dzidav8
    Poziom 9  
    Dzięki za pomoc, zrobiłem drugą funkcję LCD_PutText_B_P ze strcpy_P i strlen_P i działa :)
REKLAMA