תוכן עניינים:

קריאה וכתיבה של נתונים ל- EEPROM חיצוני באמצעות Arduino: 5 שלבים
קריאה וכתיבה של נתונים ל- EEPROM חיצוני באמצעות Arduino: 5 שלבים

וִידֵאוֹ: קריאה וכתיבה של נתונים ל- EEPROM חיצוני באמצעות Arduino: 5 שלבים

וִידֵאוֹ: קריאה וכתיבה של נתונים ל- EEPROM חיצוני באמצעות Arduino: 5 שלבים
וִידֵאוֹ: MEMORIAS EEPROM 24C04, 25C04 DATASHEET 2024, יולי
Anonim
קריאה וכתיבה של נתונים ל- EEPROM חיצוני באמצעות Arduino
קריאה וכתיבה של נתונים ל- EEPROM חיצוני באמצעות Arduino

EEPROM מייצג זיכרון לקריאה בלבד הניתן לתכנות.

EEPROM חשוב מאוד ושימושי מכיוון שהוא צורה בלתי נדיפה של זיכרון. המשמעות היא שגם כאשר הלוח כבוי, שבב ה- EEPROM עדיין שומר את התוכנית שנכתבה אליו. אז כאשר אתה מכבה את הלוח ולאחר מכן מפעיל אותו מחדש, ניתן להפעיל את התוכנית שנכתבה ל- EEPROM. אז בעצם, EEPROM מאחסן ומריץ תוכנית ויהי מה. זה אומר שאתה יכול לכבות מכשיר, להשאיר אותו למשך 3 ימים, ולחזור ולהדליק אותו והוא עדיין יכול להריץ את התוכנית שתוכנתה בו. כך פועלים רוב המכשירים האלקטרוניים לצרכן.

הפרויקט בחסות LCSC. השתמשתי ברכיבים אלקטרוניים מ- LCSC.com. LCSC מחויבת להציע מבחר רחב של רכיבים אלקטרוניים מקוריים ואיכותיים במחיר הטוב ביותר עם רשת משלוחים גלובלית ליותר מ -200 מדינות. הירשם עוד היום וקבל הנחה של 8 $ בהזמנה הראשונה שלך.

EEPROM הוא גם יעיל מאוד בכך שניתן לקרוא, למחוק ולכתוב מחדש בתים בודדים ב- EEPROM מסורתי. ברוב סוגי הזיכרון הלא נדיף, לא ניתן לעשות זאת. התקני EEPROM סידוריים כמו ה- EEPROM מסדרת Microchip מסדרת 24 מאפשרים לך להוסיף זיכרון נוסף לכל מכשיר שיכול לדבר I²C.

אספקה

  1. EEPROM - 24LC512
  2. ATmega328P-PU
  3. 16 מגהרץ קריסטל
  4. לוח לחם
  5. התנגדות 4.7k אוהם 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 בצורה של דיודה מטריקס ROM. זהו זיכרון המורכב מדיודות מוליכות למחצה נפרדות המונחות על לוח PCB מאורגן במיוחד. זה פינה את מקומו ל- Mask ROM עם הופעת מעגלים משולבים. ROM Mask היה דומה מאוד ל- Diode Matrix ROM, אך הוא יושם בקנה מידה קטן בהרבה. עם זאת, פירוש הדבר היה שלא תוכל להזיז כמה דיודות עם מלחם ולתכנת אותו מחדש. היצרן היה צריך לתכנת את מסכת ROM ולאחר מכן לא ניתן היה לשנות אותו.

לרוע המזל, Mask ROM היה יקר ולקח הרבה זמן לייצר מכיוון שכל תוכנית חדשה דרשה לייצר מכשיר חדש על ידי יציקה. אולם בשנת 1956, בעיה זו נפתרה עם המצאת PROM (ROM הניתן לתכנות) שאפשר למפתחים לתכנת את השבבים עצמם. המשמעות היא שיצרנים יכולים לייצר מיליוני אותו מכשיר לא מתוכנת, מה שהופך אותו לזול יותר ולמעשי יותר. עם זאת, ניתן לכתוב ל- PROM רק פעם אחת באמצעות מכשיר תכנות במתח גבוה. לאחר שתכנת התקן PROM, לא הייתה אפשרות להחזיר את המכשיר למצב לא מתוכנת.

זה השתנה בשנת 1971 עם המצאת EPROM (Erasable Programmable ROM) אשר - מלבד הוספת אות נוספת לראשי התיבות - הביא עמו את היכולת למחוק את המכשיר ולהחזירו למצב "ריק" באמצעות מקור אור UV חזק. זה נכון, היית צריך להאיר אור בהיר על ה- IC כדי לתכנת אותו מחדש, כמה מגניב זה? ובכן, מסתבר שזה די מגניב אלא אם כן אתה מפתח שעובד על קושחה ובמקרה כזה באמת תרצה שתוכל לתכנת את המכשיר מחדש באמצעות אותות חשמליים. זה סוף סוף הפך למציאות ב -1983 עם פיתוח EEPROM (ROM הניתן לתכנות חשמלית) ועם זה, אנו מגיעים לראשי התיבות הלא פשוטים של היום.

שלב 2: מוזרויות של EEPROM

ישנם שני חסרונות עיקריים ל- EEPROM כשיטה לאחסון נתונים. ברוב היישומים, היתרונות עולים על החסרונות, אך עליך להיות מודע אליהם לפני שילוב EEPROM בעיצוב הבא שלך.

קודם כל, הטכנולוגיה שגורמת ל- EEPROM לעבוד גם מגבילה את מספר הפעמים שניתן לכתוב אותה מחדש. זה קשור לאלקטרונים שנלכדים בטרנזיסטורים המרכיבים את ה- ROM ובונים עד שההפרש המטען בין "1" ל" 0 "אינו ניתן לזיהוי. אך אל דאגה, לרוב ה- EEPROM יש מספר כתיבה מחדש מרבי של מיליון או יותר. כל עוד אתה לא כותב ללא הרף ל- EEPROM לא סביר שתגיע למקסימום זה. שנית, EEPROM לא יימחק אם תסיר ממנו כוח, אך הוא לא יחזיק בנתונים שלך ללא הגבלת זמן. אלקטרונים יכולים להיסחף מהטרנזיסטורים ודרך המבודד, ולמחוק ביעילות את ה- EEPROM לאורך זמן. עם זאת, זה קורה בדרך כלל לאורך שנים (אם כי ניתן להאיץ אותו על ידי חום). רוב היצרנים אומרים כי הנתונים שלך בטוחים ב- EEPROM למשך 10 שנים או יותר בטמפרטורת החדר. ויש עוד דבר שכדאי לזכור בעת בחירת מכשיר EEPROM לפרויקט שלך. קיבולת EEPROM נמדדת בביטים ולא בתים. EEPROM של 512K יחזיק 512Kbits נתונים, במילים אחרות 64KB בלבד.

שלב 3: חיבור חומרה Arduino

חיבור חומרה ל- Arduino
חיבור חומרה ל- Arduino
חיבור חומרה ל- Arduino
חיבור חומרה ל- Arduino

אוקיי, עכשיו כשאנחנו יודעים מה זה EEPROM, בואו לחבר אחד ולראות מה זה יכול לעשות! על מנת שהמכשיר שלנו ידבר, נצטרך לחבר קווי חשמל כמו גם קווים טוריים I²C. מכשיר זה, בפרט, פועל על 5VDC כך שנחבר אותו לפלט 5V של ה- Arduino UNO שלנו. כמו כן, קווי I²C יצטרכו נגדי משיכה כדי שהתקשורת תתקיים כראוי. הערך של נגדים אלה תלוי בקיבול של הקווים ובתדירות שברצונך להעביר אותו, אך כלל אצבע טוב עבור יישומים לא-קריטיים הוא פשוט שמור אותו בטווח kΩ. בדוגמה זו נשתמש בנגדי משיכה של 4.7kΩ.

ישנם שלושה סיכות במכשיר זה לבחירת כתובת I²C, כך תוכל לקבל יותר מ- EEPROM אחד באוטובוס ולתת מענה לכל אחד מהם בצורה שונה. אתה יכול פשוט לקרקע את כולם, אבל אנחנו נחבר אותם כך שנוכל להכניס מכשיר בעל קיבולת גבוהה יותר בהמשך ההדרכה.

נשתמש בלוח לחם כדי לחבר הכל יחד. התרשים שלהלן מציג את החיבור הנכון עבור רוב מכשירי I²C EEPROM, כולל ה- EEPROM מסדרת Microchip מסדרת 24 שאנו מוכרים.

שלב 4: קריאה וכתיבה

רוב הזמן כאשר אתה משתמש ב- EEPROM בשילוב עם מיקרו -בקר, למעשה לא תצטרך לראות את כל תוכן הזיכרון בבת אחת. פשוט תקרא ותכתוב בתים פה ושם לפי הצורך. אולם בדוגמה זו אנו הולכים לכתוב קובץ שלם ל- EEPROM ולאחר מכן לקרוא את כל זה בחזרה כדי שנוכל לצפות בו במחשב שלנו. זה אמור לגרום לנו להרגיש בנוח עם הרעיון להשתמש ב- EEPROM וגם לתת לנו תחושה כמה נתונים באמת יכולים להתאים למכשיר קטן.

לכתוב משהו

הסקיצה לדוגמא שלנו פשוט תיקח כל בת שנכנס מעל היציאה הטורית ותכתוב אותו ל- EEPROM, ויעקוב אחר מספר הבייטים שכתבנו לזיכרון.

כתיבת בייט זיכרון ל- EEPROM מתרחשת בדרך כלל בשלושה שלבים:

  1. שלח את הבייט המשמעותי ביותר של כתובת הזיכרון שאליה ברצונך לכתוב.
  2. שלח את הבייט הפחות משמעותי של כתובת הזיכרון שאליה ברצונך לכתוב.
  3. שלח את בית הנתונים שתרצה לאחסן במיקום זה.

כנראה שיש שם כמה מילות מפתח שאינן מסבירות:

כתובות זיכרון

אם אתה מדמיין את כל הבייטים ב- 512 Kbit EEPROM העומדים בשורה בין 0 ל- 64000 - מכיוון שיש 8 סיביות לבייט ולכן אתה יכול להתאים 64000 בתים ב- 512 Kbit EEPROM - אז כתובת זיכרון היא המקום ב- קו שבו היית מוצא בייט מסוים. עלינו לשלוח את הכתובת הזו ל- EEPROM כדי שתדע היכן לשים את הבייט שאנו שולחים.

הבייטים המשמעותיים והפחות משמעותיים ביותר

מכיוון שיש 32000 מקומות אפשריים ב- 256 Kbit EEPROM - ומכיוון ש- 255 הוא המספר הגדול ביותר שאתה יכול לקודד בבת אחת - עלינו לשלוח כתובת זו בשני בתים. ראשית, אנו שולחים את הבייט המשמעותי ביותר (MSB) - 8 הסיביות הראשונות במקרה זה. לאחר מכן אנו שולחים את הבייט הפחות משמעותי (LSB) - 8 הסיביות השניות. למה? מכיוון שכך המכשיר מצפה לקבל אותם, זה הכל.

כתיבת עמודים

כתיבה של בית אחד בכל פעם היא בסדר, אך ברוב מכשירי EEPROM יש משהו שנקרא "מאגר כתיבת דפים" המאפשר לך לכתוב מספר בתים בו זמנית באותו אופן בו היית עושה בתים בודדים. ננצל זאת בסקיצה לדוגמא שלנו. ה- EEPROM משתמש במונה פנימי שמגדיל באופן אוטומטי את מיקום הזיכרון עם כל בת הנתונים הבאים שהוא מקבל. לאחר שליחת כתובת זיכרון נוכל לעקוב אחריה עם עד 64 בתים של נתונים. ה- EEPROM מניח (בצדק) שכתובת 312 ואחריה 10 בתים תקליט בית 0 בכתובת 312, בת 1 בכתובת 313, בת 2 בכתובת 314 וכן הלאה.

קרא משהו

קריאה מ- EEPROM עוקבת בעצם אחר אותו תהליך בן שלושה שלבים כמו כתיבה ל- EEPROM:

  1. שלח את הבייט המשמעותי ביותר של כתובת הזיכרון שאליה ברצונך לכתוב.
  2. שלח את הבייט הפחות משמעותי של כתובת הזיכרון שאליה ברצונך לכתוב.
  3. בקש את בית הנתונים במיקום זה.

שלב 5: סכמטים וקוד

סכמטים וקוד
סכמטים וקוד

קוד:

#לִכלוֹל

#define eeprom 0x50 // מגדיר את כתובת הבסיס של ה- EEPROM

הגדרת בטל () {

Wire.begin (); // יוצר אובייקט Wire

Serial.begin (9600);

כתובת int חתומה = 0; // כתובת ראשונה של ה- EEPROM

Serial.println ("אנו כותבים את המיקוד 22222, מיקוד"); עבור (כתובת = 0; כתובת <5; כתובת ++) writeEEPROM (eeprom, address, '2'); // כותב 22222 ל- EEPROM

עבור (כתובת = 0; כתובת <5; כתובת ++) {Serial.print (readEEPROM (eeprom, address), HEX); }}

לולאת חלל () {

/*אין שום דבר בפונקציית הלולאה () מכיוון שאנחנו לא רוצים שהארדואינו יכתוב שוב ושוב את אותו הדבר ל- EEPROM. אנחנו רק רוצים כתיבה חד פעמית, כך שהפונקציה של לולאה () תימנע בעזרת EEPROM.*/}

// מגדיר את הפונקציה writeEEPROM

void writeEEPROM (int deviceaddress, int eeaddress int חתום, נתוני בתים) {Wire.beginTransmission (deviceaddress); Wire.write ((int) (ערכת >> 8)); // כותב את MSB Wire.write ((int) (eeaddress & 0xFF)); // כותב את LSB Wire.write (נתונים); Wire.endTransmission (); }

// מגדיר את הפונקציה readEEPROM

בייט readEEPROM (int deviceaddress, int eeaddress ללא חתום) {byte rdata = 0xFF; Wire.beginTransmission (deviceaddress); Wire.write ((int) (ערכת >> 8)); // כותב את MSB Wire.write ((int) (eeaddress & 0xFF)); // כותב את LSB Wire.endTransmission (); Wire.requestFrom (deviceaddress, 1); if (Wire.available ()) rdata = Wire.read (); החזר rdata; }

מוּמלָץ: