Osiągnąłem swój limit!
W moich programach bardzo często zdarza się, że mam zmienną całkowitą, której używam jako wskaźnika (lub indeksu) do liczby elementów w tablicy lub podobnej jednostce. Na przykład, powiedzmy, że mamy dziesięć elementów ponumerowanych od 0 do 9. Dla przejrzystości naszego kodu i ułatwienia jego modyfikacji w przyszłości, możemy zdefiniować NUM_E („liczba elementów”) jako 10, a MAX_E („maksymalny element”) jako 9. (Możemy również zdefiniować MIN_E jako 0, ale zazwyczaj używamy po prostu 0).
Załóżmy, że nasz wskaźnik liczby całkowitej nazywa się PtrP. Czasami chcemy zwiększyć ten wskaźnik, dodając 1 do jego bieżącej wartości. Oczywiście, gdy jego aktualna wartość wynosi 9, chcemy, aby jego zwiększona wartość „zawinęła się” do 0. W tym przypadku, pamiętając, że operator % modulo zwraca resztę z dzielenia liczb całkowitych i opierając się na naszych dyskusjach z poprzedniego spotkania (EdW 10/2024), przed dyskusją ze Stevem, mógłbym użyć instrukcji jak poniżej:
W innych przypadkach chcemy zmniejszyć nasz wskaźnik, odejmując 1 (lub dodając –1) do jego bieżącej wartości. W tym przypadku, gdy jego aktualna wartość wynosi 0, chcemy, aby jego zmniejszona wartość „zawinęła się” do 9. Ponownie, w oparciu o nasze wcześniejsze dyskusje, mógłbym użyć instrukcji jak poniżej:
Problem z pamięcią SRAM polega na tym, że jest ona ulotna, co oznacza, że zapomina swoją zawartość po odłączeniu zasilania od systemu. Pamięć Flash jest nieulotna, co oznacza, że pamięta swoją zawartość po odłączeniu zasilania, ale to właśnie w niej przechowywany jest główny program. Załóżmy, że zdecydujemy się napisać program, który mierzy temperaturę otoczenia raz na godzinę i chcemy zapisać te wartości w taki sposób, abyśmy mogli je później odzyskać, nawet jeśli zasilanie mikrokontrolera ulegnie awarii w dowolnym momencie. W takim przypadku jedną z opcji byłoby użycie pamięci EEPROM.
Podobnie, w przypadku 10-znakowych 21-segmentowych wyświetlaczy wiktoriańskich, które Steve i ja konstruujemy, chcemy użyć bajtowych wartości całkowitych bez znaku, aby śledzić różne ustawienia użytkownika, takie jak preferowany format daty (np. 0 = RRRR/MM/DD, 1 = MM/DD/RRRR, 2 = DD/MM/RRRR) i format czasu (np. 0 = 12-godzinny, 1 = 24-godzinny) oraz lokalizację (np. 0 = Wielka Brytania, 1 = USA) i sposób obsługi czasu letniego (np. 0 = ręcznie, 1 = automatycznie) i tak dalej. (FYI, „czas letni” jest nazywany „czasem letnim” (DST) w USA i „brytyjskim czasem letnim” (BST) w Wielkiej Brytanii).
Oczywiście w naszym głównym programie ustalimy wartości domyślne dla tych ustawień. Chcemy jednak również umożliwić użytkownikowi zmianę tych ustawień podczas działania programu i chcemy, aby nasz wyświetlacz pamiętał te zdefiniowane przez użytkownika ustawienia po odłączeniu zasilania od systemu. Ponownie, jednym ze sposobów osiągnięcia tego celu jest użycie pamięci EEPROM.
Należy pamiętać, że termin „bajt” odnosi się do wielkości 8-bitowej. Jak omówiliśmy w głównej części artykułu, mikrokontrolery Teensy 3.2 i 3.6 mają odpowiednio 2 kB (2,048 bajtów ponumerowanych od 0 do 2,047) i 4 kB (4,096 bajtów ponumerowanych od 0 do 4,095) pamięci EEPROM.