Τι είναι ένα τσιπ μνήμης και πώς να προγραμματίσετε μικροκυκλώματα. Πώς να καθαρίσετε το EEPROM (Μη πτητική μνήμη) χρησιμοποιώντας τη μνήμη eeprom

Την τελευταία φορά, όταν έγραψα τη "λεπτομερή απάντηση στην ερώτηση" σχετικά με τον τρόπο δημιουργίας αντιγράφων ασφαλείας του υλικολογισμικού από το Mega, με επέπληξαν που δεν ανέφερα το αντίγραφο ασφαλείας EEPROM. Εκείνη τη φορά δεν το έκανα συνειδητά, γιατί… Δικαίως έκρινα ότι δεν υπάρχει λόγος να περιπλέκονται τα πάντα στο στάδιο της αρχικής «προσέγγισης στο βλήμα». Το γεγονός είναι ότι δεν είναι προφανές σε όλους ότι το EEPROM δεν αναβοσβήνει κατά τη μεταγλώττιση και τη μεταφόρτωση του υλικολογισμικού από Arduino IDE. Δηλαδή, αυτό σημαίνει ότι δεν μεταφορτώνεται απολύτως τίποτα στην EEPROM όταν το υλικολογισμικό ανεβαίνει από το IDE. Και οι χειρισμοί με το EEPROM (αν η χρήση του είναι ενεργοποιημένη καθόλου στο υλικολογισμικό) εκτελούνται σε εντελώς διαφορετικό επίπεδο. Και επομένως, για δημιουργία αντιγράφων ασφαλείας γυμνού υλικολογισμικού χωρίς λεπτές ρυθμίσεις, το οποίο ΠΙΘΑΝΟΝ (μόνο ίσως) μπορεί να αποθηκευτεί στο EEPROM, ήταν αρκετά για να σωθεί μόνο το γυμνό υλικολογισμικό. Αλλά αφού έχει προκύψει το ερώτημα, γιατί να μην το «μασάτε». Ας το περάσουμε με τη σειρά. Τι είναι το EEPROM και γιατί μιλάμε για αυτό;
EEPROM - (Electrically Erasable Programmable Read-Only Memory) περιοχή της μη πτητικής μνήμης του μικροελεγκτή στην οποία μπορούν να εγγραφούν και να διαβαστούν οι πληροφορίες. Συχνά χρησιμοποιείται για την αποθήκευση ρυθμίσεων προγράμματος που ενδέχεται να αλλάξουν κατά τη λειτουργία και πρέπει να αποθηκευτούν όταν είναι απενεργοποιημένη η τροφοδοσία.

Πώς χρησιμοποιεί ένας τρισδιάστατος εκτυπωτής το EEPROM;
Ας δούμε το Marlin ως παράδειγμα. Στο Marlin Firmware out of the box, το EEPROM δεν χρησιμοποιείται. Οι παράμετροι του διαμορφωτή (Configuration.h), που περιλαμβάνουν τη δυνατότητα χρήσης του, σχολιάζονται από προεπιλογή.

#define EEPROM_SETTINGS
#define EEPROM_CHITCHAT

Εάν η χρήση του EEPROM είναι ενεργοποιημένη, ο εκτυπωτής μπορεί να αποθηκεύσει και να χρησιμοποιήσει τις ακόλουθες ρυθμίσεις (καθορίζονται από την αστική τάξη):

  • Αριθμός βημάτων ανά χιλιοστό
  • Μέγιστη/ελάχιστη ταχύτητα τροφοδοσίας [mm/s]
  • Μέγιστη επιτάχυνση [mm/s^2]
  • Επιτάχυνση
  • Επιτάχυνση κατά την ανάσυρση
  • Ρυθμίσεις PID
  • Μετατόπιση θέσης έδρας
  • Ελάχιστη ταχύτητα τροφοδοσίας κατά την κίνηση [mm/s]
  • Ελάχιστος χρόνος ενότητας [ms]
  • Άλμα μέγιστης ταχύτητας άξονες Χ-Υ[mm/s]
  • Άλμα μέγιστης ταχύτητας στον άξονα Z [mm/s]
Μπορείτε να επεξεργαστείτε αυτές τις ρυθμίσεις χρησιμοποιώντας την οθόνη και τα στοιχεία ελέγχου του εκτυπωτή. Όταν η χρήση του EEPROM είναι ενεργοποιημένη, το μενού πρέπει να εμφανίζει τα ακόλουθα στοιχεία:
  • Αποθήκευση μνήμης
  • Φόρτωση μνήμης
  • Επαναφορά Failsafe
Μπορείτε επίσης να χρησιμοποιήσετε το GCode για να εργαστείτε απευθείας (μέσω Pronterface).
  • M500 Αποθηκεύει τις τρέχουσες ρυθμίσεις στο EEPROM μέχρι την επόμενη εκκίνηση ή εντολή M501.
  • M501 Διαβάζει ρυθμίσεις από την EEPROM.
  • M502 Επαναφέρει τις ρυθμίσεις στις προεπιλεγμένες τιμές που καθορίζονται στο Configurations.h. Εάν εκτελέσετε το M500 μετά από αυτό, οι προεπιλεγμένες τιμές θα εισαχθούν στο EEPROM.
  • M503 Εμφανίζει τις τρέχουσες ρυθμίσεις - ""Αυτές που έχουν εγγραφεί στο EEPROM.""
Μπορείτε να διαβάσετε για το EEPROM στο υλικολογισμικό Repitier.

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

avrdude.exe -p atmega2560 -c καλωδίωση -PCOM5 -b115200 -Ueeprom:r:"printer_eeprom".eep:i

Αυτή η εντολή διαβάζει τα δεδομένα EEPROM στο αρχείο "printer_eeprom.eep". Εάν είναι επιτυχής, θα δείτε κάτι σαν το παρακάτω στην οθόνη.

Η εγγραφή επίσης δεν είναι περίπλοκη και εκτελείται με παρόμοια εντολή, η οποία διαφέρει μόνο σε αυτό στο κλειδί -UΔεν είναι "r", αλλά "w".

avrdude.exe -p atmega2560 -c καλωδίωση -PCOM5 -b115200 -Ueeprom:w:"printer_eeprom".eep:i

Εάν είναι επιτυχής, θα δείτε κάτι σαν το ακόλουθο μήνυμα στην οθόνη.

Πώς και γιατί να διαγράψετε το EEPROM;
Αρχικά, "γιατί να το κάνεις αυτό;" Πρέπει να διαγράψετε το EEPROM εάν το χρησιμοποιούσε και το προηγούμενο υλικολογισμικό και μπορεί να μείνουν σκουπίδια στη μνήμη. Κάπου έχω ήδη συναντήσει ανθρώπους με προβλήματα που μετά την εναλλαγή από το ένα υλικολογισμικό στο άλλο (από το Marlin στο Repitier EMNIP), ο εκτυπωτής τους άρχισε να συμπεριφέρεται, θα λέγαμε, «δημιουργικά». Αυτό οφείλεται στο γεγονός ότι διαφορετικά υλικολογισμικά αποθηκεύουν τα δεδομένα τους κάτω από διαφορετικές διευθύνσεις. Και όταν προσπαθείτε να διαβάσετε δεδομένα από λάθος διεύθυνση, αρχίζει η πανδαισία.
Μπορείτε να διαγράψετε το EEPROM μόνο μέσω προγραμματισμού από το υλικολογισμικό, αλλά για να το κάνετε αυτό θα πρέπει να ανεβάσετε προσωρινά ένα ειδικό σκίτσο στον ελεγκτή. Μπορείτε να διαβάσετε περισσότερα σχετικά με αυτό στην επίσημη τεκμηρίωση του Arduino.
Εάν το EEPROM διαγραφεί όχι μέσα Πλακέτα Arduino, και σε κάποιο αφηρημένο ελεγκτή, ο κώδικας σκίτσου θα πρέπει να αλλάξει λαμβάνοντας υπόψη το μέγεθος του EEPROM σε έναν συγκεκριμένο ελεγκτή στον πίνακα. Για να το κάνετε αυτό, θα χρειαστεί να αλλάξετε τη συνθήκη λήξης στον βρόχο "For". Για παράδειγμα, για το ATmega328, το οποίο έχει μνήμη EEPROM 1 kb, ο κύκλος θα μοιάζει με αυτό:
Συμπέρασμα.
Τρελαίνομαι εδώ και αρκετό καιρό, αλλά για ποιο λόγο όλα αυτά; Για να καταλήξουμε στο συμπέρασμα ότι κατά τη δημιουργία αντιγράφων ασφαλείας του υλικολογισμικού, το EEPROM μπορεί επίσης να αποθηκευτεί, αλλά μόνο εάν χρειάζεστε τις ρυθμίσεις που είναι αποθηκευμένες σε αυτό. Αν είσαι έτοιμος να τα θυσιάσεις, τότε ξέχασέ το. Επίσης, εάν αλλάξετε ένα υλικολογισμικό σε άλλο ή αλλάξετε από μια έκδοση σε άλλη, μην τεμπελιάζετε να διαγράψετε το EEPROM πριν το ανεβάσετε νέο υλικολογισμικό. Λοιπόν, ταυτόχρονα μάθαμε πολλά νέα πράγματα.

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

Το κύριο πράγμα που πρέπει να γνωρίζουμε είναι ότι Μνήμη EEPROMΕίναι καλύτερα να το θεωρήσετε όχι ως "απλά μνήμη", αλλά ως ξεχωριστή εσωτερική συσκευή στο τσιπ.
EEPROM χωριστό χώρο διευθύνσεων, που δεν έχει καμία σχέση με το χώρο διευθύνσεων του επεξεργαστή (FLASH και SRAM). Για να αποκτήσετε πρόσβαση σε δεδομένα σε μια συγκεκριμένη διεύθυνση στη μη πτητική μνήμη, πρέπει να εκτελέσετε μια ορισμένη σειράενέργειες που χρησιμοποιούν έναν αριθμό μητρώων (μητρώα διευθύνσεων EEARH και EEARL, μητρώο δεδομένων EEDR και μητρώο ελέγχου EECR).
Σύμφωνα με το φύλλο δεδομένων, για να γράψετε ένα byte σε μια συγκεκριμένη διεύθυνση στο EEPROM, πρέπει να κάνετε τα εξής:

  1. περιμένετε να είναι έτοιμη η EEPROM για εγγραφή δεδομένων (το bit EEPE του καταχωρητή EECR επαναφέρεται).
  2. περιμένετε να τελειώσει η εγγραφή στη μνήμη FLASH (επαναφορά του bit SELFPRGEN του καταχωρητή SPMCSR) - αυτό πρέπει να γίνει εάν ο φορτωτής εκκίνησης υπάρχει στο πρόγραμμα.
  3. σημειωσε νέα διεύθυνσηστο μητρώο EEAR (εάν είναι απαραίτητο)·
  4. γράψτε ένα byte δεδομένων στο μητρώο EEDR (εάν είναι απαραίτητο).
  5. ορίστε το bit EEMPE του καταχωρητή EECR σε ένα.
  6. εντός τεσσάρων κύκλων ρολογιού μετά τη ρύθμιση της σημαίας EEMPE, γράφουμε μια λογική στο bit EEPE του καταχωρητή EECR.

Στη συνέχεια, ο επεξεργαστής παρακάμπτει 2 κύκλους ρολογιού πριν εκτελέσει την επόμενη εντολή.
Το δεύτερο σημείο πρέπει να εκτελεστεί εάν υπάρχει ένας bootloader στο πρόγραμμα - το γεγονός είναι ότι η εγγραφή σε EEPROM δεν μπορεί να εκτελεστεί ταυτόχρονα με την εγγραφή στη μνήμη FLASH, επομένως πριν γράψετε στη EEPROM πρέπει να βεβαιωθείτε ότι ο προγραμματισμός της μνήμης FLASH έχει ολοκληρωθεί. εάν ο μικροελεγκτής δεν διαθέτει bootloader, τότε δεν αλλάζει ποτέ τα περιεχόμενα της μνήμης FLASH (θυμηθείτε ότι το avr έχει αρχιτεκτονική Harvard: η μνήμη προγράμματος (FLASH) και η μνήμη δεδομένων (SRAM) διαχωρίζονται).
Η διάρκεια του κύκλου εγγραφής εξαρτάται από τη συχνότητα του εσωτερικού ταλαντωτή RC του τσιπ, την τάση τροφοδοσίας και τη θερμοκρασία. συνήθως για τα μοντέλα ATmega48x/88x/168x αυτό είναι 3,4 ms (!), για ορισμένα παλαιότερα μοντέλα – 8,5 ms (!!!).
Επιπλέον, κατά την εγγραφή στην EEPROM, ενδέχεται να προκύψουν προβλήματα με τις διακοπές κλήσεων κατά την εκτέλεση της ακολουθίας των παραπάνω ενεργειών - επομένως είναι καλύτερο να απενεργοποιήσετε τις διακοπές κατά την εγγραφή στην EEPROM.
Η ανάγνωση της μη πτητικής μνήμης είναι λίγο πιο απλή:

  1. περιμένετε να είναι έτοιμο το EEPROM για ανάγνωση δεδομένων (το bit EEWE του καταχωρητή EECR επαναφέρεται).
  2. γράψτε τη διεύθυνση στο μητρώο EEAR.
  3. ορίστε το bit EERE του καταχωρητή EECR σε ένα.
  4. διαβάζουμε δεδομένα από το μητρώο EEDR (στην πραγματικότητα, όταν τα ζητούμενα δεδομένα μετακινούνται στο μητρώο δεδομένων, συμβαίνει σκληρή επαναφορά bit EERE? αλλά δεν υπάρχει ανάγκη παρακολούθησης της κατάστασης αυτού του bit, καθώς η λειτουργία ανάγνωσης από το EEPROM εκτελείται πάντα σε έναν κύκλο ρολογιού).

Αφού ρυθμίσει ένα bit στο EERE σε ένα, ο επεξεργαστής παραλείπει 4 κύκλους ρολογιού πριν εκτελέσει την επόμενη εντολή.
Όπως βλέπουμε, δουλεύοντας με μη-πτητική μνήμη– η διαδικασία είναι χρονοβόρα· Εάν γράφουμε και διαβάζουμε συχνά δεδομένα από το EEPROM, το πρόγραμμα μπορεί να αρχίσει να επιβραδύνεται.

Ωστόσο, γράφουμε ένα πρόγραμμα στο περιβάλλον IAR και είμαστε τυχεροί: όλη η εργασία με την ανάγνωση και τη γραφή από το EEPROM θα γίνει από το περιβάλλον ανάπτυξης - το iar έχει τον τροποποιητή «__eeprom», ο οποίος δημιουργεί μεταβλητές στη μη πτητική μνήμη - και τότε θα χρειαστεί απλώς να διαβάσουμε από "μόνιμες" μεταβλητές σε "current" (κατά την προετοιμασία του ελεγκτή), ή να γράψουμε από "τρέχουσες" μεταβλητές σε "σταθερά" - δηλαδή, όταν αλλάξει η τρέχουσα τιμή, η τιμή του Η μεταβλητή στη μη πτητική μνήμη πρέπει επίσης να αλλάξει.
Οι νέες μεταβλητές θα μοιάζουν με αυτό:

Eeprom uint16_t EEP_MinTemperature;

Μερικές γενικές λέξεις: και παρόλο που δεν υποθέτουμε δείκτες στις μεταβλητές eeprom, πρέπει να θυμόμαστε ότι το eeprom είναι ένας ξεχωριστός χώρος διευθύνσεων και για να δημιουργήσουμε έναν δείκτη στο eeprom (και ο μεταγλωττιστής μας επιτρέπει να το κάνουμε αυτό), πρέπει να υποδεικνύει ότι πρόκειται για δείκτη σε μια διεύθυνση στο eeprom:

Uint16_t __eeprom *EEP_MinTemperatureAdr;

Ας επιστρέψουμε στον ελεγκτή σόμπας και στην EEPROM. Στην περίπτωσή μας, δεν υπάρχει EEPROM εικονική μηχανή, φυσικά, δεν αναμένεται? Επιπλέον, αξίζει να εξεταστεί εάν χρειάζεται μια ξεχωριστή βιβλιοθήκη για να λειτουργήσει με μη πτητική μνήμη - είναι πολύ «διασπαρμένες» σε όλο το πρόγραμμα εγγραφής σημαντικές ρυθμίσεις; Εάν προσπαθήσετε να δημιουργήσετε μια ξεχωριστή βιβλιοθήκη, θα πρέπει να κάνετε παραπομπές: στη βιβλιοθήκη για το EEPROM, συνδέστε τις βιβλιοθήκες του ADC, το στοιχείο θέρμανσης και τις καθολικές ρυθμίσεις. και σε αυτές τις περιφερειακές βιβλιοθήκες, η σύνδεση της βιβλιοθήκης EEPROM δεν είναι πολύ καλή προσέγγιση.
Μια άλλη επιλογή είναι να προσθέσετε μια μεταβλητή eeprom σε κάθε βιβλιοθήκη όπου πρέπει να αποθηκεύσετε τις ρυθμίσεις και να αποθηκεύσετε τις αντίστοιχες ρυθμίσεις απευθείας στο εικονικές μηχανές. Θα εφαρμόσουμε αυτήν την επιλογή.
Αρχικά, ας παραθέσουμε ποιες μεταβλητές πρέπει να αποθηκεύσουμε στο EEPROM:

  1. σημεία βαθμονόμησης
  2. τιμές της μέγιστης-ελάχιστης ρυθμισμένης θερμοκρασίας και του βήματος ρύθμισης θερμοκρασίας
  3. καθορισμένη τιμή θερμοκρασίας
  4. Συντελεστές ελεγκτή PID

Δεν εξοικονομούμε την τιμή του χρονοδιακόπτη κουζίνας - θα υποθέσουμε ότι ο χρήστης πρέπει να ρυθμίζει το χρονόμετρο της εστίας κάθε φορά μετά την απενεργοποίηση του ρεύματος.
Όλες αυτές οι ρυθμίσεις ορίζονται από τον χρήστη περιστρέφοντας τον κωδικοποιητή και στη συνέχεια πατώντας στιγμιαία το κουμπί χρήστη. Ταυτόχρονα, θυμόμαστε ότι ο αριθμός των κύκλων ανάγνωσης-εγγραφής EEPROM εξακολουθεί να είναι περιορισμένος, επομένως μην αντικαταστήσετε ξανά τις ίδιες πληροφορίες (για παράδειγμα, εάν ο χρήστης επέλεξε την ίδια τιμή κάποιας ρύθμισης όπως ήταν). Επομένως, πριν από κάθε αλλαγή στη μεταβλητή __eeprom, ελέγχουμε αν χρειάζεται να ξαναγραφεί:

//εάν η τιμή έχει αλλάξει, αντικαταστήστε την σε μη πτητική μνήμη εάν (ADCTemperature.atMinTemperatureValue != (uint16_t)VMEncoderCounter.ecntValue) (ADCTemperature.atMinTemperatureValue = (uint16_t)VMEn. atMinTemperatureV alue; )

Η ανάγνωση των ρυθμίσεων από το EEPROM είναι επίσης απλή - όταν αρχικοποιούμε τις "τρέχουσες" ρυθμίσεις, απλά διαβάζουμε την τιμή από τη μη πτητική μνήμη:

ADCTemperature.atMinTemperatureValue = EEP_MinTemperature;

Προκειμένου η συσκευή μας να έχει κάποιες ρυθμίσεις στο EEPROM από την αρχή, το έργο για την πρώτη εκκίνηση μπορεί να μεταγλωττιστεί με αρχικοποιημένες αυτές τις μεταβλητές:

Eeprom uint16_t EEP_MinTemperature = 20; ... //πίνακας για την αποθήκευση σημείων βαθμονόμησης σε μη πτητική μνήμη __eeprom TCalibrationData EEP_CalibrationData = ((20, 1300), (300, 4092));

Σε αυτήν την περίπτωση, ο μεταγλωττιστής αρχικοποιεί τις μεταβλητές __eeprom πριν ξεκινήσει την εργασία με την κύρια συνάρτηση. Για να αποκτήσετε ένα αρχείο με μη πτητική μνήμη (.eep), πρέπει να μεταβείτε στις ακόλουθες ρυθμίσεις:
Έργο->Επιλογές..->Σύνδεσμος->Επιπλέον επιλογές
Εάν το πλαίσιο ελέγχου "Χρήση επιλογών γραμμής εντολών" δεν είναι επιλεγμένο, επιλέξτε το και προσθέστε τη γραμμή
-Ointel-standard,(XDATA)=.eep
Πρώτα μεταγλωττίζουμε το έργο με αρχικοποιημένες μεταβλητές, αποθηκεύουμε το αρχείο eep ξεχωριστά. τότε αφαιρούμε την προετοιμασία κατά τη δημιουργία μεταβλητών.

Αυτό είναι όλο - η σόμπα μας είναι έτοιμη!

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

Περιγραφή της μνήμης EEPROM

Το Arduino παρέχει στους χρήστες του τρεις τύπους ενσωματωμένης μνήμης συσκευής: σταθερή RAM (μνήμη τυχαίας πρόσβασης ή SRAM - στατική μνήμη τυχαίας πρόσβασης) - απαραίτητη για την εγγραφή και την αποθήκευση δεδομένων κατά τη χρήση. κάρτες flash – για αποθήκευση ήδη εγγεγραμμένων μοτίβων. – για αποθήκευση και επακόλουθη χρήση δεδομένων.

Όλα τα δεδομένα στη μνήμη RAM διαγράφονται μόλις επανεκκινηθεί η συσκευή ή απενεργοποιηθεί η τροφοδοσία. Τα δύο δεύτερα αποθηκεύουν όλες τις πληροφορίες πριν από την αντικατάσταση και σας επιτρέπουν να τις ανακτήσετε εάν είναι απαραίτητο. Οι μονάδες flash είναι αρκετά διαδεδομένες στις μέρες μας. Αξίζει να εξετάσετε τη μνήμη EEPROM με περισσότερες λεπτομέρειες.

Η συντομογραφία σημαίνει Electrically Erasable Programmable Read-Only Memory και μεταφράζεται στα ρωσικά κυριολεκτικά σημαίνει ηλεκτρικά διαγραφόμενη προγραμματιζόμενη μνήμη μόνο για ανάγνωση. Ο κατασκευαστής εγγυάται την ασφάλεια των πληροφοριών για αρκετές δεκαετίες μετά την τελευταία διακοπή ρεύματος (συνήθως δίνεται μια περίοδος 20 ετών, ανάλογα με το ρυθμό με τον οποίο μειώνεται η φόρτιση της συσκευής).

Ωστόσο, πρέπει να γνωρίζετε ότι η δυνατότητα επανεγγραφής σε μια συσκευή είναι περιορισμένη και δεν υπερβαίνει τις 100.000 φορές. Επομένως, συνιστάται να είστε προσεκτικοί και προσεκτικοί στα δεδομένα που εισάγετε και να μην τα αντικαταστήσετε ξανά.

Η ποσότητα της μνήμης, σε σύγκριση με τα σύγχρονα μέσα, είναι πολύ μικρή και ποικίλλει για διαφορετικούς μικροελεγκτές. Για παράδειγμα, για:

  • ATmega328 – 1kB
  • ATmega168 και ATmega8 – 512 byte,
  • και ATmega1280 – 4 kB.

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

Η σύνταξη στην EEPROM απαιτεί σημαντικό χρόνο - περίπου. 3 ms. Εάν η τροφοδοσία απενεργοποιηθεί κατά την εγγραφή, τα δεδομένα δεν θα αποθηκευτούν καθόλου ή ενδέχεται να εγγραφούν λανθασμένα. Είναι πάντα απαραίτητο να ελέγχετε επιπρόσθετα τις εισαγόμενες πληροφορίες για να αποφύγετε αστοχίες κατά τη λειτουργία. Η ανάγνωση δεδομένων είναι πολύ πιο γρήγορη και ο πόρος μνήμης δεν μειώνεται.

Βιβλιοθήκη

Η εργασία με τη μνήμη EEPROM πραγματοποιείται χρησιμοποιώντας μια βιβλιοθήκη που δημιουργήθηκε ειδικά για το Arduino. Τα κυριότερα είναι η δυνατότητα εγγραφής και ανάγνωσης δεδομένων. ενεργοποιείται με εντολή #include EEPROM.h.

  • Για εγγραφές– EEPROM.write(διεύθυνση, δεδομένα);
  • Για ΑΝΑΓΝΩΣΗ– EEPROM.read(διεύθυνση).

Σε αυτά τα σκίτσα: διεύθυνση – ένα όρισμα με τα δεδομένα του κελιού όπου εισάγονται τα δεδομένα του δεύτερου ορίσματος. κατά την ανάγνωση, χρησιμοποιείται ένα όρισμα, διεύθυνση, το οποίο υποδεικνύει από πού πρέπει να διαβαστούν οι πληροφορίες.

Λειτουργία Σκοπός
ανάγνωση (διεύθυνση) διαβάζει 1 byte από το EEPROM. διεύθυνση – διεύθυνση από την οποία διαβάζονται τα δεδομένα (κελί που ξεκινά από 0).
εγγραφή (διεύθυνση, αξία) εγγράφει τιμή (1 byte, αριθμός από 0 έως 255) στη μνήμη στη διεύθυνση.
ενημέρωση (διεύθυνση, τιμή) αντικαθιστά την τιμή στη διεύθυνση εάν τα παλιά περιεχόμενά της είναι διαφορετικά από τα νέα.
λήψη (διεύθυνση, δεδομένα) διαβάζει δεδομένα του καθορισμένου τύπου από τη μνήμη στη διεύθυνση.
put (διεύθυνση, δεδομένα) εγγράφει δεδομένα του καθορισμένου τύπου στη μνήμη στη διεύθυνση.
EEPROM σας επιτρέπει να χρησιμοποιείτε το αναγνωριστικό "EEPROM" ως πίνακα για την εγγραφή δεδομένων και την ανάγνωση από τη μνήμη.

Γράψιμο Ακεραίων

Η εγγραφή ακεραίων σε μη πτητική μνήμη EEPROM είναι αρκετά απλή. Η εισαγωγή αριθμών πραγματοποιείται όταν εκκινείται η λειτουργία EEPROM.write(). Τα απαιτούμενα δεδομένα αναφέρονται σε αγκύλες. Σε αυτήν την περίπτωση, οι αριθμοί από το 0 έως το 255 και οι αριθμοί πάνω από το 255 γράφονται διαφορετικά. Τα πρώτα εισάγονται απλά - ο όγκος τους παίρνει 1 byte, δηλαδή ένα κελί. Για να γράψετε το τελευταίο, πρέπει να χρησιμοποιήσετε τους τελεστές highByte() για το υψηλότερο byte και lowByte() για το χαμηλότερο byte.

Ο αριθμός χωρίζεται σε byte και γράφεται χωριστά σε κελιά. Για παράδειγμα, ο αριθμός 789 θα γραφτεί σε δύο κελιά: το πρώτο θα περιέχει τον παράγοντα 3 και το δεύτερο θα περιέχει την τιμή που λείπει. Το αποτέλεσμα είναι η απαιτούμενη τιμή:

3 * 256 + 21 = 789

Για « επανένωση" ισχύει μεγάλος ακέραιος λειτουργία λέξης(): int val = λέξη (γεια, χαμηλή). Πρέπει να διαβάσετε ότι ο μέγιστος ακέραιος για εγγραφή είναι 65536 (δηλαδή 2 στη δύναμη του 16). Σε κελιά που δεν έχουν ακόμη άλλες καταχωρήσεις, η οθόνη θα εμφανίζει τους αριθμούς 255 σε καθένα.

Γράψιμο αριθμών κινητής υποδιαστολής και συμβολοσειρών

Οι αριθμοί κινητής υποδιαστολής και συμβολοσειράς είναι μια μορφή γραφής πραγματικών αριθμών όπου αντιπροσωπεύονται από μια μάντισσα και έναν εκθέτη. Τέτοιοι αριθμοί εγγράφονται σε μη πτητική μνήμη EEPROM με την ενεργοποίηση της συνάρτησης EEPROM.put(), ανάγνωση, αντίστοιχα, – EEPROM.get().

Κατά τον προγραμματισμό, οι αριθμητικές τιμές κινητής υποδιαστολής ορίζονται ως float· αξίζει να σημειωθεί ότι δεν πρόκειται για εντολή, αλλά για αριθμό. Τύπος χαρακτήρων (τύπος χαρακτήρων) – χρησιμοποιείται για την αναπαράσταση συμβολοσειρών. Η διαδικασία εγγραφής αριθμών στην οθόνη ξεκινά με τη χρήση setup(), ανάγνωσης - με χρήση loop().

Κατά τη διάρκεια της διαδικασίας, οι τιμές ovf, που σημαίνει "υπερπλήρωση" και nan, που σημαίνει "λείπει", ενδέχεται να εμφανιστούν στην οθόνη της οθόνης αριθμητική αξία" Αυτό σημαίνει ότι οι πληροφορίες που είναι γραμμένες στο κελί δεν μπορούν να αναπαραχθούν ως αριθμός κινητής υποδιαστολής. Αυτή η κατάσταση δεν θα προκύψει εάν γνωρίζετε αξιόπιστα σε ποιο κελί τι είδους πληροφορίες καταγράφονται.

Παραδείγματα έργων και σκίτσα

Παράδειγμα Νο. 1

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

// ελέγξτε τη λειτουργία του EEPROM #include int i, d; void setup() ( Serial.begin(9600); // αρχικοποίηση της θύρας, ταχύτητα 9600 ) void loop() ( // ανάγνωση EEPROM και έξοδος δεδομένων 16 στη σειριακή θύρα Serial.println(); Serial.print("EEPROM = "); i= 0, ενώ (i< 16) { Serial.print((char)EEPROM.read(i)); i++; } // проверка есть ли данные для записи if (Serial.available() != 0) { delay(50); // ожидание окончания приема данных // запись в EEPROM i= 0; while(i < 20) { d= Serial.read(); if (d == -1) d= " "; // если символы закончились, заполнение пробелами EEPROM.write(i, (byte)d); // запись EEPROM i++; } } delay(500); }

Παράδειγμα Νο. 2

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

#περιλαμβάνω διεύθυνση int = 0; // διεύθυνση eeprom int read_value = 0; // δεδομένα που διαβάζονται από το eeprom char serial_in_data; // δεδομένα σειριακής θύρας int led = 6; // γραμμή 6 για LED int i; void setup() ( pinMode(led, OUTPUT); // η γραμμή 6 έχει ρυθμιστεί ως έξοδος Serial.begin(9600); // ρυθμός baud στη σειριακή θύρα 9600 Serial.println(); Serial.println("ΠΡΟΗΓΟΥΜΕΝΟ ΚΕΙΜΕΝΟ ΣΤΟ EEPROM : -"); for(διεύθυνση = 0; διεύθυνση< 1024; address ++) // считываем всю память EEPROM { read_value = EEPROM.read(address); Serial.write(read_value); } Serial.println(); Serial.println("WRITE THE NEW TEXT: "); for(address = 0; address < 1024; address ++) // заполняем всю память EEPROM пробелами EEPROM.write(address, " "); for(address = 0; address < 1024;) // записываем пришедшие с последовательного порта данные в память EEPROM { if(Serial.available()) { serial_in_data = Serial.read(); Serial.write(serial_in_data); EEPROM.write(address, serial_in_data); address ++; digitalWrite(led, HIGH); delay(100); digitalWrite(led, LOW); } } } void loop() { //---- мигаем светодиодом каждую секунду -----// digitalWrite(led, HIGH); delay(1000); digitalWrite(led, LOW); delay(1000); }

Παράδειγμα Νο. 3

Γράφει δύο ακέραιους αριθμούς στη μνήμη, τους διαβάζει από το EEPROM και τους εξάγει στη σειριακή θύρα. Οι αριθμοί από το 0 έως το 255 καταλαμβάνουν 1 byte μνήμης, χρησιμοποιώντας τη συνάρτηση EEPROM.write()γράφονται στο επιθυμητό κελί. Για αριθμούς μεγαλύτερους από 255, πρέπει να χωριστούν σε byte χρησιμοποιώντας highByte()Και lowByte()και γράψτε κάθε byte στο δικό του κελί. Ο μέγιστος αριθμός σε αυτήν την περίπτωση είναι 65536 (ή 2 16).

#περιλαμβάνω // συνδέστε τη βιβλιοθήκη EEPROM void setup() ( int smallNum = 123; // ακέραιος από 0 έως 255 EEPROM.write(0, smallNum); // γράψτε έναν αριθμό στο κελί 0 int bigNum = 789; // διαχωρίστε τον αριθμό > 255 επί 2 byte (μέγ. 65536) byte hi = highByte(bigNum); // high byte byte low = lowByte(bigNum); // low byte EEPROM.write(1, hi); // εγγραφή υψηλό byte του EEPROM στο κελί 1 .write(2, low); // γράψτε το χαμηλό byte στο κελί 2 Serial.begin(9600); // αρχικοποίηση της σειριακής θύρας ) void loop() ( for (int addr=0; addr<1024; addr++) { // для всех ячеек памяти (для Arduino UNO 1024) byte val = EEPROM.read(addr); // считываем 1 байт по адресу ячейки Serial.print(addr); // выводим адрес в послед. порт Serial.print("\t"); // табуляция Serial.println(val); // выводим значение в послед. порт } delay(60000); // задержка 1 мин }

Παράδειγμα αρ. 4

Σύνταξη αριθμών κινητής υποδιαστολής και συμβολοσειρών - μέθοδος EEPROM.put(). ΑΝΑΓΝΩΣΗ - EEPROM.get().

#περιλαμβάνω // συνδέστε τη βιβλιοθήκη void setup() ( int addr = 0; // διεύθυνση float f = 3.1415926f; // αριθμός κινητής υποδιαστολής (τύπος float) EEPROM.put(addr, f); // γράψτε τον αριθμό f στη διεύθυνση addr addr += sizeof(float); // υπολογίστε το όνομα char του επόμενου κελιού ελεύθερης μνήμης = "Hello, SolTau.ru!"; // δημιουργήστε έναν πίνακα χαρακτήρων EEPROM.put(addr, name); // γράψτε τον πίνακα σε EEPROM Serial.begin (9600); // προετοιμασία της σειριακής θύρας ) void loop() ( for (int addr=0; addr<1024; addr++) { // для всех ячеек памяти (1024Б=1кБ) Serial.print(addr); // выводим адрес в послед. порт Serial.print("\t"); // табуляция float f; // переменная для хранения значений типа float EEPROM.get(addr, f); // получаем значение типа float по адресу addr Serial.print(f, 5); // выводим с точностью 5 знаков после запятой Serial.print("\t"); // табуляция char c; // переменная для хранения массива из 20 символов EEPROM.get(addr, c); // считываем массив символов по адресу addr Serial.println(c); // выводим массив в порт } delay(60000); // ждём 1 минуту }

Παράδειγμα αρ. 5

Χρήση του EEPROM ως πίνακα.

#περιλαμβάνω void setup() ( EEPROM = 11; // γράψτε το 1ο κελί EEPROM = 121; // γράψτε το 2ο κελί EEPROM = 141; // γράψτε το 3ο κελί EEPROM = 236; // γράψτε το 4ο κελί Serial .begin(9600 ); ) void loop() ( for (int addr=0; adr<1024; addr++) { Serial.print(addr); Serial.print("\t"); int n = EEPROM; // считываем ячейку по адресу addr Serial.println(n); // выводим в порт } delay(60000); }

Συνεργασία με την EEPROM

Όπως αναφέρθηκε προηγουμένως, η μνήμη EEPROM είναι περιορισμένη. Για να παρατείνετε τη διάρκεια ζωής της μη πτητικής μνήμης, αντί για τη συνάρτηση write(), είναι προτιμότερο να χρησιμοποιήσετε τη συνάρτηση ενημέρωσης. Σε αυτήν την περίπτωση, η επανεγγραφή πραγματοποιείται μόνο για εκείνα τα κελιά όπου η τιμή διαφέρει από την πρόσφατα γραμμένη.

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

Αυτή η μνήμη στο Arduino αποθηκεύει τυπικά τα πιο σημαντικά πράγματα για τη λειτουργία του ελεγκτή και της συσκευής. Για παράδειγμα, εάν δημιουργηθεί ένας ελεγκτής θερμοκρασίας σε μια τέτοια βάση και τα αρχικά δεδομένα αποδειχθούν λανθασμένα, η συσκευή θα λειτουργεί "ανεπαρκώς" στις υπάρχουσες συνθήκες - θα υποτιμήσει πολύ ή θα υπερεκτιμήσει τη θερμοκρασία.

Υπάρχουν πολλές περιπτώσεις όπου το EEPROM περιέχει λανθασμένα δεδομένα:

  1. Κατά την αρχική ενεργοποίηση, δεν υπήρχαν ακόμη καταχωρήσεις.
  2. Κατά τη διάρκεια μιας μη ελεγχόμενης διακοπής ρεύματος, ορισμένα ή όλα τα δεδομένα δεν θα καταγράφονται ή θα καταγράφονται εσφαλμένα.
  3. Μετά την ολοκλήρωση των πιθανών κύκλων επανεγγραφής δεδομένων.

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

Για τον έλεγχο της ακεραιότητας των πληροφοριών, χρησιμοποιείται ένας κωδικός ελέγχου συστήματος. Δημιουργείται με βάση την αρχική καταγραφή δεδομένων και, όταν επαληθεύεται, υπολογίζει εκ νέου τα δεδομένα. Εάν το αποτέλεσμα είναι διαφορετικό, είναι λάθος. Η πιο συνηθισμένη έκδοση ενός τέτοιου ελέγχου είναι ένα άθροισμα ελέγχου - εκτελείται μια απλή μαθηματική πράξη για την προσθήκη όλων των τιμών κελιών.

Οι έμπειροι προγραμματιστές προσθέτουν ένα επιπλέον "αποκλειστικό OR" σε αυτόν τον κωδικό, όπως το E5h. Εάν όλες οι τιμές είναι ίσες με μηδέν και το σύστημα επαναφέρει κατά λάθος τα αρχικά δεδομένα, αυτό το τέχνασμα θα αποκαλύψει το σφάλμα.

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

Όλοι οι μικροελεγκτές της οικογένειας Mega περιλαμβάνουν μη πτητική μνήμη ( EEPROMμνήμη). Ο όγκος αυτής της μνήμης κυμαίνεται από 512 byte σε μοντέλα ATmega8x έως 4 KB σε παλαιότερα μοντέλα. EEPROMΗ μνήμη βρίσκεται στον δικό της χώρο διευθύνσεων και, όπως η RAM, είναι οργανωμένη γραμμικά. Για να δουλέψω με EEPROMΗ μνήμη χρησιμοποιεί τρεις καταχωρητές εισόδου/εξόδου: έναν καταχωρητή διευθύνσεων, έναν καταχωρητή δεδομένων και έναν καταχωρητή ελέγχου.

Μητρώο διεύθυνσης

Μητρώο διεύθυνσης EEPROMμνήμη EEAR (Μητρώο διευθύνσεων EEPROM)βρίσκεται φυσικά σε δύο RVV EEARH:EARL, που βρίσκεται κατά μήκος
διευθύνει $1F ($3F) και $1E ($3E), αντίστοιχα. Αυτός ο καταχωρητής φορτώνεται με τη διεύθυνση του κελιού στο οποίο θα έχετε πρόσβαση. Το μητρώο διευθύνσεων είναι εγγράψιμο και αναγνώσιμο. Παράλληλα στο μητρώο EEARHχρησιμοποιούνται μόνο τα λιγότερο σημαντικά bit (ο αριθμός των μπιτ που εμπλέκονται εξαρτάται από τον όγκο EEPROMμνήμη). Αχρησιμοποίητα bit καταχωρητή EEARHείναι μόνο για ανάγνωση και περιέχουν "0".

Μητρώο δεδομένων

Μητρώο δεδομένων EEPROMμνήμη EEDR (Μητρώο δεδομένων EEPROM)βρίσκεται στο $1D ($3D). Κατά την εγγραφή σε αυτό το μητρώο, φορτώνονται δεδομένα που πρέπει να τοποθετηθούν EEPROM, και κατά την ανάγνωση, τα δεδομένα διαβάζονται από EEPROM.

Μητρώο ελέγχου

Μητρώο ελέγχου EEPROMμνήμη EECR (Μητρώο Ελέγχου EEPROM)βρίσκεται σε $1C ($3C). Αυτό το μητρώο χρησιμοποιείται για
έλεγχος πρόσβασης EEPROMμνήμη. Η περιγραφή του φαίνεται στον παρακάτω πίνακα:

Απαλλάσσω Ονομα Περιγραφή
7..4 - δεν χρησιμοποιείται, διαβάζεται ως "0"
3 ΜΥΣΤΗΡΙΩΔΗΣ Ενεργοποίηση διακοπής από την EEPROM. Αυτό το bit ελέγχει τη δημιουργία μιας διακοπής που συμβαίνει όταν ολοκληρωθεί ο κύκλος εγγραφής EEPROM. Εάν αυτό το bit έχει οριστεί σε "1", οι διακοπές ενεργοποιούνται (εάν η σημαία I του καταχωρητή
Το SREG έχει επίσης οριστεί σε "1"). Όταν διαγραφεί το bit EEWE (δείτε παρακάτω
πίνακας) η διακοπή δημιουργείται συνεχώς
2 EEMWE Έλεγχος άδειας εγγραφής στο EEPROM. Η κατάσταση αυτού του bit καθορίζει τη λειτουργία της σημαίας ενεργοποίησης εγγραφής EEWE. Εάν αυτό το bit έχει οριστεί σε "1", τότε κατά την εγγραφή στο bit EEWE "1", τα δεδομένα εγγράφονται στο EEPROM. Διαφορετικά, η ρύθμιση του EEWE σε "1" δεν έχει αποτέλεσμα. Μετά την εγκατάσταση του λογισμικού, το bit EEMWE επαναφέρεται από το υλικό μέσω
4 κύκλοι μηχανής
1 ΕΕΕΕ Να επιτρέπεται η εγγραφή στην EEPROM. Όταν αυτό το bit έχει οριστεί σε "1", τα δεδομένα γράφονται σε EEPROM (αν το EEMWE είναι ίσο με "1")
0 EERE Άδεια ανάγνωσης από την EEPROM. Αφού ρυθμίσετε αυτό το bit σε "1", τα δεδομένα διαβάζονται από το EEPROM. Μετά την ολοκλήρωση της ανάγνωσης, αυτό το bit επαναφέρεται από το υλικό

Για να γράψετε ένα byte στο EEPROM χρειάζεστε:

1. Περιμένετε έως ότου το EEPROM είναι έτοιμο να εγγράψει δεδομένα (περιμένετε μέχρι να μηδενιστεί η σημαία EEWE του μητρώου EECR).

2. Περιμένετε να ολοκληρωθεί η εγγραφή στη μνήμη του προγράμματος FLASH (περιμένετε μέχρι να μηδενιστεί η σημαία SPMEN του καταχωρητή SPMCR).

3. Φορτώστε το byte δεδομένων στον καταχωρητή EEDR και την απαιτούμενη διεύθυνση στον καταχωρητή EEAR (εάν είναι απαραίτητο).

4. Ρυθμίστε τη σημαία EEMWE του καταχωρητή EECR σε "1".

5. Γράψτε το αρχείο καταγραφής στο bit EEWE του καταχωρητή EECR. "1" για 4 κύκλους μηχανής. Μετά την εγκατάσταση αυτού του bit, ο επεξεργαστής
παρακάμπτει 2 κύκλους μηχανής πριν εκτελέσει την επόμενη εντολή.

Για να διαβάσετε ένα byte από το EEPROM χρειάζεστε:

1. Ελέγξτε την κατάσταση της σημαίας EEWE. Το γεγονός είναι ότι ενώ εκτελείται μια λειτουργία εγγραφής στη μνήμη EEPROM (έχει οριστεί η σημαία EEWE), δεν μπορεί να πραγματοποιηθεί ούτε ανάγνωση της μνήμης EEPROM ούτε αλλαγή του καταχωρητή διευθύνσεων.

2. Φορτώστε την απαιτούμενη διεύθυνση στο μητρώο EEAR.

3. Ρυθμίστε το bit EERE του καταχωρητή EECR σε "1".

Όταν τα ζητούμενα δεδομένα τοποθετηθούν στον καταχωρητή δεδομένων EEDR, θα πραγματοποιηθεί επαναφορά υλικού αυτού του bit. Ωστόσο, δεν είναι απαραίτητο να παρακολουθείτε την κατάσταση του bit EERE για να προσδιορίσετε πότε ολοκληρώνεται μια λειτουργία ανάγνωσης, καθώς μια λειτουργία ανάγνωσης από το EEPROM ολοκληρώνεται πάντα σε έναν κύκλο μηχανής. Επιπλέον, αφού ρυθμίσει το bit EERE στο "1", ο επεξεργαστής παραλείπει 4 κύκλους μηχανής πριν ξεκινήσει την επόμενη εντολή.

Το περιβάλλον AVR Studio GCC διαθέτει μια τυπική βιβλιοθήκη για εργασία με EEPROM, η οποία ενεργοποιείται με τη σύνδεση του αρχείου . Οι κύριες λειτουργίες είναι eeprom_read_byte(), eeprom_write_byte(), eeprom_read_word(), eeprom_write_word().Για παράδειγμα, ας γράψουμε ένα πρόγραμμα για έναν μίνι μετρητή από το 0 έως το 9, όπου όταν πατάτε ένα κουμπί, θα προστίθεται μια τιμή και ένα άλλο κουμπί θα αποθηκεύει αυτήν την τιμή στη μνήμη. Ο μικροελεγκτής Atmega8 λειτουργεί από μια εσωτερική γεννήτρια ρολογιού με συχνότητα 8 MHz. Ένας μονοψήφιος δείκτης επτά τμημάτων με κοινή άνοδο συνδέεται στη θύρα Β μέσω αντιστάσεων περιορισμού ρεύματος R1-R7, η κοινή άνοδος συνδέεται στο τροφοδοτικό plus. Το διάγραμμα φαίνεται παρακάτω:

Αρχικά, συνδέουμε τις βιβλιοθήκες που είναι απαραίτητες για τη λειτουργία, συμπεριλαμβανομένης της EEPROM. Ορίστε μεταβλητές. Η μεταβλητή "s" αποθηκεύει την τιμή για εμφάνιση στην ένδειξη· όταν πατάτε το κουμπί SB1, αυτή η τιμή αυξάνεται κατά ένα, αλλά όχι περισσότερο από 10. Η μεταβλητή eeprom_var θα αλληλεπιδράσει με τη EEPROM. Όταν είναι ενεργοποιημένη η τροφοδοσία, διαβάζεται το EEPROM, τα δεδομένα ανάγνωσης εκχωρούνται στη μεταβλητή "s", με βάση αυτό, εμφανίζεται ένας συγκεκριμένος αριθμός στην ένδειξη. Όταν πατάτε το SB2, τα δεδομένα από τη μεταβλητή «s» εγγράφονται στο EEPROM και η ένδειξη αναβοσβήνει μία φορά.

#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω #define d0 ~(0x3F) // 0 #define d1 ~(0x06) // 1 #define d2 ~(0x5B) // 2 #define d3 ~(0x4F) // 3 #define d4 ~(0x66) // 4 #define d5 ~(0x6D) // 5 #define d6 ~(0x7D) // 6 #define d7 ~(0x07) // 7 #define d8 ~(0x7F) // 8 #define d9 ~(0x6F) // 9 ανυπόγραφο char s; ανυπόγραφο char eeprom_var EEMEM; // ορίστε μια μεταβλητή στο EEPROM int main (void) ( DDRB = 0xFF; // Θύρα B στην έξοδο PORTB = 0xFF; DDRD = 0x00; // Θύρα D στην είσοδο PORTD = 0xFF; // Ενεργοποίηση αντιστάσεων έλξης s = eeprom_read_byte(&eeprom_var ); // διαβάστε ένα byte από το EEPROM και βάλτε το στο "s" while(1) ( if((PIND&(1<< PD0)) == 0) // если кнопка SB1 нажата { while((PIND&(1 << PD0)) == 0){} // ждем отпускания кнопки s++; // увеличиваем "s" на единицу _delay_ms(200); } if(s == 10) // Когда дойдет до 10 обнуляем "s" { s = 0; } if((PIND&(1 << PD1)) == 0) // если кнопка SB2 нажата { while((PIND&(1 << PD1)) == 0){} // ждем отпускания кнопки DDRB = 0xFF; // мигаем индикатором _delay_ms(200); DDRB = 0x00; _delay_ms(200); DDRB = 0xFF; eeprom_write_byte(&eeprom_var, s); // записываем "s" в EEPROM _delay_ms(200); } if(s==0) // Выводим цифры на индикатор PORTB = d0; if(s==1) PORTB = d1; if(s==2) PORTB = d2; if(s==3) PORTB = d3; if(s==4) PORTB = d4; if(s==5) PORTB = d5; if(s==6) PORTB = d6; if(s==7) PORTB = d7; if(s==8) PORTB = d8; if(s==9) PORTB = d9; } }

Σχόλια

0 AntonChip 05/02/2013 22:15

Παραθέτω τον Μαξ:

Ισως μπερδευω κατι αλλα αν εχεις ενδεικτη με ΟΑ τοτε αρκει μια αντισταση στη γραμμη 5V.Γιατι να τοποθετησεις αντιστασεις περιορισμου ρευματος μετα το στοιχειο που υποτιθεται οτι προστατευουν απο το υψηλο ρευμα??


Απλώς φανταστείτε τι θα συμβεί εάν ένα τμήμα της ένδειξης κλείσει με αυτό και ένα άλλο σχήμα σύνδεσης αντίστασης.

0 AntonChip 15/05/2013 11:16

Παραθέτω το gydok:

Πώς να γράψετε έναν δισδιάστατο πίνακα στο eeprom;


Κώδικας:
#περιλαμβάνω // Συμπεριλάβετε τη βιβλιοθήκη

EEMEM ανυπόγραφα χρώματα χαρακτήρων=((1, 2, 3), // Δηλώστε έναν πίνακα στο EEPROM
{4, 5, 6}};

eeprom_write_byte(&colors, 1); // Εγγραφή στοιχείων πίνακα στο EEPROM
eeprom_write_byte(&colors, 2);
eeprom_write_byte(&colors, 3);
eeprom_write_byte(&colors, 4);
eeprom_write_byte(&colors, 5);
eeprom_write_byte(&colors, 6);

ανυπόγραφο char temp?
temp = eeprom_read_byte(&colors); // Εξαγωγή στοιχείου πίνακα από το EEPROM, 2nd row(), 1st column(), δηλ. αριθμός 4

Επαναφορά μνήμης EEPROM

Το παράδειγμα περνά σε όλα τα κελιά μνήμης και γράφει μηδενικά σε αυτά.

// Σύνδεση της βιβλιοθήκης για εργασία με την EEPROM. #include "EEPROM.h" void setup() ( // Περάστε από όλα τα κελιά (byte) και γράψτε μηδενικά σε αυτά. for (int i = 0; i< EEPROM.length(); i++) EEPROM.update(i, 0); } void loop() { // Пустой цикл... }


Εργοστασιακή επανεκκίνηση

Εάν θέλετε να επαναφέρετε τη μνήμη στις εργοστασιακές ρυθμίσεις, πρέπει να αντικαταστήσετε το 0 με το 255, δηλ. γράψτε όχι μηδενικά, αλλά τον αριθμό 255. Έτσι, στο μέλλον, χρησιμοποιώντας τη συνάρτηση isNaN(), μπορείτε να ελέγξετε εάν η εγγραφή στη μνήμη EEPROM έγινε ή όχι.

// Σύνδεση της βιβλιοθήκης για εργασία με την EEPROM. #include "EEPROM.h" void setup() ( // Περάστε από όλα τα κελιά (byte) και γράψτε τους αριθμούς 255 σε αυτά. for (int i = 0; i< EEPROM.length(); i++) EEPROM.update(i, 255); } void loop() { // Пустой цикл... }

Πες μας για εμάς

Μήνυμα

Εάν έχετε εμπειρία εργασίας με το Arduino και έχετε πραγματικά χρόνο για δημιουργικότητα, προσκαλούμε όλους να γίνουν συντάκτες άρθρων που δημοσιεύονται στην πύλη μας. Αυτά μπορεί να είναι είτε μαθήματα είτε ιστορίες σχετικά με τα πειράματά σας με το Arduino. Περιγραφή διάφορων αισθητήρων και μονάδων. Συμβουλές και οδηγίες για αρχάριους. Γράψτε και δημοσιεύστε τα άρθρα σας στο