Obsah:

Čtení a zápis dat do externí EEPROM pomocí Arduina: 5 kroků
Čtení a zápis dat do externí EEPROM pomocí Arduina: 5 kroků

Video: Čtení a zápis dat do externí EEPROM pomocí Arduina: 5 kroků

Video: Čtení a zápis dat do externí EEPROM pomocí Arduina: 5 kroků
Video: Lesson 38: Using MLX90614 Infrared Contactless Temperature Sensor | Arduino Step By Step Course 2024, Listopad
Anonim
Čtení a zápis dat do externí EEPROM pomocí Arduina
Čtení a zápis dat do externí EEPROM pomocí Arduina

EEPROM znamená elektricky vymazatelná programovatelná paměť jen pro čtení.

EEPROM je velmi důležitá a užitečná, protože je energeticky nezávislou formou paměti. To znamená, že i když je deska vypnutá, čip EEPROM stále zachovává program, který byl na ni zapsán. Když tedy desku vypnete a znovu zapnete, lze spustit program, který byl zapsán do EEPROM. V zásadě tedy EEPROM ukládá a spouští program bez ohledu na to. To znamená, že můžete zařízení vypnout, nechat ho 3 dny vypnuté, vrátit se a zapnout a stále může spouštět program, který byl v něm naprogramován. Tak funguje většina spotřebních elektronických zařízení.

Tento projekt je sponzorován LCSC. Používám elektronické součástky z LCSC.com. LCSC má silný závazek nabízet široký výběr originálních, vysoce kvalitních elektronických součástek za nejlepší cenu s globální přepravní sítí do více než 200 zemí. Zaregistrujte se ještě dnes a získejte slevu 8 $ na první objednávku.

EEPROM je také velmi efektivní v tom, že jednotlivé bajty v tradiční EEPROM lze nezávisle číst, mazat a přepisovat. Ve většině ostatních druhů energeticky nezávislé paměti to nelze provést. Sériová zařízení EEPROM, jako je EEPROM řady Microchip 24, vám umožňují přidat více paměti k jakémukoli zařízení, které dokáže mluvit I²C.

Zásoby

  1. EEPROM - 24LC512
  2. ATmega328P-PU
  3. 16 MHz krystal
  4. Prkénko
  5. Rezistor 4,7k Ohm x 2
  6. Kondenzátor 22 pF x 2

Krok 1: Základy EEPROM

Základy EEPROM
Základy EEPROM

Čip Microchip 24LC2512 lze zakoupit v 8pólovém DIP balení. Piny na 24LC512 jsou docela přímé a skládají se z napájení (8), GND (4), ochrany proti zápisu (7), SCL/SDA (6, 5) a tří adresových pinů (1, 2, 3).

Stručná historie ROM

Počáteční počítače typu „Stored -Program“- jako stolní kalkulačky a klávesové tlumočníky - začaly používat ROM ve formě ROM Diode Matrix. Jednalo se o paměť tvořenou diskrétními polovodičovými diodami umístěnými na speciálně organizovaném PCB. To ustoupilo maskování ROM s příchodem integrovaných obvodů. Maska ROM byla hodně podobná Diode Matrix ROM, ale byla implementována v mnohem menším měřítku. To však znamenalo, že páječkou nemůžete přesouvat pár diod a přeprogramovat ji. Masku ROM musel naprogramovat výrobce a poté ji nebylo možné změnit.

Bohužel, maska ROM byla drahá a výroba trvala dlouho, protože každý nový program vyžadoval výrobu zcela nového zařízení slévárnou. V roce 1956 byl však tento problém vyřešen vynálezem PROM (Programmable ROM), který vývojářům umožnil programovat samotné čipy. To znamenalo, že výrobci mohli vyrábět miliony stejného neprogramovaného zařízení, díky čemuž bylo levnější a praktičtější. PROM však bylo možné zapsat pouze jednou pomocí programovacího zařízení vysokého napětí. Po naprogramování zařízení PROM nebylo možné zařízení vrátit do neprogramovaného stavu.

To se změnilo v roce 1971 vynálezem EPROM (Erasable Programmable ROM), který - kromě přidání dalšího písmena ke zkratce - s sebou přinesl možnost vymazat zařízení a vrátit jej do „prázdného“stavu pomocí silného zdroje UV světla. Přesně tak, na přeprogramování jste museli na IC svítit jasným světlem, jak je to cool? Ukazuje se, že je to docela skvělé, pokud nejste vývojář pracující na firmwaru, v takovém případě byste opravdu chtěli přeprogramovat zařízení pomocí elektrických signálů. To se nakonec stalo skutečností v roce 1983 s vývojem EEPROM (elektricky vymazatelná programovatelná ROM) a tím se dostáváme k aktuální denní těžkopádné zkratce.

Krok 2: Zajímavosti EEPROM

EEPROM jako způsob ukládání dat má dvě hlavní nevýhody. Ve většině aplikací převažují klady nad zápory, ale před začleněním EEPROM do dalšího návrhu byste si jich měli být vědomi.

Za prvé, technologie, díky které funguje EEPROM, také omezuje počet přepisů. Souvisí to s tím, že se elektrony zachytí v tranzistorech tvořících ROM a hromadí se, dokud není rozdíl v náboji mezi „1“a „0“nerozpoznatelný. Ale nebojte se, většina EEPROM má maximální počet přepisů 1 milion a více. Dokud nepíšete nepřetržitě do EEPROM, je nepravděpodobné, že dosáhnete tohoto maxima. Za druhé, paměť EEPROM nebude vymazána, pokud z ní odeberete energii, ale nebude vaše data uchovávat po neomezenou dobu. Elektrony se mohou odchýlit od tranzistorů a přes izolátor, což v průběhu času účinně vymaže EEPROM. To znamená, že k tomu obvykle dochází v průběhu let (i když to může být urychleno teplem). Většina výrobců uvádí, že vaše data jsou v EEPROM v bezpečí 10 let a více při pokojové teplotě. A při výběru zařízení EEPROM pro váš projekt byste měli mít na paměti ještě jednu věc. Kapacita paměti EEPROM se měří v bitech, nikoli v bajtech. 512 kB EEPROM pojme 512 kB dat, jinými slovy pouze 64 kB.

Krok 3: Připojení hardwaru Arduino

Zapojení hardwaru Arduino
Zapojení hardwaru Arduino
Zapojení hardwaru Arduino
Zapojení hardwaru Arduino

Dobře, teď, když víme, co je EEPROM, připojme jeden a uvidíme, co to dokáže! Aby naše zařízení mohlo mluvit, budeme muset připojit napájení i sériové linky I²C. Toto zařízení zejména běží na 5VDC, takže jej připojíme k výstupu 5V našeho Arduino UNO. Také linky I²C budou pro správnou komunikaci potřebovat stahovací odpory. Hodnota těchto rezistorů závisí na kapacitě vedení a frekvenci, kterou chcete sdělit, ale dobrým pravidlem pro nekritické aplikace je udržovat jej v rozsahu kΩ. V tomto případě použijeme pull-up rezistory 4,7 kΩ.

Na tomto zařízení jsou tři piny pro výběr adresy I²C. Tímto způsobem můžete mít na sběrnici více než jednu EEPROM a každý je adresovat jinak. Mohli byste je všechny uzemnit, ale zapojíme je, abychom později v tutoriálu mohli připojit zařízení s vyšší kapacitou.

K propojení všeho použijeme prkénko. Níže uvedený diagram ukazuje správné připojení pro většinu zařízení I²C EEPROM, včetně EEPROM řady Microchip 24, kterou prodáváme.

Krok 4: Čtení a psaní

Většinu času, kdy používáte EEPROM ve spojení s mikrokontrolérem, ve skutečnosti nebudete muset vidět celý obsah paměti najednou. Budete jen číst a zapisovat bajty sem a tam podle potřeby. V tomto případě však napíšeme celý soubor do EEPROM a poté jej celý přečteme, abychom jej mohli zobrazit na počítači. To by nám mělo usnadnit myšlenku používání EEPROM a také nám dát pocit, kolik dat se skutečně vejde na malé zařízení.

Něco napsat

Náš příklad skici jednoduše převezme jakýkoli bajt, který přijde přes sériový port, a zapíše jej do EEPROM, přičemž sleduje, kolik bytů jsme zapsali do paměti.

Zápis bajtu paměti do EEPROM se obvykle provádí ve třech krocích:

  1. Odešlete nejvýznamnější bajt adresy paměti, na kterou chcete zapisovat.
  2. Odešlete nejméně významný bajt adresy paměti, na kterou chcete zapisovat.
  3. Odešlete datový bajt, který byste chtěli uložit na toto místo.

Pravděpodobně existuje několik klíčových slov, která jen stěží vysvětlují:

Adresy paměti

Pokud si představíte, že všechny bajty v 512 Kbitové EEPROM stojí v řádku od 0 do 64000 - protože na bajt je 8 bitů, a proto se na 512 Kbit EEPROM vejde 64000 bajtů - pak adresa paměti je místo v řádek, kde byste našli konkrétní byte. Tuto adresu musíme poslat do EEPROM, aby věděla, kam umístit bajt, který posíláme.

Nejvýznamnější a nejméně významné bajty

Protože v 256 Kbit EEPROM je 32 000 možných míst - a protože 255 je největší číslo, které můžete v jednom bajtu zakódovat - musíme tuto adresu odeslat ve dvou bajtech. Nejprve odešleme nejvýznamnější bajt (MSB) - v tomto případě prvních 8 bitů. Poté odešleme nejméně významný bajt (LSB) - druhých 8 bitů. Proč? Protože to je způsob, jakým zařízení očekává, že je přijme, to je vše.

Psaní stránek

Zápis po jednom bajtu najednou je v pořádku, ale většina zařízení EEPROM má něco, co se nazývá „vyrovnávací paměť pro zápis stránky“, což vám umožňuje zapisovat více bajtů najednou stejným způsobem, jako byste jeden bajt. Toho v našem ukázkovém náčrtu využijeme. EEPROM používá interní čítač, který automaticky zvyšuje umístění paměti s každým následujícím datovým bajtem, který obdrží. Jakmile je adresa paměti odeslána, můžeme ji sledovat až s 64 bajty dat. EEPROM předpokládá (správně), že adresa 312 následovaná 10 bajty bude zaznamenávat bajt 0 na adrese 312, bajt 1 na adrese 313, bajt 2 na adrese 314 atd.

Něco si přečtěte

Čtení z EEPROM v zásadě probíhá stejným způsobem ve třech krocích jako zápis do EEPROM:

  1. Odešlete nejvýznamnější bajt adresy paměti, na kterou chcete zapisovat.
  2. Odešlete nejméně významný bajt adresy paměti, na kterou chcete zapisovat.
  3. V tomto místě požádejte o datový bajt.

Krok 5: Schémata a kód

Schémata a kód
Schémata a kód

Kód:

#zahrnout

#define eeprom 0x50 // definuje základní adresu EEPROM

neplatné nastavení () {

Wire.begin (); // vytvoří objekt Wire

Serial.begin (9600);

nepodepsaná int adresa = 0; // první adresa EEPROM

Serial.println ("Píšeme PSČ 22222, PSČ"); pro (adresa = 0; adresa <5; adresa ++) writeEEPROM (eeprom, adresa, '2'); // Zapíše 22222 do EEPROM

pro (adresa = 0; adresa <5; adresa ++) {Serial.print (readEEPROM (eeprom, adresa), HEX); }}

prázdná smyčka () {

/*ve funkci loop () není nic, protože nechceme, aby arduino opakovaně zapisovalo to samé do EEPROM znovu a znovu. Chceme pouze jednorázové zapisování, aby se funkce loop () u EEPROM vyhnula.*/}

// definuje funkci writeEEPROM

void writeEEPROM (int deviceaddress, unsigned int eeaddress, byte data) {Wire.beginTransmission (deviceaddress); Wire.write ((int) (eeaddress >> 8)); // zapíše MSB Wire.write ((int) (eeaddress & 0xFF)); // zapisuje LSB Wire.write (data); Wire.endTransmission (); }

// definuje funkci readEEPROM

byte readEEPROM (int deviceaddress, unsigned int eeaddress) {byte rdata = 0xFF; Wire.beginTransmission (adresa zařízení); Wire.write ((int) (eeaddress >> 8)); // zapíše MSB Wire.write ((int) (eeaddress & 0xFF)); // píše LSB Wire.endTransmission (); Wire.requestFrom (adresa zařízení, 1); if (Wire.available ()) rdata = Wire.read (); vrátit rdata; }

Doporučuje: