Πίνακας περιεχομένων:

Ανάγνωση και εγγραφή δεδομένων σε εξωτερικό EEPROM χρησιμοποιώντας Arduino: 5 βήματα
Ανάγνωση και εγγραφή δεδομένων σε εξωτερικό EEPROM χρησιμοποιώντας Arduino: 5 βήματα

Βίντεο: Ανάγνωση και εγγραφή δεδομένων σε εξωτερικό EEPROM χρησιμοποιώντας Arduino: 5 βήματα

Βίντεο: Ανάγνωση και εγγραφή δεδομένων σε εξωτερικό EEPROM χρησιμοποιώντας Arduino: 5 βήματα
Βίντεο: Embedded Systems 5a 2024, Ιούλιος
Anonim
Ανάγνωση και εγγραφή δεδομένων σε εξωτερικό EEPROM χρησιμοποιώντας Arduino
Ανάγνωση και εγγραφή δεδομένων σε εξωτερικό EEPROM χρησιμοποιώντας Arduino

Το EEPROM σημαίνει Electrically Erasable Programmable Read-Only Memory.

Το EEPROM είναι πολύ σημαντικό και χρήσιμο επειδή είναι μια μη πτητική μορφή μνήμης. Αυτό σημαίνει ότι ακόμη και όταν η πλακέτα είναι απενεργοποιημένη, το τσιπ EEPROM εξακολουθεί να διατηρεί το πρόγραμμα που γράφτηκε σε αυτό. Έτσι, όταν απενεργοποιήσετε τον πίνακα και, στη συνέχεια, τον ενεργοποιήσετε ξανά, το πρόγραμμα που γράφτηκε στο EEPROM μπορεί να εκτελεστεί. Ουσιαστικά, η EEPROM αποθηκεύει και τρέχει ένα πρόγραμμα, ό, τι κι αν γίνει. Αυτό σημαίνει ότι μπορείτε να απενεργοποιήσετε μια συσκευή, να την απενεργοποιήσετε για 3 ημέρες και να επιστρέψετε και να την ενεργοποιήσετε και να συνεχίσει να εκτελεί το πρόγραμμα που είχε προγραμματιστεί σε αυτήν. Έτσι λειτουργούν οι περισσότερες καταναλωτικές ηλεκτρονικές συσκευές.

Το έργο αυτό χρηματοδοτείται από την LCSC. Χρησιμοποιώ ηλεκτρονικά εξαρτήματα από το LCSC.com. Η LCSC δεσμεύεται να προσφέρει μια μεγάλη ποικιλία γνήσιων, υψηλής ποιότητας ηλεκτρονικών εξαρτημάτων στην καλύτερη τιμή με ένα παγκόσμιο δίκτυο αποστολής σε περισσότερες από 200 χώρες. Εγγραφείτε σήμερα και κερδίστε 8 $ στην πρώτη σας παραγγελία.

Το EEPROM είναι επίσης πολύ αποτελεσματικό στο ότι μεμονωμένα byte σε ένα παραδοσιακό EEPROM μπορούν να διαβαστούν, να διαγραφούν και να ξαναγραφούν ανεξάρτητα. Στα περισσότερα άλλα είδη μη πτητικής μνήμης, αυτό δεν μπορεί να γίνει. Οι σειριακές συσκευές EEPROM όπως το Microchip 24-series EEPROM σας επιτρέπουν να προσθέσετε περισσότερη μνήμη σε οποιαδήποτε συσκευή μπορεί να μιλήσει I²C.

Προμήθειες

  1. EEPROM - 24LC512
  2. ATmega328P-PU
  3. Κρυστάλλος 16 MHz
  4. Breadboard
  5. Αντίσταση 4,7k Ohm x 2
  6. Πυκνωτής 22 pF x 2

Βήμα 1: Βασικά στοιχεία EEPROM

Βασικά στοιχεία EEPROM
Βασικά στοιχεία EEPROM

Το τσιπ Microchip 24LC2512 μπορεί να αγοραστεί σε συσκευασία DIP 8 ακίδων. Οι ακίδες στο 24LC512 είναι αρκετά απλές και αποτελούνται από ισχύ (8), GND (4), προστασία εγγραφής (7), SCL/SDA (6, 5) και τρεις ακίδες διευθύνσεων (1, 2, 3).

Μια σύντομη ιστορία της ROM

Οι πρώιμοι υπολογιστές τύπου "Αποθηκευμένο πρόγραμμα" - όπως υπολογιστές γραφείου και διερμηνείς πληκτρολογίου - άρχισαν να χρησιμοποιούν ROM με τη μορφή Diode Matrix ROM. Αυτή ήταν μια μνήμη που αποτελείται από διακριτές διόδους ημιαγωγών τοποθετημένες σε ένα ειδικά οργανωμένο PCB. Αυτό έδωσε τη θέση του στη Mask ROM με την εμφάνιση ολοκληρωμένων κυκλωμάτων. Το Mask ROM έμοιαζε πολύ με το Diode Matrix ROM, μόνο που εφαρμόστηκε σε πολύ μικρότερη κλίμακα. Αυτό σήμαινε, ωστόσο, ότι δεν μπορούσατε απλά να μετακινήσετε μερικές διόδους με ένα συγκολλητικό σίδερο και να το επαναπρογραμματίσετε. Η μάσκα ROM έπρεπε να προγραμματιστεί από τον κατασκευαστή και στη συνέχεια δεν μπορούσε να αλλάξει.

Δυστυχώς, το Mask ROM ήταν ακριβό και χρειάστηκε πολύς χρόνος για να παραχθεί επειδή κάθε νέο πρόγραμμα απαιτούσε μια ολοκαίνουργια συσκευή για να κατασκευαστεί από ένα χυτήριο. Το 1956, ωστόσο, αυτό το πρόβλημα λύθηκε με την εφεύρεση του PROM (προγραμματιζόμενη ROM) που επέτρεψε στους προγραμματιστές να προγραμματίσουν οι ίδιοι τα τσιπ. Αυτό σήμαινε ότι οι κατασκευαστές θα μπορούσαν να παράγουν εκατομμύρια από την ίδια μη προγραμματισμένη συσκευή, πράγμα που την έκανε φθηνότερη και πιο πρακτική. Ωστόσο, το PROM θα μπορούσε να γραφτεί μόνο μία φορά χρησιμοποιώντας συσκευή προγραμματισμού υψηλής τάσης. Μετά τον προγραμματισμό μιας συσκευής PROM, δεν υπήρχε τρόπος επιστροφής της συσκευής στην μη προγραμματισμένη κατάσταση.

Αυτό άλλαξε το 1971 με την εφεύρεση του EPROM (Erasable Programmable ROM) το οποίο - εκτός από την προσθήκη ενός άλλου γράμματος στο ακρωνύμιο - έφερε μαζί του τη δυνατότητα να σβήσει τη συσκευή και να την επαναφέρει σε "κενή" κατάσταση χρησιμοποιώντας ισχυρή πηγή υπεριώδους φωτός. Σωστά, έπρεπε να ρίξετε ένα έντονο φως στο IC για να το επαναπρογραμματίσετε, πόσο ωραίο είναι αυτό; Λοιπόν, αποδεικνύεται ότι είναι πολύ καλό, εκτός εάν είστε προγραμματιστής που εργάζεται σε υλικολογισμικό, οπότε θα θέλατε πραγματικά να μπορείτε να επαναπρογραμματίσετε τη συσκευή χρησιμοποιώντας ηλεκτρικά σήματα. Αυτό έγινε τελικά πραγματικότητα το 1983 με την ανάπτυξη του EEPROM (Electrically Erasable Programmable ROM) και με αυτό, φτάνουμε στο σημερινό δυσκίνητο αρκτικόλεξο.

Βήμα 2: Παραξενιές του EEPROM

Υπάρχουν δύο σημαντικά μειονεκτήματα στο EEPROM ως μέθοδος αποθήκευσης δεδομένων. Στις περισσότερες εφαρμογές, τα πλεονεκτήματα υπερτερούν των μειονεκτημάτων, αλλά θα πρέπει να τα γνωρίζετε πριν ενσωματώσετε το EEPROM στο επόμενο σχέδιο σας.

Πρώτα απ 'όλα, η τεχνολογία που κάνει το EEPROM να λειτουργεί επίσης περιορίζει τον αριθμό των φορών που μπορεί να ξαναγραφεί. Αυτό έχει να κάνει με τα ηλεκτρόνια να παγιδεύονται στα τρανζίστορ που αποτελούν τη ROM και να συσσωρεύονται έως ότου η διαφορά φόρτισης μεταξύ ενός "1" και ενός "0" δεν είναι αναγνωρίσιμη. Αλλά μην ανησυχείτε, τα περισσότερα EEPROM έχουν μέγιστο αριθμό επανεγγραφής 1 εκατομμύριο ή περισσότερο. Εφόσον δεν γράφετε συνεχώς στην EEPROM, είναι απίθανο να πετύχετε αυτό το μέγιστο. Δεύτερον, το EEPROM δεν θα διαγραφεί εάν αφαιρέσετε την τροφοδοσία από αυτό, αλλά δεν θα διατηρήσει τα δεδομένα σας επ 'αόριστον. Τα ηλεκτρόνια μπορούν να απομακρυνθούν από τα τρανζίστορ και μέσω του μονωτή, διαγράφοντας αποτελεσματικά το EEPROM με την πάροδο του χρόνου. Τούτου λεχθέντος, αυτό συμβαίνει συνήθως με την πάροδο των ετών (αν και μπορεί να επιταχυνθεί από τη θερμότητα). Οι περισσότεροι κατασκευαστές λένε ότι τα δεδομένα σας είναι ασφαλή στο EEPROM για 10 χρόνια ή περισσότερο σε θερμοκρασία δωματίου. Και υπάρχει ένα ακόμη πράγμα που πρέπει να έχετε κατά νου όταν επιλέγετε μια συσκευή EEPROM για το έργο σας. Η χωρητικότητα EEPROM μετριέται σε bits και όχι bytes. Ένα 512K EEPROM θα χωρέσει 512Kbits δεδομένων, με άλλα λόγια, μόλις 64KB.

Βήμα 3: Σύνδεση υλικού Arduino

Σύνδεση υλικού Arduino
Σύνδεση υλικού Arduino
Σύνδεση υλικού Arduino
Σύνδεση υλικού Arduino

Εντάξει, τώρα που γνωρίζουμε τι είναι το EEPROM, ας συνδέσουμε ένα και να δούμε τι μπορεί να κάνει! Για να μιλήσουμε τη συσκευή μας, θα χρειαστεί να συνδέσουμε τροφοδοσία καθώς και σειριακές γραμμές I²C. Αυτή η συσκευή, συγκεκριμένα, λειτουργεί σε 5VDC, οπότε θα τη συνδέσουμε στην έξοδο 5V του Arduino UNO. Επίσης, οι γραμμές I²C θα χρειάζονται αντιστάσεις έλξης για να πραγματοποιηθεί σωστά η επικοινωνία. Η τιμή αυτών των αντιστάσεων εξαρτάται από τη χωρητικότητα των γραμμών και τη συχνότητα που θέλετε να την επικοινωνήσετε, αλλά ένας καλός βασικός κανόνας για μη κρίσιμες εφαρμογές είναι να τη διατηρήσετε στην περιοχή kΩ. Σε αυτό το παράδειγμα, θα χρησιμοποιήσουμε αντιστάσεις έλξης 4.7kΩ.

Υπάρχουν τρεις ακίδες σε αυτήν τη συσκευή για να επιλέξετε τη διεύθυνση I²C. Με αυτόν τον τρόπο μπορείτε να έχετε περισσότερες από μία EEPROM στο δίαυλο και να τις διευκρινίζετε με διαφορετικό τρόπο. Θα μπορούσατε απλώς να τα γειώσετε όλα, αλλά θα τα συνδέσουμε με καλώδια ώστε να μπορέσουμε να ρίξουμε μια συσκευή υψηλότερης χωρητικότητας αργότερα στο σεμινάριο.

Θα χρησιμοποιήσουμε ένα breadboard για να τα συνδέσουμε όλα μαζί. Το παρακάτω διάγραμμα δείχνει τη σωστή σύνδεση για τις περισσότερες συσκευές IEP EEPROM, συμπεριλαμβανομένου του EEPROM της σειράς Microchip 24 σειρών που πουλάμε.

Βήμα 4: Ανάγνωση και γραφή

Τις περισσότερες φορές όταν χρησιμοποιείτε ένα EEPROM σε συνδυασμό με έναν μικροελεγκτή, δεν θα χρειαστεί να δείτε όλα τα περιεχόμενα της μνήμης ταυτόχρονα. Απλώς θα διαβάζετε και θα γράφετε byte εδώ και εκεί όπως απαιτείται. Σε αυτό το παράδειγμα, ωστόσο, πρόκειται να γράψουμε ένα ολόκληρο αρχείο στην EEPROM και στη συνέχεια να το διαβάσουμε ξανά, ώστε να μπορούμε να το δούμε στον υπολογιστή μας. Αυτό θα μας κάνει να νιώσουμε άνετα με την ιδέα της χρήσης του EEPROM και επίσης να μας δώσει μια αίσθηση για το πόσα δεδομένα μπορούν πραγματικά να χωρέσουν σε μια μικρή συσκευή.

Γράψε κάτι

Το παράδειγμά μας σκίτσο θα λάβει απλά οποιοδήποτε byte που έρχεται πάνω από τη σειριακή θύρα και το γράφει στην EEPROM, παρακολουθώντας στην πορεία πόσα bytes έχουμε γράψει στη μνήμη.

Η εγγραφή ενός byte μνήμης στο EEPROM συμβαίνει γενικά σε τρία βήματα:

  1. Στείλτε το πιο σημαντικό Byte της διεύθυνσης μνήμης στην οποία θέλετε να γράψετε.
  2. Στείλτε το ελάχιστο σημαντικό Byte της διεύθυνσης μνήμης στην οποία θέλετε να γράψετε.
  3. Στείλτε το byte δεδομένων που θέλετε να αποθηκεύσετε σε αυτήν την τοποθεσία.

Υπάρχουν πιθανώς μερικές λέξεις -κλειδιά που εξηγούν:

Διευθύνσεις μνήμης

Εάν φανταστείτε όλα τα byte σε ένα EEPROM 512 Kbit που στέκονται σε μια γραμμή από 0 έως 64000 - επειδή υπάρχουν 8 bits σε ένα byte και επομένως μπορείτε να χωρέσετε 64000 byte σε ένα EEPROM 512 Kbit - τότε μια διεύθυνση μνήμης είναι η θέση γραμμή όπου θα βρείτε ένα συγκεκριμένο byte. Πρέπει να στείλουμε αυτήν τη διεύθυνση στην EEPROM, ώστε να ξέρει πού να βάλει το byte που στέλνουμε.

Τα πιο σημαντικά και τα λιγότερο σημαντικά Bytes

Επειδή υπάρχουν 32000 πιθανές θέσεις σε ένα EEPROM 256 Kbit - και επειδή το 255 είναι ο μεγαλύτερος αριθμός που μπορείτε να κωδικοποιήσετε σε ένα byte - πρέπει να στείλουμε αυτήν τη διεύθυνση σε δύο byte. Αρχικά, στέλνουμε το πιο σημαντικό Byte (MSB) - τα πρώτα 8 bit σε αυτήν την περίπτωση. Στη συνέχεια, στέλνουμε το Least Significant Byte (LSB) - το δεύτερο 8 bit. Γιατί; Επειδή έτσι περιμένει η συσκευή να τα λάβει, αυτό είναι όλο.

Σύνταξη σελίδας

Η εγγραφή ενός byte κάθε φορά είναι καλή, αλλά οι περισσότερες συσκευές EEPROM έχουν κάτι που ονομάζεται "buffer εγγραφής σελίδας", το οποίο σας επιτρέπει να γράφετε πολλαπλά byte ταυτόχρονα με τον ίδιο τρόπο όπως θα κάνατε ένα byte. Θα το εκμεταλλευτούμε στο σκίτσο του παραδείγματος μας. Το EEPROM χρησιμοποιεί έναν εσωτερικό μετρητή που αυξάνει αυτόματα τη θέση της μνήμης με κάθε ακόλουθο byte δεδομένων που λαμβάνει. Μόλις αποσταλεί μια διεύθυνση μνήμης, μπορούμε να την ακολουθήσουμε με έως και 64 byte δεδομένων. Η EEPROM υποθέτει (σωστά) ότι μια διεύθυνση 312 ακολουθούμενη από 10 byte θα καταγράψει το byte 0 στη διεύθυνση 312, το byte 1 στη διεύθυνση 313, το byte 2 στη διεύθυνση 314 κ.ο.κ.

Διαβάστε κάτι

Η ανάγνωση από το EEPROM ακολουθεί βασικά την ίδια διαδικασία τριών βημάτων με την εγγραφή στην EEPROM:

  1. Στείλτε το πιο σημαντικό Byte της διεύθυνσης μνήμης στην οποία θέλετε να γράψετε.
  2. Στείλτε το ελάχιστο σημαντικό Byte της διεύθυνσης μνήμης στην οποία θέλετε να γράψετε.
  3. Ζητήστε το byte δεδομένων σε αυτήν τη θέση.

Βήμα 5: Διαγράμματα και κώδικας

Σχήματα και κώδικας
Σχήματα και κώδικας

Κώδικας:

#περιλαμβάνω

#define eeprom 0x50 // καθορίζει τη βασική διεύθυνση του EEPROM

void setup () {

Wire.begin (); // δημιουργεί ένα αντικείμενο Wire

Serial.begin (9600);

ανυπόγραφο int διεύθυνση = 0; // πρώτη διεύθυνση της EEPROM

Serial.println ("Γράφουμε τον ταχυδρομικό κώδικα 22222, έναν ταχυδρομικό κώδικα"); για (διεύθυνση = 0; διεύθυνση <5; διεύθυνση ++) writeEEPROM (eeprom, διεύθυνση, '2'); // Γράφει 22222 στην EEPROM

για (διεύθυνση = 0; διεύθυνση <5; διεύθυνση ++) {Serial.print (readEEPROM (eeprom, διεύθυνση), HEX); }}

void loop () {

/*δεν υπάρχει τίποτα στη λειτουργία βρόχου () επειδή δεν θέλουμε το arduino να γράφει επανειλημμένα το ίδιο πράγμα στο EEPROM ξανά και ξανά. Θέλουμε απλώς μια εφάπαξ εγγραφή, οπότε η λειτουργία βρόχου () αποφεύγεται με EEPROM.*/}

// ορίζει τη συνάρτηση writeEEPROM

void writeEEPROM (int deviceaddress, unsigned int eeaddress, byte data) {Wire.beginTransmission (deviceaddress); Wire.write ((int) (eeaddress >> 8)); // γράφει το MSB Wire.write ((int) (eeaddress & 0xFF)); // γράφει το LSB Wire.write (δεδομένα). Wire.endTransmission (); }

// ορίζει τη συνάρτηση readEEPROM

byte readEEPROM (int deviceaddress, unsigned int eeaddress) {byte rdata = 0xFF; Wire.beginTransmission (deviceaddress); Wire.write ((int) (eeaddress >> 8)); // γράφει το MSB Wire.write ((int) (eeaddress & 0xFF)); // γράφει το LSB Wire.endTransmission (); Wire.requestFrom (deviceaddress, 1)? if (Wire.available ()) rdata = Wire.read (); επιστροφή δεδομένων? }

Συνιστάται: