11. Работа с EEPROM



Автор: WildCat

EEPROM - встроенная энергонезависимая память (Flash-память) микроконтроллера. В AT90S2313 доступно 128 байт EEPROM. В более крупных МК доступны большие объемы. EEPROM обычно используется для хранения данных, которые редко изменяются. Вы можете использовать его для хранения калибровочных данных, которые используются при расчетах. EEPROM не стоит использовать в качестве оперативной памяти из-за небольшого лимита циклов перезаписи (читаем даташит!). Читать и записывать данные в EEPROM можно с помощью соответствующих команд Readeeprom и Writeeeprom. Но перед их использованием нужно особым образом разместить данные в энергонезависимой памяти. Это можно сделать двумя способами. Первый - использовать $eeprom:

...
Dim ADCcal as Byte
...
$eeprom
ADCcal1:
Data &H34
$data
...
Readeeprom, ADCcal, ADCcal1
...

Строку $eeprom необходимо разместить в программе перед тем местом, в котором происходит обращение к константам в памяти. Эта команда заставляет переключаться BASCOM с работы с блоками данных Data на блоки Eeprom. Команда $data выполняет обратное действие. Лучше всего разместить строку $eeprom перед строкой Data.
Вот пример работы с EEPROM в BASCOM:
eeprom0.bas

$regfile = "2313def.dat"
$crystal = 4000000

Config Pind.6 = Output
Config Pind.2 = Input
Config Int0 = Falling

Dim Wtime As Byte
Dim Addval As Integer
Const Debouncetime = 75
Dim Buttoncounter As Integer

$eeprom
Buttoncounterdefault:
Data 17%
$data

Readeeprom Buttoncounter , Buttoncounterdefault
Cls
Lcd "Def.Ctr.: " ; Buttoncounter
Addval = 1

On Int0 Button

Wtime = 255

Enable Interrupts
Enable Int0

Do
  Set Portd.6
  Waitms Wtime
  Reset Portd.6
  Waitms Wtime
  Buttoncounter = Buttoncounter + Addval
  Cls
  Lcd "Btn.Ctr: " ; Buttoncounter
Loop

Button:
  Writeeeprom Buttoncounter , Buttoncounterdefault
  Gifr = 64
  Lowerline
  Lcd "to eeprom"
  Wait 3
  Addval = 0
Return

End

При запуске программа считывает значение Buttoncounterdefault из EEPROM. Затем она начинает счет с этого значения. При нажатии кнопки подпрограмма прерывания записывает значение Buttoncounter в EEPROM. После перезапуска контроллера значение снова считывается, и счет начинается с нового значения.

Второй метод работы с EEPROM - через оператор Dim:

...
Dim ADCcal as Byte
Dim ADCcal1 As Eram Byte
...

Здесь переменная ADCcal объявлена как переменная типа byte в ERAM (EEPROM). В принципе, это не настоящая переменная. Все, что мы можем сделать:

ADCcal = ADCcal1

присваиваем значение ADCcal1 из EEPROM переменной ADCcal.

ADCcal1 = ADCcal

помещаем значение переменной ADCcal в EEPROM, в область, зарезервированную под хранение значения ADCcal1.
Вы не можете сделать, например, так:

ADCcal1 = ADCcal1 +1

Предыдущий пример будет выглядеть примерно так:
eeprom0a.bas

$regfile = "2313def.dat"
$crystal = 4000000

Config Pind.6 = Output
Config Pind.2 = Input
Config Int0 = Falling

Dim Wtime As Byte
Dim Addval As Integer
Const Debouncetime = 75
Dim Buttoncounter As Integer
Dim Bc As Eram Integer

Buttoncounter = Bc
Cls
Lcd "Def.Ctr.: " ; Buttoncounter
Addval = 1

On Int0 Button

Wtime = 255

Enable Interrupts
Enable Int0

Do
  Set Portd.6
  Waitms Wtime
  Reset Portd.6
  Waitms Wtime
  Buttoncounter = Buttoncounter + Addval
  Cls
  Lcd "Btn.Ctr: " ; Buttoncounter
Loop

Button:
  Bc = Buttoncounter
  Gifr = 64
  Lowerline
  Lcd "to eeprom"
  Wait 3
  Addval = 0
Return

End

Если данные в EEPROM размещались при помощи команды $eeprom, то BASCOM создаст отдельный .eep файл. Поэтому компилирование текущего проекта даст два выходных файла (.bin и .eep). Сначала запрограммируйте МК как обычно, загрузив в него .bin файл. Затем вручную запустите TWinavr, нажмите WRITE, выберите "EEPROM files" в списке типов файлов и откройте eeprom0.eep. На этот раз TWinavr запрограммирует энергонезависимую память.

Для работы с EEPROM годятся оба метода, но предпочтение можно отдать первому, потому что при использовании значений в EEPROM по умолчанию гораздо удобнее отдельно запрограммировать зону этой памяти.



DECADALAB ALFA