eeprom что это в микроконтроллере
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
EEPROM (Electrically Erasable Programmable Read-Only Memory)
На сегодняшний день классическая двухтранзисторная технология EEPROM практически полностью вытеснена флеш-памятью типа NOR. Однако название EEPROM прочно закрепилось за сегментом памяти малой ёмкости независимо от технологии.
Содержание
История
Элай Харари в 1977 году создал EEPROM с помощью автоэлектронной эмиссии [Источник 2] через плавающий затвор. В 1978 году Джордж Перлегос в Intel разработал процессор Intel 2816, который был построен на более ранней технологии EPROM, но использовал тонкий подзатворный окисленный слой, позволяющий чипу стереть собственные байты без УФ-источника. Перлегос и другие позже использовали технологию, которая подразумевала использование на устройстве конденсаторов для обеспечения необходимого напряжения для программирования микросхемы. [1] [2]
Принцип действия
Принцип работы EEPROM основан на изменении и регистрации электрического заряда в изолированной области (кармане) полупроводниковой структуры. [3]
Ячейка памяти EEPROM представляет собой транзистор, в котором затвор выполняется из поликристаллического кремния. Затем этот затвор окисляется и в результате он будет окружен оксидом кремния — диэлектриком с прекрасными изолирующими свойствами. Изменение заряда («запись» и «стирание») производится приложением между затвором и истоком большого потенциала, чтобы напряженность электрического поля в тонком диэлектрике между каналом транзистора и карманом оказалась достаточна для возникновения туннельного эффекта. Для усиления эффекта туннелирования электронов в карман при записи применяется небольшое ускорение электронов путём пропускания тока через канал полевого транзистора (явление инжекции горячих носителей). После снятия программирующего напряжения индуцированный заряд остаётся на плавающем затворе, и, следовательно, транзистор остаётся в проводящем состоянии. Заряд на его плавающем затворе может храниться десятки лет. Чтение выполняется полевым транзистором, для которого карман выполняет функцию затвора. Потенциал плавающего затвора изменяет пороговые характеристики транзистора, что и регистрируется цепями чтения.
Ранее подобная конструкция ячеек применялась в ПЗУ с ультрафиолетовым стиранием (EPROM).Сейчас особенностью классической ячейки EEPROM можно назвать наличие второго транзистора, который помогает управлять режимами записи и стирания. Стирание информации производится подачей на программирующий затвор напряжения, противоположного напряжению записи. В отличие от ПЗУ с ультрафиолетовым стиранием, время стирания информации в EEPROM памяти составляет около 10 мс. Структурная схема энергонезависимой памяти с электрическим стиранием не отличается от структурной схемы масочного ПЗУ. Единственное отличие — вместо плавкой перемычки используется описанная выше ячейка.
Некоторые реализации EEPROM выполнялись в виде одного трёхзатворного полевого транзистора (один затвор плавающий и два обычных). Эта конструкция снабжается элементами, которые позволяют ей работать в большом массиве таких же ячеек. Соединение выполняется в виде двумерной матрицы, в которой на пересечении столбцов и строк находится одна ячейка. Поскольку ячейка EEPROM имеет третий затвор, то, помимо подложки, к каждой ячейке подходят 3 проводника (один проводник столбцов и 2 проводника строк).
Интерфейс
Устройства EEPROM используют последовательный или параллельный интерфейс для ввода/вывода информации.
Устройства с последовательным интерфейсом
Каждое устройство EEPROM, как правило, имеет свой код операций для выполнения различных функций. Функции для SPI EEPROM могут быть:
Ряд других операций, которые поддерживают некоторые EEPROM устройства:
Устройства с параллельным интерфейсом
Параллельные устройства EEPROM обычно содержат в себе 8-битную шину данных и адресную шину достаточного объёма для покрытия всей памяти. Большинство таких устройств имеют защиту записи на шинах и возможность выбора чипа. Некоторые микроконтроллеры содержат в себе такие интегрированные EEPROM. Операции на таких устройствах проще и быстрее в сравнении с последовательным интерфейсом EEPROM, но за счет того, что для его функционирования требуется большое количество точек вывода (28pin и больше), параллельная память EEPROM теряет популярность уступая место памяти типа Flash и последовательной EEPROM.
Другие устройства
Память EEPROM используется для функционирования и в других видах продуктов. Продукты, такие как часы реального времени, цифровые потенциометры, цифровые датчики температуры, в частности, могут иметь небольшое количество EEPROM для хранения информации о калибровке или другие данные, которые должны быть доступны в случае потери питания. Он также был использован на игровых картриджах, чтобы сохранить игровой прогресс и настройки, до использования внешней и внутренней флэш-памяти.
Режимы отказа
Родственные типы памяти
Флэш-память является более поздней формой EEPROM. В промышленности, существует конвенция, чтобы зарезервировать термин EEPROM для побайтно стираемой памяти относительно поблочно стираемой флэш-памяти. EEPROM занимает большую площадь кристалла, чем флэш-память для той же мощности, потому что каждая ячейка обычно требует чтения, записи и стирания, в то время как для стирания Flash схемы памяти используются большие блоки ячеек.
Новые технологии энергонезависимой памяти, такие как в FeRAM и MRAM медленно заменяют EEPROM в некоторых устройствах, но, как ожидается, останется небольшая доля рынка для EEPROM в обозримом будущем.
Сравнение EPROM, EEPROM и Flash
Главными отличиями данных типов памяти являются: программирование и стирание данных с устройства. EEPROM может быть запрограммирован, а данные устройства удалены с помощью автоэлектронной эмиссии.
EPROM же, напротив, использует инжекцию горячих носителей [Источник 6] на плавающем затворе. Стирание осуществляется с помощью ультрафиолетового источника света, хотя на практике многие чипы упакованы в пластик, который является непроницаемым для ультрафиолета, делая их «однократно программируемыми».
Большинство устройств с Flash памятью представляет собой гибрид программирования с помощью инжекции горячих носителей и стирания с помощью автоэлектронной эмиссии.
AVR Урок 15. Внутренняя энергонезависимая память EEPROM. Часть 1
Урок 15
Внутренняя энергонезависимая память EEPROM
Я думаю, может не все, но очень многие знают, что в контроллерах AVR помимо основной оперативной памяти, а также памяти для хранения прошивки существует ещё и энергонезависимая память типа EEPROM. Данная память сделана по технологии электрического стирания информации, что в отличие от её предшественника EPROM, в котором стирание производилось только при помощи ультрафиолетовых лучей, позволило использовать данный тип памяти практически повсеместно. Как мы знаем, ещё существует энергонезависимая память типа Flesh, которая стоит намного дешевле, но у которой также есть существенный минус. Там невозможно стереть отдельный байт, стирание производится только блоками, что не совсем удобно в некоторых случаях, особенно когда информации требуется хранить немного, и информация данная представляет собой небольшие настроечные параметры. Поэтому нам стоит также остановиться на данном типе памяти. И причем не только из-за того, что он присутствует в контроллере, а из-за того, что это очень удобно для хранения некоторых величин, которые нужны нам будут даже после того, как контроллер потерял питание.
Так как мы работаем с контроллером Atmega8A, техническую документацию данного МК мы и откроем и увидим там, что всего такой памяти у нас 512 байт. Это тем не менее не так мало. Если мы, например будем какой-нибудь будильник программировать, чтобы данные установки не потерялись после отключения питания, мы вполне можем с вами обратиться к данной памяти. Также в документации написано, что данная память гарантированно переживёт 100000 циклов записи/считывания.
Теперь напрашивается вопрос. Как же организован процесс работы с данной памятью в микроконтроллере AVR? Как всегда, компания Atmel об этом позаботилась и организовала данный процесс на аппаратном уровне, что очень радует потому, что нам постоянно приходится беречь ресурсы контроллера. Для управления данным аппаратным уровнем существуют определенные регистры.
Один из них – регистровая пара EEAR. Почему пара, а потому что 512 адресов не влезут в 8 бит, требуется ещё один
Как именно мы будем адресоваться, мы увидим в процессе программирования EEPROM.
Следующий – регистр данных EADR
В данный регистр мы будем записывать данные для того чтобы записать их в определённый адрес памяти EEPROM, а также чтобы считать их из определённого адреса той же самой памяти.
Ну и как водится, практически ни одна периферия и технология, организованная на аппаратном уровне, не обходится без управляющего регистра. У нас управляющим регистром является регистр EECR
Давайте сразу немного познакомимся с битами данного регистра.
Бит EERE – бит, заставляющий начать процесс чтения из памяти EEPROM. И, как только данные считались и записались в регистр данных, этот бит сбросится. Поэтому мы можем считать даннй бит не только управляющим, но и статусным или битом состояния.
Бит EEWE – бит, установка которого даёт команду контроллеру записать данные из регистра данных в определенный адрес EEPROM. После завершения процедуры записи, данный бит также сбрасывается самостоятельно.
Бит EEMWE – бит, разрешающий (не начинающий) процесс записи.
Бит EERIE – бит, разрешающий прерывания.
Память данных EEPROM
ATtiny13A содержит 64 байта памяти данных EEPROM. Эта память организована как отдельное пространство данных, в котором отдельные байты могут быть прочитаны и записаны. EEPROM имеет выносливость по крайней мере 100 000 циклов записи/стирания. Обмен данными между EEPROM и процессором описан далее, и основан на использовании Регистров Адреса EEPROM (EEPROM Address Registers), Регистра Данных EEPROM (EEPROM Data Register) и Регистра Управления EEPROM (EEPROM Control Register). Подробное описания последовательной загрузки данных в EEPROM описано в документации (в оригинале это страница 106, на моём сайте будет опубликовано позже).
Процессор микроконтроллера обращается к EEPROM не так, как к остальным видам памяти, потому что для него не существует адресного пространства EEPROM. Поэтому используются упомянутые выше регистры ввода-вывода:
Если объём EEPROM превышает 256 байт (вообще в AVR эта память может иметь объём до 8 КБ в зависимости от модели МК), то вместо одного регистра адреса EEAR микроконтроллер имеет два регистра: EEARH и EEARL. Регистры доступа к EEPROM имеют следующие номера:
Как видите, регистры EEAR и EEARL имеют одинаковые номера. То есть в микроконтроллере, где объём EEPROM меньше 256 байт (в таком, как ATtiny13A), можно использовать только EEAR (он же EEARL).
Регистр EEDR работает как на запись, так и на чтение. При записи через этот регистр в EEPROM поступает записываемый байт. При чтениии через этот регистр микроконтроллер получает байт из EEPROM.
Регистр управления EECR устанавливает режим работы. Через него подаются команды чтения и записи EEPROM. Установка 0-го бита начинает чтение из EEPROM. Установка 1-го бита начинает запись в EEPROM. Для управляющих битов имеются соответствующие константы (биты регистра EECR будут описаны позже в других статьях, в оригинальной документации см. стр. 21).
Чтение и запись EEPROM
Регистры Адреса EEPROM (EEPROM Access Registers) доступны через область ввода-вывода.
Время доступа для записи в EEPROM приведено в таблице 5.1. Функция самоуправления временем, однако, позволяет программному обеспечению пользователя определить, когда можно записать следующий байт. Если код пользователя содержит инструкции по записи EEPROM, необходимо принять некоторые меры предосторожности. В источниках питания с мощными фильтрами, питание VCC при включении/выключении медленно повышается (понижается). По этой причине микроконтроллер в течение некоторого времени запускается на более низком напряжении, чем допустимо для используемой тактовой частоты. Дополнительные сведения о том, как избежать сложностей в таких случаях, см. ниже в разделе “Предотвращение повреждения EEPROM”.
Таблица 5.1. Биты режимов EEPROM.
EECR | Время программирования | Операция | |
EEPM1 | EEPM0 | ||
0 | 0 | 3,4 мс | Стирание и запись за одну операцию (Атомарная операция) |
0 | 1 | 1,8 мс | Только стирание |
1 | 0 | 1,8 мс | Только запись |
1 | 1 | — | Зарезервировано для будущего использования |
Чтобы предотвратить непреднамеренную запись EEPROM, необходимо выполнить определенные правила записи. Подробности см. ниже в разделах “Атомарное программирование байта” и “Раздельное программирование байта”.
Когда выполняется чтение EEPROM, работа процессора приостанавливается на четыре такта, прежде чем следующая инструкция может быть выполнена. При записи EEPROM процессор останавливается на два такта перед выполнением следующей инструкции. То есть на время чтения/записи EEPROM процессор перестаёт выполнять команды и никакие другие инструкции не могут быть выполнены.
Атомарное программирование байта (Atomic Byte Programming)
Операция в общей области памяти называется атомарной, если она завершается в один шаг (не путать с тактом!) относительно других потоков (процессов), имеющих доступ к этой памяти. Во время выполнения такой операции над переменной, ни один поток не может наблюдать изменение наполовину завершенным. То есть пока атомарное обращение к памяти не будет завершено, доступ к этой памяти из другой операции невозможен. Атомарная загрузка гарантирует, что переменная будет загружена целиком в один момент времени.
Неатомарные операции не дают такой гарантии (то есть при неатомарных операциях возможен одновременный доступ к памяти из нескольких потоков, что может привести к непредсказуемым результатам).
И стирание, и запись выполняются за одну операцию (полное время программирования показано в таблица 5-1 выше). Бит EEPE остается установленным до завершения операций стирания и записи. Пока микроконтроллер занят программированием, невозможно выполнять какие-либо другие операции с EEPROM.
Раздельное программирование байта (Split Byte Programming)
Можно разделить операции стирания и записи байта на две различных операции. Это может быть полезно, если системе требуется короткое время доступа в течение некоторого ограниченного периода времени (обычно при падении напряжения питания). Чтобы воспользоваться преимуществами этого способа, необходимо, чтобы записываемые ячейки памяти были очищены (стёрты) перед операцией записи. Но поскольку операции стирания и записи разделены, можно выполнять операции стирания, когда система позволяет выполнять критические по времени операции (обычно после включения питания).
Стирание EEPROM
Для того, чтобы стереть байт, его адрес необходимо записать в регистр EEARL. Если биты EEPMn равны 0b01, то запись EEPE (в течение четырех тактов после записи EEMPE) вызовет только операцию стирания (время программирования указано выше в таблице 5-1). Бит EEPE остается установленным до завершения операции стирания. Пока микроконтроллер занят программированием, невозможно выполнить какие-либо другие операции с EEPROM.
Запись EEPROM
Калибровка генератора тактовой частоты с помощью регистра калибровки (Oscillator Calibration Register) используется для настройки времени доступа к EEPROM. Убедитесь, что частота генератора соответствует требованиям, описанным в разделе “OSCCAL – Oscillator Calibration Register » (в оригинальной документации стр. 27, на моём сайте будет описана позже).
В следующих примерах кода показана одна функция на Ассемблере и C для стирания, записи или атомарной записи EEPROM. В примерах предполагается, что прерывания управляются (например, отключением прерываний глобально) таким образом, что во время выполнения этих функций прерывания не будут происходить.
В следующих примерах кода показаны функции на Ассемблере и C для чтения EEPROM. В примерах предполагается, что прерывания управляются таким образом, чтобы во время выполнения этих функций не возникало прерываний.
Предотвращение повреждения EEPROM
Если напряжение питания VCC слишком низкое (например, во время включения питания), данные в EEPROM можно повредить, потому что нарастание напряжения может оказаться слишком медленным для процессора и EEPROM, что не позволит им работать правильно. Эти вопросы такие же, как для систем, использующих память EEPROM, и должны быть применены такие же проектные решения.
Повреждение данных EEPROM может быть вызвано двумя ситуациями, когда напряжение слишком низкое. Во-первых, последовательная запись в EEPROM требует определённого напряжения для правильной работы. Во-вторых, сам процессор может неправильно выполнять инструкции, если напряжение питания слишком низкое.
Повреждения данных EEPROM можно легко избежать, следуя этому совету по проектированию:
Поддерживайте активный (низкий) сброс AVR во время недостаточного напряжения питания. Это можно сделать, включив внутренний детектор (Brown-out Detector (BOD)). Если уровень напряжения BOD не соответствует необходимому уровню напряжения, то можно использовать внешнюю цепь сброса, поддерживающую низкий уровень на выводе сброса и предохраняющую EEPROM от порчи. Если сброс происходит во время выполнения операции записи, операция записи будет завершена при условии, что напряжение питания достаточно.
PIC Урок 11. Внутренняя энергонезависимая память EEPROM. Часть 1
Очень многие знают, что в контроллерах PIC помимо основной оперативной памяти, а также памяти для хранения прошивки существует ещё и энергонезависимая память типа EEPROM.
Данная память сделана по технологии электрического стирания информации, что в отличие от её предшественника EPROM, в котором стирание производилось только при помощи ультрафиолетовых лучей, позволило использовать данный тип памяти практически повсеместно. Как мы знаем, ещё существует энергонезависимая память типа Flash, которая стоит намного дешевле, но у которой также есть существенный минус. Там невозможно стереть отдельный байт, стирание производится только блоками, что не совсем удобно в некоторых случаях, особенно когда информации требуется хранить немного, и информация данная представляет собой небольшие настроечные параметры. Поэтому нам стоит также остановиться на данном типе памяти. И причем не только из-за того, что он присутствует в контроллере, а из-за того, что это очень удобно для хранения некоторых величин, которые нужны нам будут даже после того, как контроллер потерял питание.
По идее, с данной памятью мы должны были познакомиться в более ранних занятиях, так как в технической документации на наши микроконтроллеры она находится в одной из первых частей, но мне хотелось для лучшего понимания и запоминания материала показать работу с EEPROM как-то наглядно. Мы подключали с вами четырёхразрядный индикатор, но четырёх разрядов для полноценного показа работы с энергонезависимой памятью, я думаю, мягко говоря, недостаточно, но после прошлого занятия, в котором мы изучили работу с 80-символьным дисплеем LCD, мы можем вполне оценить работу с памятью EEPROM.
Работать мы также будем с контроллером PIC16F877A, расположенном на удобной отладочной плате. Судя по технической документации на данный микроконтроллер, памяти EEPROM у него 256 байт. Этого вроде бы по нынешним меркам не так много, но вполне достаточно, чтобы хранить какую-то информацию, которая должна у нас остаться после отключения питания.
Теперь давайте познакомимся со спецификой работы данной памяти у нашего контроллера, а также с регистрами, используемыми для этого.
Существуют два регистра для записи и чтения памяти EEPROM. Это регистр, в котором хранятся данные, – EEDATA, а также регистр, в который мы посылаем адрес перед записью или чтения определённого байта, – EEADR. Также существует регистр управления EECON1, в котором находятся определённые биты настройки работы с памятью EEPROM, а также есть нефизический регистр EECON2, который мы используем для защиты от случайной записи данной памяти.
Также с помощью определённых конфигурационных битов мы можем защитить память EEPROM от стирания и перезаписи программатором.
Теперь немного подробнее про регистр управления EECON1
Теперь о назначении определённых битов данного регистра.
EEPGD – бит доступа к памяти (относится к памяти Flash)
1 – доступ к памяти для программы,
0 – доступ к памяти для данных.
WRERR (EEPROM Error Flag bit) — флаг ошибки записи данных в память EEPROM
1 – операция записи данных прервана (случился сброс либо по сигналу MCLR, либо по переполнению WDT в нормальном режиме),
0 – операция записи данных завершена.
WREN (EEPROM Write Enable bit) – бит разрешения записи данных в память EEPROM
1 – запись данных разрешена,
0 – запись данных запрещена.
WR (Write Control bit) – включение (инициализация) записи данных в память EEPROM
1 – инициализация цикла записи памяти EEPROM. Включается программно,
0 – цикл записи EEPROM закончен. Установка в 0 (сброс) осуществляется только аппаратным путём. Программно данный флаг сбросить невозможно.
RD (Read Control bit) – включение (инициализация) чтение данных из памяти EEPROM.
1 – инициализация цикла чтения памяти EEPROM. Включается программно,
0 – цикл чтения EEPROM закончен. Установка в 0 (сброс) осуществляется только аппаратным путём. Программно данный флаг сбросить также невозможно.
Чтение байта из памяти EEPROM производится следующим образом.
Первым делом мы должны удостовериться, что биты RD и WR регистра EECON1 у нас сброшены, то есть у нас в данный момент все циклы записи/чтения памяти EEPROM завершены. Затем мы записываем в регистр EEADR адрес считываемого байта, затем устанавливаем в 1 бит RD регистра EECON1 и считываем значение регистра EEDATA.
А вот запись байта в память EEPROM в целях безопасности происходит несколько посложнее.
Сначала мы также убеждаемся в сброшенном бите WR, затем разрешаем запись с помощью установки бита WREN регистра EECON1. Затем желательно запретить прерывания с помощью сброса бита GIE регистра INTCON, перед этим сохранив его значение, а то вдруг он уже был сброшен. А вот теперь мы делаем интересную вещь. Мы последовательно передаём байты 0x55 и 0xAA в регистр ЕЕСОN2. И только после этого мы пишем данные в память EEPROM, устанавливая бит инициализации записи WR. Затем мы возвращаем значение бита GIE в регистр INTCON, разрешив тем самым глобальные прерывания, если они до этого были разрешены. Потом мы сбрасываем бит WREN.
Чтобы нам теперь данную теорию понять и закрепить, мы должны отработать это на практике.
Поэтому создадим проект с именем EEPROM_LCD на основе проекта прошлого занятия LCD2004_8BIT.
Подключим нашу схему вместе с программатором и дисплеем, блок питания пока в целях безопасности не подключаем.
Откроем данный проект в MPLAB X, зайдём в его настройки и убедимся, что у нас схема не будет питаться от программатора и сохраним настройки проекта.
Теперь мы можем смело подключить блок питания, также попытаться собрать наш проект и прошить его в контроллер. Работоспособность нашего кода мы поймём по появившимся строкам на дисплее
Создадим каркас нашей будущей библиотеки для работы с памятью EEPROM с помощью двух файлов EEPROM.h и EEPROM.c следующего стандартного содержания
EEPROM.h:
EEPROM.c:
#include «EEPROM.h»
Также нашу библиотеку, а заодно и строковую, подключим в файле main.h
#include «EEPROM.h»
#include
Вернёмся в файл EEPROM.c и напишем функцию записи байта в память EEPROM по определённому адресу, руководствуясь объяснению, как это делается, написанному выше. Заодно сразу добавим и функцию чтения байта по определённому адресу
void EEPROM_WriteByte ( unsigned char addr, unsigned char dt)
unsigned char status;
while (WR);
EEADR = addr;
EEDATA = dt;
WREN= 1 ;
status = GIE;
GIE = 0 ;
EECON2 = 0x55 ;
EECON2 = 0xAA ;
WR= 1 ;
GIE = status;
WREN= 0 ;
unsigned char EEPROM_ReadByte( unsigned char addr)
while (RD || WR);
EEADR=addr;
RD = 1 ;
return EEDATA;
Также нам будет интересно писать и читать данные других типов.
Добавим функции записи и чтения двухбайтовой целочисленной беззнаковой величины в память EEPROM и из неё
void EEPROM_WriteWord( unsigned char addr, unsigned int ucData)
EEPROM_WriteByte(addr, ( unsigned char ) ucData);
unsigned char dt = ucData>> 8 ;
unsigned int EEPROM_ReadWord( unsigned char addr)
unsigned int dt = EEPROM_ReadByte(addr +1 )* 256 ;
dt += EEPROM_ReadByte(addr);
return dt;
Здесь у нас всё ещё проще. Мы читаем и пишем раздельно старший и младший байты, пользуясь уже добавленными функциями чтения и записи байтов.
Теперь добавим ещё функции записи и чтения четырёхбайтовых величин (двойных слов)
void EEPROM_WriteDword( unsigned char addr, unsigned long ucData)
EEPROM_WriteWord(addr, ( unsigned int ) ucData);
unsigned int dt = ucData>> 16 ;
unsigned long EEPROM_ReadDword( unsigned char addr)
unsigned long dt = EEPROM_ReadWord(addr +2 )* 65536 ;
dt += EEPROM_ReadWord(addr);
return dt;
Функции написаны в аналогичном стиле, только внутри используются функции записи и считывания двухбайтовых величин.
Теперь давайте запишем строку символов по определённому адресу
void EEPROM_WriteString( unsigned char addr, char * str1)
unsigned char n;
for (n= 0 ;str1[n]!= ‘\0’ ;n++)
EEPROM_WriteByte(addr+n,str1[n]);
Здесь также всё элементарно. Мы, инкрементируя адрес, постепенно записываем наши байты. И так до встречи с нулём.
Функцию чтения строки по определённому адресу нас написать также не затруднит
void EEPROM_ReadString( unsigned char addr, char * str1, unsigned char sz)
unsigned char i;
for (i= 0 ;i
str1[i] = 0 ;
В данной функции мы используем ещё один входящий аргумент – это величина считываемой строки. Можно было также и читать строку до встречи с нулём, но этого я делать не стал, так как вдруг этого нуля мы там не обнаружим, и тогда мы рискуем записать данные в оперативную память за пределы нашего строкового массива, что не очень будет приятно. Поэтому будем считать, что мы знаем длину считываемой строки.
Если есть желание, то вы можете написать функцию именно для считывания строки неизвестной длины, но только знайте, что она там должна обязательно существовать.
Перейдём в файл EEPROM.h и добавим прототипы наших функций
void EEPROM_WriteByte( unsigned char addr, unsigned char dt);
unsigned char EEPROM_ReadByte( unsigned char addr);
void EEPROM_WriteWord( unsigned char addr, unsigned int ucData);
unsigned int EEPROM_ReadWord( unsigned char addr);
void EEPROM_WriteDword( unsigned char addr, unsigned long ucData);
unsigned long EEPROM_ReadDword( unsigned char addr);
void EEPROM_WriteString( unsigned char addr, char * str1);
void EEPROM_ReadString( unsigned char addr, char * str1, unsigned char sz);
В следующей части урока мы проверим работу библиотеки для памяти EEPROM на практике, записав в EEPROM различные типы данных (в том числе строковый массив), а также затем отобразив его на дисплее. Также мы научимся настраивать среду программирования так, чтобы память EEPROM при перепрошивке микроконтроллера не стиралась.
Купить программатор (неоригинальный) можно здесь: PICKit3
Купить программатор (оригинальный) можно здесь: PICKit3 original
Отладочную плату PIC Open18F4520-16F877A можно приобрести здесь: PIC Open18F4520-16F877A
Дисплей LCD 20×4 можно приобрести тут: Дисплей LCD 20×4
Смотреть ВИДЕОУРОК (нажмите на картинку)