niedziela, 15 listopada 2015

[18] Arduino - Pamięć EEPROM

W tym poście chciałbym opisać sposób obsługi pamięci EEPROM.

[Źródło: https://store.arduino.cc/usa/arduino-uno-rev3]


Wstęp


EEPROM (ang. Electrucally-Erasable Programmable Read-Only Memory) jest to rodzaj pamięci komputerowej, którą można kasować za pomocą prądu elektrycznego. Posiada ona ograniczoną liczbę zapisów i kasowań, natomiast ilość odczytów z niej jest nieograniczona. Pozwala ona na przechowywanie nie dużej ilości danych, które muszą być dostępne nawet po zaniku zasilania.

Mikrokontroler Atmga328 posiada pamięć EEPROM o pojemnosci 1024b. Jej żywotność wynosi 100000 cykli zapisu/odczytu.

Obsługa


Do obsługi pamięci EEPROM wykorzystuje sie bibliotekę EEPROM.h. Zawiera ona następujące funkcje:

  • read() - odczytuje bajt danych z pamięci EEPROM. Składnia: EEPROM.read.(address)
  • write() - wpisuje dane do pamięci. Składnia EEPROM.write(address, value). Adres jest wartością całkowitą dodatnią, natomiast value jest daną jaka ma zostać wprowadzona w określone miejsce. Zakres od 0 do 255 bajtów. Zapis do pamięci trwa 3.3ms.
  • update() - działa podobnie jak funckja write(), z tą różnicą, że sprawdza ona czy dana jaka ma zostać wprowadzona znajduje się już w pamięci. Jeśli jest wprowadzona ta sama, wtedy nie zostanie ona zapisana. Jej głównym zadaniem jest oszczędzanie pamięci EEPROM, przez ograniczenie ilości zapisów i odczytów. Składnia wygląda następująco EEPROM.update(address, value).
  • get() - odczytuje dane przechowywane w pamięci. Mogą to być zwykłe dane lub obiekty
  • put() - zapisuje dane każdego typu do pamięci eeprom
  • EEPROM[] - pozwala na odczytanie, wpisanie danych do pamięci poprzez podanie adresu

Program - EEPROM[]


Najprostszym sposobem uzykania dostępu do pamięci EEPROM jest wykorzystanie funkcji EEPROM[]. Pozwala ona na przeprowadzenie podstawowych operacji.

  1. #include <EEPROM.h>
  2.  
  3. void setup(){
  4.  
  5.   Serial.begin(9600);
  6.  
  7.   unsigned char val;
  8.  
  9.   //Kod ASCII dla a - 97
  10.   val = 'a';
  11.   EEPROM[0] = val;
  12.  
  13.   Serial.print("Wartosc w [0]: ");
  14.   Serial.println(EEPROM[ 0 ]);
  15.  
  16.   //Kod ASCII dla y - 121
  17.   val = 'y';
  18.   EEPROM[ 0 ] = val;
  19.  
  20.   Serial.print("Wartosc w [0] po zmianie: ");
  21.   Serial.println(EEPROM[ 0 ]);
  22. }
  23.  
  24. void loop(){}

Program - Czyszczenie pamięci


Czyszczenie pamięci można wykonać za pomocą pętli for przechodząc przez każdy element. Długość można dobrać na dwa sposoby, za pomocą funckji EEPROM.length() która zwraca długość pamięci, lub wpisując tą wartość na sztywno. Dla Arduino Uno ta wartość wynosi 1024. Czyszczenie odbywa się poprzez wpisanie wartości 0 do każdej komórki.

  1. #include <EEPROM.h>
  2.  
  3. void setup(){
  4.  
  5.   for (int i = 0 ; i < EEPROM.length() ; i++) {
  6.     EEPROM.write(i, 0);
  7.   }
  8.  
  9.   /*lub tak
  10.  
  11.   for (int i = 0 ; i < 1024) ; i++) {
  12.     EEPROM.write(i, 0);
  13.   } */
  14. }
  15.  
  16. void loop(){}

Program - Krótka prezentacja


Ten program przedstawia dosyć prostą i łatwą możliwość obsługi poszczególnych funkcji jakie są dostępne w opisywanej bibliotece.

  1. #include <EEPROM.h>
  2.  
  3. void setup(){
  4.   int odczytaj;
  5.   int wpisz = 20;
  6.   float ulamkowa = 345.234;
  7.   Serial.begin(9600);
  8.  
  9.   //Wpisanie do pamięci wartości 20
  10.   EEPROM.write(1, wpisz);
  11.   Serial.print("Wpisana wartosc wynosi: ");
  12.   Serial.println(odczytaj);
  13.  
  14.   //Odczytanie danej i wyswietlenie jej poprzez port szeregowy
  15.   odczytaj = EEPROM.read(1);
  16.   Serial.print("Odczytana wartosc to: ");
  17.   Serial.println(odczytaj);
  18.  
  19.   EEPROM.write(220);
  20.   EEPROM.write(315);
  21.  
  22.   Serial.println("Funkcja Update");
  23.   Serial.print("wartosci przed wykonaniem: ");
  24.   Serial.print(EEPROM.read(2));
  25.   Serial.print("   ");
  26.   Serial.println(EEPROM.read(3));
  27.  
  28.   EEPROM.update(220);
  29.   EEPROM.update(342);
  30.  
  31.   Serial.print("Wartosci po wykonaniu: ");
  32.   Serial.print(EEPROM.read(2));
  33.   Serial.print("   ");
  34.   Serial.println(EEPROM.read(3));
  35.  
  36.   Serial.println("Przyklad funckja put get i read dla wartosci float:  ");
  37.   EEPROM.put(4, ulamkowa);
  38.   Serial.println(EEPROM.get(4, ulamkowa));
  39.   Serial.println(EEPROM.read(4));
  40. }
  41.  
  42. void loop(){}

Dodatkowo funkcja get i put daje możliwość obsługi zdeklarowanych struktur i obiektów. Dokładne przedstawienie tych elementów można znaleźć w przykładach przedstawionych w oprogramowaniu do Arduino.