Автор: 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 по умолчанию гораздо удобнее отдельно запрограммировать зону этой памяти.