Uvod u EEPROM u Arduinu

Isprobajte Naš Instrument Za Uklanjanje Problema





U ovom postu shvatit ćemo što je EEPROM, kako se podaci pohranjuju na ugrađenom EEPROM-u Arduino ploče Mikrokontroler i također praktično testirajte kako pisati i čitati podatke na EEPROM-u na nekoliko primjera.

Uvod u EEPROM u Arduinu

Zašto EEPROM?

Prije nego što pitamo što je EEPROM? Vrlo je važno znati zašto se EEPROM uopće koristi za pohranu. Tako da, imamo jasnu ideju o EEPROM-ovima.



Danas je dostupno mnogo uređaja za pohranu, od magnetskih uređaja za pohranu poput tvrdih diskova računala, kasetofona starih škola, optičkih medija za pohranu poput CD-a, DVD-a, Blu-ray diskova i SSD memorije poput SSD-a (Solid State Drive) računala i memorijske kartice itd.

To su uređaji za masovno pohranjivanje podataka koji mogu pohraniti podatke poput glazbe, videozapisa, dokumenata itd. Od samo nekoliko kilobajta do multi-terabajta. To je trajna memorija, što znači da se podaci mogu zadržati čak i nakon prekida napajanja medija za pohranu.



Uređaj koji isporučuje umirujuću glazbu ili videozapise koji iskaču oči, poput računala ili pametnog telefona, pohranjuje neke ključne podatke kao što su podaci o konfiguraciji, podaci o pokretanju, lozinke, biometrijski podaci, podaci za prijavu itd.

Ti se spomenuti podaci ne mogu pohraniti u uređaje za masovno pohranu iz sigurnosnih razloga, a također bi ih korisnici mogli nenamjerno mijenjati što bi moglo dovesti do neispravnosti uređaja.

Ti podaci uzimaju samo nekoliko bajtova do nekoliko megabajta, jer spajanje konvencionalnog uređaja za pohranu poput magnetskog ili optičkog medija na procesorske čipove nije ekonomski i fizički izvedivo.

Dakle, ti se kritični podaci pohranjuju u samim procesorskim čipovima.

Arduino se ne razlikuje od računala ili pametnih telefona. Postoji nekoliko okolnosti u kojima trebamo pohraniti neke kritične podatke koji se ne smiju izbrisati ni nakon prekida napajanja, na primjer podatke senzora.

Do sada biste već imali ideju zašto nam treba EEPROM na čipovima mikroprocesora i mikrokontrolera.

Što je EEPROM?

EEPROM je skraćenica od Električno izbrisive programabilne memorije samo za čitanje. To je također trajno sjećanje koje se može čitati i pisati byte mudar.

Čitanje i pisanje na razini bajta razlikuje se od ostalih poluvodičkih memorija. Na primjer flash memorija: blok čitanje, pisanje i brisanje podataka.

Blok može biti nekoliko stotina do tisuća bitova, što je izvedivo za masovnu pohranu, ali ne i za operacije 'Samo za čitanje memorije' u mikroprocesorima i mikrokontrolerima, koji trebaju pristupiti bajtnim podacima.

Na ploči Arduino Uno (ATmega328P) ima na ploči 1KB ili 1024 bajta EEPROM-a. Svakom se bajtu može pristupiti pojedinačno, svaki bajt ima adresu u rasponu od 0 do 1023 (to je ukupno 1024).

Adresa (0-1023) je memorijsko mjesto na kojem će se čuvati naši podaci.

Na svaku adresu možete pohraniti 8-bitne podatke, numeričke znamenke od 0 do 255. Naši se podaci pohranjuju u binarnom obliku, pa ako zapišemo broj 255 u EEPROM, pohranit će znamenku kao 11111111 na adresu, a ako pohranimo nulu, pohranit će se kao 00000000.

Također možete pohraniti tekst, posebne znakove, alfanumeričke znakove itd. Pisanjem odgovarajućeg programa.

Ovdje se ne raspravlja o detaljima konstrukcije i radu, što bi ovaj članak moglo učiniti dugotrajnim, a mi možemo zaspati. Krenite prema YouTubeu ili Googleu, postoje zanimljivi članci / videozapisi o konstrukciji i radu EEPORM-a.

Nemojte brkati EEPROM s EPROM:

Ukratko, EPROM je električki programibilna memorija samo za čitanje što znači da se može programirati (pohraniti memoriju) električno, ali se ne može električno izbrisati.

Koristi sjajni sjaj ultraljubičastog svjetla iznad čipa za pohranu koji briše pohranjene podatke. EEPROM je došao kao zamjena za EPROM i sada se rijetko koristi u bilo kojim elektroničkim uređajima.

Nemojte brkati Flash memoriju za EEPROM:

Flash memorija je poluvodička i nehlapljiva memorija koja je također električno izbrisiva i električki programibilna, zapravo flash memorija je izvedena iz EEPROM-a. Ali pristup memoriji u blokovskom smislu, ili drugim riječima, pristupa se načinu memorije i njegova se konstrukcija razlikuje od EEPROM-a.

Arduino Uno (mikrokontroler ATmega328P) također posjeduje 32 KB flash memorije za pohranu programa.

Životni vijek EEPROM-a:

Kao i svaki drugi elektronički medij za pohranu podataka, EEPROM također ima konačne cikluse čitanja, pisanja, brisanja. Ali problem je što ima jedan od najmanje životnih vijeka u usporedbi s bilo kojom drugom vrstom poluvodičke memorije.

Na Arduinovom EEPROM-u, Atmel je tvrdio oko 100000 (jedan lakh) ciklusa pisanja po ćeliji. Ako je vaša sobna temperatura niža, to je duži životni vijek EEPROM-a.

Imajte na umu da čitanje podataka s EEPROM-a ne utječe značajno na životni vijek.

Postoje vanjski EEPROM IC-ovi koji se s Arduinom mogu lako povezati s kapacitetom memorije od 8 KB, 128KB, 256 KB itd., S životnim vijekom od oko 1 milijun ciklusa pisanja po ćeliji.

To zaključuje EEPROM, sada biste stekli dovoljno teoretskog znanja o EEPROM-ima.

U sljedećem odjeljku naučit ćemo kako praktično testirati EEPROM na arduinu.

Kako testirati EEPROM u Arduinu

Da biste to implementirali, potreban vam je samo USB kabel i ploča Arduino Uno, spremni ste za rad.

Iz gornjih objašnjenja shvatili smo da EEPROM-ovi imaju adresu na kojoj pohranjujemo svoje podatke. U Arduino Uno možemo pohraniti 0 do 1023 lokacije. Svaka lokacija može primiti 8-bit ili jedan bajt.

U ovom primjeru pohranit ćemo podatke na adresu. Kako bismo smanjili složenost programa i kako bi program bio kraći, pohranit ćemo jednoznamenkasti cijeli broj (0 do 9) na adresu od 0 do 9.

Programski kod # 1

Sada prenesite kôd na Arduino:
//------------------Program Developed by R.GIRISH-------------------//
#include
int inputAddress = 0
int inputValue = 0
int ReadData = 0
boolean Readadd = true
boolean Readval = true
void setup()
{
Serial.begin(9600)
Serial.println('Enter the address (0 to 9)')
Serial.println('')
while(Readadd)
{
inputAddress = Serial.read()
if(inputAddress > 0)
{
inputAddress = inputAddress - 48
Readadd = false
}
}
Serial.print('You have selected Address: ')
Serial.println(inputAddress)
Serial.println('')
delay(2000)
Serial.println('Enter the value to be stored (0 to 9)')
Serial.println('')
while(Readval)
{
inputValue = Serial.read()
if(inputValue > 0)
{
inputValue = inputValue - 48
Readval = false
}
}
Serial.print('The value you entered is: ')
Serial.println(inputValue)
Serial.println('')
delay(2000)
Serial.print('It will be stored in Address: ')
Serial.println(inputAddress)
Serial.println('')
delay(2000)
Serial.println('Writing on EEPROM.....')
Serial.println('')
EEPROM.write(inputAddress, inputValue)
delay(2000)
Serial.println('Value stored successfully!!!')
Serial.println('')
delay(2000)
Serial.println('Reading from EEPROM....')
delay(2000)
ReadData = EEPROM.read(inputAddress)
Serial.println('')
Serial.print('The value read from Address ')
Serial.print(inputAddress)
Serial.print(' is: ')
Serial.println(ReadData)
Serial.println('')
delay(1000)
Serial.println('Done!!!')
}
void loop()
{
// DO nothing here.
}
//------------------Program Developed by R.GIRISH-------------------//

IZLAZ:

Nakon što se kôd prenese, otvorite serijski monitor.

Tražit će od vas da unesete adresu u rasponu od 0 do 9. Iz gornjeg izlaza upisao sam adresu 3. Dakle, pohranit ću cjelobrojnu vrijednost na mjesto (adresu) 3.

Sada će se od vas tražiti da unesete jednoznamenkastu cijelu vrijednost u rasponu od 0 do 9. Iz gornjeg izlaza unijeo sam vrijednost 5.

Dakle, sada će vrijednost 5 biti pohranjena na adresnom mjestu 3.

Jednom kada unesete vrijednost, zapisat će je na EEPROM.

Pokazat će poruku uspjeha, što znači da je vrijednost pohranjena.

Nakon nekoliko sekundi očitat će vrijednost koja je pohranjena na komentiranoj adresi i prikazat će vrijednost na serijskom monitoru.

U zaključku smo napisali i pročitali vrijednosti iz EEPROM-a Arduinovog mikrokontrolera.

Sada ćemo koristiti EEPROM za pohranu lozinke.

Unosit ćemo 6-znamenkasti broj (ni manje ni više) lozinke, on će biti pohranjen na 6 različitih adresa (svaka adresa za svaku znamenku) i jednu dodatnu adresu za pohranu '1' ili '0'.

Nakon što unesete lozinku, dodatna adresa pohranit će vrijednost '1' koja označava da je lozinka postavljena, a program će tražiti da unesete lozinku da biste uključili LED.

Ako je dodatna adresa pohranjena vrijednost '0' ili je prisutna bilo koja druga vrijednost, zatražit će od vas da kreirate novu 6-znamenkastu lozinku.

Gornjom metodom program može prepoznati jeste li već postavili lozinku ili trebate stvoriti novu lozinku.

Ako je unesena lozinka ispravna, LED za ugradnju na pin # 13 svijetli, ako je unesena lozinka netočna, LED neće svijetliti i serijski monitor će zatražiti da je lozinka pogrešna.

Programski kod # 2

Sada prenesite kôd:
//------------------Program Developed by R.GIRISH---------------//
#include
int passExistAdd = 200
const int LED = 13
int inputAddress = 0
int word1 = 0
int word2 = 0
int word3 = 0
int word4 = 0
int word5 = 0
int word6 = 0
int wordAddress1 = 0
int wordAddress2 = 1
int wordAddress3 = 2
int wordAddress4 = 3
int wordAddress5 = 4
int wordAddress6 = 5
int passwordExist = 0
boolean ReadVal1 = true
boolean ReadVal2 = true
boolean ReadVal3 = true
boolean ReadVal4 = true
boolean ReadVal5 = true
boolean ReadVal6 = true
int checkWord1 = 0
int checkWord2 = 0
int checkWord3 = 0
int checkWord4 = 0
int checkWord5 = 0
int checkWord6 = 0
void setup()
{
Serial.begin(9600)
pinMode(LED, OUTPUT)
digitalWrite(LED, LOW)
passwordExist = EEPROM.read(passExistAdd)
if(passwordExist != 1)
{
Serial.println('Enter a new 6 number password:')
while(ReadVal1)
{
word1 = Serial.read()
if(word1 > 0)
{
word1 = word1 - 48
ReadVal1 = false
}
}
while(ReadVal2)
{
word2 = Serial.read()
if(word2 > 0)
{
word2 = word2 - 48
ReadVal2 = false
}
}
while(ReadVal3)
{
word3 = Serial.read()
if(word3 > 0)
{
word3 = word3 - 48
ReadVal3 = false
}
}
while(ReadVal4)
{
word4 = Serial.read()
if(word4 > 0)
{
word4 = word4 - 48
ReadVal4 = false
}
}
while(ReadVal5)
{
word5 = Serial.read()
if(word5 > 0)
{
word5 = word5 - 48
ReadVal5 = false
}
}
while(ReadVal6)
{
word6 = Serial.read()
if(word6 > 0)
{
word6 = word6 - 48
ReadVal6 = false
}
}
Serial.println('')
Serial.print(word1)
Serial.print(word2)
Serial.print(word3)
Serial.print(word4)
Serial.print(word5)
Serial.print(word6)
EEPROM.write(wordAddress1, word1)
EEPROM.write(wordAddress2, word2)
EEPROM.write(wordAddress3, word3)
EEPROM.write(wordAddress4, word4)
EEPROM.write(wordAddress5, word5)
EEPROM.write(wordAddress6, word6)
EEPROM.write(passExistAdd,1)
Serial.println(' Password saved Sucessfully!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
if(passwordExist == 1)
{
Serial.println('')
Serial.println('Please enter the 6 digit number password:')
while(ReadVal1)
{
word1 = Serial.read()
if(word1 > 0)
{
word1 = word1 - 48
ReadVal1 = false
}
}
while(ReadVal2)
{
word2 = Serial.read()
if(word2 > 0)
{
word2 = word2 - 48
ReadVal2 = false
}
}
while(ReadVal3)
{
word3 = Serial.read()
if(word3 > 0)
{
word3 = word3 - 48
ReadVal3 = false
}
}
while(ReadVal4)
{
word4 = Serial.read()
if(word4 > 0)
{
word4 = word4 - 48
ReadVal4 = false
}
}
while(ReadVal5)
{
word5 = Serial.read()
if(word5 > 0)
{
word5 = word5 - 48
ReadVal5 = false
}
}
while(ReadVal6)
{
word6 = Serial.read()
if(word6 > 0)
{
word6 = word6 - 48
ReadVal6 = false
}
}
checkWord1 = EEPROM.read(wordAddress1)
if(checkWord1 != word1)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord2 = EEPROM.read(wordAddress2)
if(checkWord2 != word2)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord3 = EEPROM.read(wordAddress3)
if(checkWord3 != word3)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord4 = EEPROM.read(wordAddress4)
if(checkWord4 != word4)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord5 = EEPROM.read(wordAddress5)
if(checkWord5 != word5)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
checkWord6 = EEPROM.read(wordAddress6)
if(checkWord6 != word6)
{
Serial.println('')
Serial.println('Wrong Password!!!')
Serial.println('')
Serial.println('Press Reset Button.')
while(true){}
}
digitalWrite(LED, HIGH)
Serial.println('')
Serial.println('LED is ON')
Serial.println('')
Serial.println('Press Reset Button.')
}
}
void loop()
{
}
//------------------Program Developed by R.GIRISH---------------//

IZLAZ:

Otvorite serijski monitor, tražit će vas da stvorite 6-znamenkastu lozinku.

Unesite bilo koju 6-znamenkastu lozinku, zabilježite je i pritisnite enter. Sada je lozinka spremljena.

Možete pritisnuti gumb za resetiranje ili odspojiti USB kabel s računala, što dovodi do prekida napajanja Arduino ploče.

Sada ponovno spojite USB kabel, otvorite serijski monitor, koji će zatražiti da unesete spremljenu 6-znamenkastu lozinku.

Unesite ispravnu lozinku LED će svijetliti.

Ako želite promijeniti lozinku, promijenite znamenku iz koda:

int passExistAdd = 200

Gornji je redak dodatna adresa o kojoj smo ranije razgovarali. Promijenite bilo gdje od 6 do 1023. 0 do 5 adresa rezervirano je za pohranu 6-znamenkastog zaporka.

Promjena ove dodatne adrese zavarit će program da lozinka još nije stvorena i zatražit će od vas da napravite novu 6-znamenkastu lozinku.

Ako imate bilo kakvih pitanja u vezi s ovim EEPROM-om u Arduinoovom uputstvu, izrazite u komentarima, možda ćete dobiti brzi odgovor.




Prethodno: Prekinuto strujno napajanje pomoću Arduina Dalje: Robotski automobil kojim upravlja mobitel pomoću DTMF modula