====== PROGMEM ======
Przeanalizujmy następujący fragment kodu: LCD_write("Jakis tekst");
Jest to fragment kodu wypisujący na wyświetlaczu LCD tekst. Pomimo że wydaje się to optymalnym rozwiązaniem takim nie jest. Co się powinno dziać w przypadku wywołania takiej funkcji? Funkcja powinna pobierać znak po znaku każdą literę z pamięci programu i wysyłać je do wyświetlacza. Niestety funkcja ta nie odczytuje tekstu z pamięci programu (przypominam FLASH) lecz z pamięci RAM co jest wielką stratą i kosztuje nas cykle pracy układu. Jest jednak sposób na oszczędzenie pamięci. Będziemy korzystać z nagłówka: #include
Teraz jeżeli chcemy przechowywać łańcuch znaków tylko w pamięci programu napiszemy: const char string[] PROGMEM = "Ten łańcuch znaków nie może zostać zmieniony i jest przechowywany w pamięci FLASH.";
Lub kożystając z makra możemy wprowadzać łańcuchy wewnątrz kodu:LCD_write_P(PSTR("Program Memory String"));
Niestety to nie wszystko co trzeba zrobić, zmienna ''string'' oraz makro zwracają adres w pamięci FLASH a nie RAM tak jak jest to oczekiwane przez dotychczas istniejące funkcje. Trzeba je niestety zmodyfikować. Przeanalizujmy następujące fragmenty kodu: while (*data != '\0') ...
while (pgm_read_byte(data) != 0x00)
W przypadku odczytu z pamięci RAM korzystamy z pierwszej pętli natomiast aby odczytać bajt z pamięci programu należy wykorzystać funkcję ''pgm_read_byte''. Często wyróżnia się funkcje odczytujące z pamięci FLASH kończąc ich nazwę na ''_P''.
Bardzo dobre opracowanie PROGMEM: [[http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=38003|AVRFreaks]] [EN]