İçindekiler:

Arduino Kullanarak Harici EEPROM'a Veri Okuma ve Yazma: 5 Adım
Arduino Kullanarak Harici EEPROM'a Veri Okuma ve Yazma: 5 Adım

Video: Arduino Kullanarak Harici EEPROM'a Veri Okuma ve Yazma: 5 Adım

Video: Arduino Kullanarak Harici EEPROM'a Veri Okuma ve Yazma: 5 Adım
Video: arduino, eeprom veri okuma ve yazma işlemleri 2024, Temmuz
Anonim
Arduino Kullanarak Harici EEPROM'a Veri Okuma ve Yazma
Arduino Kullanarak Harici EEPROM'a Veri Okuma ve Yazma

EEPROM, Elektrikle Silinebilir Programlanabilir Salt Okunur Bellek anlamına gelir.

EEPROM, kalıcı bir bellek biçimi olduğu için çok önemli ve kullanışlıdır. Bu, kart kapatıldığında bile, EEPROM yongasının kendisine yazılan programı koruduğu anlamına gelir. Böylece kartı kapatıp tekrar açtığınızda EEPROM'a yazılan program çalıştırılabilir. Yani temelde, EEPROM ne olursa olsun bir programı depolar ve çalıştırır. Bu, bir cihazı kapatabileceğiniz, 3 gün boyunca kapalı tutabileceğiniz ve geri gelip açabileceğiniz ve içinde programlanmış programı çalıştırabileceği anlamına gelir. Çoğu tüketici elektroniği cihazı bu şekilde çalışır.

Bu proje LCSC tarafından desteklenmektedir. LCSC.com'dan elektronik bileşenler kullanıyorum. LCSC, 200'den fazla ülkeye küresel bir nakliye ağı ile en iyi fiyata çok çeşitli orijinal, yüksek kaliteli elektronik bileşenler sunma konusunda güçlü bir kararlılığa sahiptir. Bugün kaydolun ve ilk siparişinizde 8 $ indirim kazanın.

EEPROM ayrıca geleneksel bir EEPROM'daki bireysel baytların bağımsız olarak okunabilmesi, silinebilmesi ve yeniden yazılabilmesi açısından çok verimlidir. Diğer birçok uçucu olmayan bellek türünde bu yapılamaz. Microchip 24 serisi EEPROM gibi seri EEPROM cihazları, I²C konuşabilen herhangi bir cihaza daha fazla bellek eklemenize izin verir.

Gereçler

  1. EEPROM - 24LC512
  2. ATmega328P-PU
  3. 16 MHz Kristal
  4. ekmek tahtası
  5. Direnç 4.7k Ohm x 2
  6. Kondansatör 22 pF x 2

Adım 1: EEPROM Temelleri

EEPROM Temelleri
EEPROM Temelleri

Microchip 24LC2512 yongası, 8 pinli bir DIP paketinde satın alınabilir. 24LC512 üzerindeki pinler oldukça basittir ve güç(8), GND(4), yazma koruması(7), SCL/SDA(6, 5) ve üç adres pininden(1, 2, 3) oluşur.

ROM'un Kısa Tarihi

Masa hesap makineleri ve klavye tercümanları gibi erken "Stored-Program" tipi bilgisayarlar, Diode Matrix ROM biçiminde ROM'u kullanmaya başladı. Bu, özel olarak organize edilmiş bir PCB üzerine yerleştirilmiş ayrık yarı iletken diyotlardan oluşan bir bellekti. Bu, entegre devrelerin ortaya çıkmasıyla Mask ROM'a yol açtı. Mask ROM, Diode Matrix ROM'a çok benziyordu, ancak çok daha küçük bir ölçekte uygulandı. Ancak bu, birkaç diyotu bir havya ile hareket ettirip yeniden programlayamayacağınız anlamına geliyordu. Mask ROM'un üretici tarafından programlanması gerekiyordu ve bundan sonra değiştirilemezdi.

Ne yazık ki Mask ROM pahalıydı ve üretilmesi uzun zaman aldı çünkü her yeni program bir dökümhane tarafından üretilecek yepyeni bir cihaz gerektiriyordu. Ancak 1956'da bu sorun, geliştiricilerin çipleri kendilerinin programlamasına izin veren PROM'un (Programlanabilir ROM) icadıyla çözüldü. Bu, üreticilerin daha ucuz ve daha pratik hale getiren aynı programlanmamış cihazdan milyonlarca üretebileceği anlamına geliyordu. Ancak PROM, yüksek voltajlı bir programlama cihazı kullanılarak yalnızca bir kez yazılabilir. Bir PROM cihazı programlandıktan sonra cihazı programlanmamış durumuna döndürmenin bir yolu yoktu.

Bu, 1971'de, kısaltmaya başka bir harf eklemenin yanı sıra, EPROM'un (Silinebilir Programlanabilir ROM) icadıyla değişti ve beraberinde cihazı silme ve güçlü bir UV ışık kaynağı kullanarak "boş" duruma döndürme yeteneğini getirdi. Bu doğru, yeniden programlamak için IC'ye parlak bir ışık tutmanız gerekiyordu, bu ne kadar havalı? Donanım yazılımı üzerinde çalışan bir geliştirici değilseniz oldukça havalı görünüyor, bu durumda cihazı elektrik sinyallerini kullanarak yeniden programlamayı gerçekten isteyebilirsiniz. Bu nihayet 1983 yılında EEPROM'un (Electrically Erasable Programmable ROM) geliştirilmesiyle gerçek oldu ve bununla birlikte günümüzün hantal kısaltmasına geldik.

Adım 2: EEPROM'un Tuhaflıkları

Bir veri depolama yöntemi olarak EEPROM'un iki büyük dezavantajı vardır. Çoğu uygulamada, artılar eksilerinden daha ağır basar, ancak EEPROM'u bir sonraki tasarımınıza dahil etmeden önce bunların farkında olmalısınız.

Her şeyden önce, EEPROM'u çalıştıran teknoloji, yeniden yazılma sayısını da sınırlar. Bu, elektronların ROM'u oluşturan transistörlerde sıkışıp kalması ve "1" ile "0" arasındaki yük farkı tanınmaz hale gelene kadar birikmesiyle ilgilidir. Ancak endişelenmeyin, çoğu EEPROM'un maksimum yeniden yazma sayısı 1 milyon veya daha fazladır. Sürekli olarak EEPROM'a yazmadığınız sürece, bu maksimuma ulaşmanız pek olası değildir. İkincisi, EEPROM'dan gücü keserseniz silinmez, ancak verilerinizi süresiz olarak tutmaz. Elektronlar, zamanla EEPROM'u etkin bir şekilde silerek, transistörlerden ve yalıtkandan kayabilir. Bununla birlikte, bu genellikle yıllar içinde gerçekleşir (ısı ile hızlandırılabilse de). Çoğu üretici, verilerinizin oda sıcaklığında 10 yıl veya daha uzun süre EEPROM'da güvende olduğunu söylüyor. Ve projeniz için bir EEPROM cihazı seçerken aklınızda bulundurmanız gereken bir şey daha var. EEPROM kapasitesi bayt olarak değil, bit olarak ölçülür. Bir 512K EEPROM, 512Kbit veri tutacaktır, başka bir deyişle, sadece 64KB.

Adım 3: Arduino Donanım Bağlantısı

Arduino Donanım Bağlantısı
Arduino Donanım Bağlantısı
Arduino Donanım Bağlantısı
Arduino Donanım Bağlantısı

Tamam, artık EEPROM'un ne olduğunu bildiğimize göre, bir tane bağlayalım ve neler yapabileceğini görelim! Cihazımızı konuşturmak için I²C seri hatlarının yanı sıra gücü de bağlamamız gerekecek. Bu cihaz özellikle 5VDC'de çalışıyor, bu yüzden onu Arduino UNO'muzun 5V çıkışına bağlayacağız. Ayrıca, iletişimin doğru şekilde gerçekleşmesi için I²C hatlarının çekme dirençlerine ihtiyacı olacaktır. Bu dirençlerin değeri, hatların kapasitansına ve onu iletmek istediğiniz frekansa bağlıdır, ancak kritik olmayan uygulamalar için iyi bir kural, onu kΩ aralığında tutmaktır. Bu örnekte, 4.7kΩ pull-up dirençleri kullanacağız.

Bu cihaz üzerinde I²C adresini seçmek için üç adet pin bulunmaktadır, bu şekilde bus üzerinde birden fazla EEPROM'a sahip olabilir ve her birini farklı şekilde adresleyebilirsiniz. Hepsini topraklayabilirsiniz, ancak eğitimde daha sonra daha yüksek kapasiteli bir cihaza geçebilmemiz için kablolarını yapacağız.

Her şeyi birbirine bağlamak için bir devre tahtası kullanacağız. Aşağıdaki şema, sattığımız Microchip 24 serisi EEPROM dahil olmak üzere çoğu I²C EEPROM cihazı için doğru bağlantıyı göstermektedir.

Adım 4: Okuma ve Yazma

Çoğu zaman bir mikro denetleyici ile birlikte bir EEPROM kullandığınızda, aslında belleğin tüm içeriğini bir kerede görmeniz gerekmez. Gerektiğinde burada ve orada bayt okuyup yazacaksınız. Ancak bu örnekte, EEPROM'a bir dosyanın tamamını yazacağız ve sonra hepsini geri okuyarak bilgisayarımızda görüntüleyeceğiz. Bu, EEPROM kullanma fikri konusunda bizi rahatlatmalı ve ayrıca küçük bir cihaza gerçekten ne kadar verinin sığabileceği konusunda bize bir fikir vermelidir.

Bir şey yaz

Örnek çizimimiz, seri port üzerinden gelen herhangi bir baytı alıp EEPROM'a yazarak, belleğe kaç bayt yazdığımızı takip edecek.

EEPROM'a bir bayt bellek yazmak genellikle üç adımda gerçekleşir:

  1. Yazmak istediğiniz hafıza adresinin En Önemli Baytını gönderin.
  2. Yazmak istediğiniz hafıza adresinin En Az Önemli Baytını gönderin.
  3. Bu konumda saklamak istediğiniz veri baytını gönderin.

Muhtemelen açıklayan birkaç anahtar kelime vardır:

Bellek Adresleri

Bir 512 Kbit EEPROM'daki tüm baytların 0'dan 64000'e kadar bir satırda durduğunu hayal ederseniz - çünkü bir bayta 8 bit vardır ve bu nedenle 512 Kbit EEPROM'a 64000 bayt sığdırabilirsiniz - o zaman bir bellek adresi şuradaki yerdir. belirli bir baytı bulacağınız satır. Bu adresi EEPROM'a göndermemiz gerekiyor, böylece gönderdiğimiz baytı nereye koyacağını bilsin.

En Önemli ve En Az Önemli Baytlar

256 Kbit'lik bir EEPROM'da 32000 olası yer olduğundan ve 255 bir baytta kodlayabileceğiniz en büyük sayı olduğundan, bu adresi iki bayt olarak göndermemiz gerekiyor. İlk olarak, En Önemli Bayt'ı (MSB) gönderiyoruz - bu durumda ilk 8 bit. Ardından Least Significant Byte (LSB) - ikinci 8 biti göndeririz. Niye ya? Çünkü cihaz onları bu şekilde almayı bekliyor, hepsi bu.

Sayfa Yazma

Her seferinde bir bayt yazmak iyidir, ancak çoğu EEPROM aygıtında "sayfa yazma arabelleği" adı verilen ve tek bir bayt yazdığınız gibi aynı anda birden çok bayt yazmanıza olanak veren bir şey vardır. Örnek taslağımızda bundan faydalanacağız. EEPROM, aldığı sonraki her veri baytı ile bellek konumunu otomatik olarak artıran dahili bir sayaç kullanır. Bir hafıza adresi gönderildiğinde, onu 64 bayta kadar veri ile takip edebiliriz. EEPROM (haklı olarak) 312 adresinin ardından 10 baytlık bir adresin 312 adresinde bayt 0, 313 adresinde bayt, 314 adresinde 2 bayt vb. kaydedeceğini varsayar.

Bir Şey Oku

EEPROM'dan okumak, temelde EEPROM'a yazmakla aynı üç aşamalı süreci takip eder:

  1. Yazmak istediğiniz hafıza adresinin En Önemli Baytını gönderin.
  2. Yazmak istediğiniz bellek adresinin En Az Önemli Baytını gönderin.
  3. Bu konumdaki veri baytını isteyin.

Adım 5: Şemalar ve Kod

Şemalar ve Kod
Şemalar ve Kod

Kod:

#Dahil etmek

#define eeprom 0x50 //EEPROM'un temel adresini tanımlar

geçersiz kurulum() {

Wire.begin(); // bir Wire nesnesi yaratır

Seri.başla(9600);

imzasız int adresi = 0; //EEPROM'un ilk adresi

Serial.println("Posta kodunu 22222, bir posta kodu yazıyoruz"); for(adres = 0; adres< 5; adres++) writeEEPROM(eeprom, adres, '2'); // EEPROM'a 22222 yazar

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

boşluk döngüsü () {

/*loop() işlevinde hiçbir şey yok çünkü arduino'nun aynı şeyi tekrar tekrar EEPROM'a yazmasını istemiyoruz. Sadece bir kerelik yazma istiyoruz, bu nedenle EEPROM'larda loop() işlevinden kaçınılır.*/ }

// writeEEPROM işlevini tanımlar

void writeEEPROM(int aygıt adresi, imzasız int eadresi, bayt verisi) { Wire.beginTransmission(deviceaddress); Wire.write((int)(eaddress >> 8); //MSB Wire.write((int)(eaddress & 0xFF)); //LSB Wire.write(veri) yazar; Wire.endTransmission(); }

// readEEPROM işlevini tanımlar

bayt readEEPROM(int aygıtadresi, imzasız int eadresi) { bayt rdata = 0xFF; Wire.beginTransmission(aygıt adresi); Wire.write((int)(eaddress >> 8); //MSB Wire.write((int)(eaddress & 0xFF)); //LSB Wire.endTransmission()'ı yazar; Wire.requestFrom(aygıtadresi, 1); if (Wire.available()) rdata = Wire.read(); rdata'yı döndür; }

Önerilen: