Главная » Статьи » Программирование » Программирование в BascomAVR

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

   Приведу пример использование лишь не которых команд. На мой взгляд самые простые. 
Code
Dim A As Byte
Dim Aa Eram As Byte

A=Aa

writeeeprom A, Aa 'сохраняем переменную A в энергонезависимую память мк Aa
readeeprom A, Aa 'считываем  переменную A из энергонезависимой памяти мк A

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

Code
A = Aa

присваиваем значение Aa из EEPROM переменной A.

Code
Aa = A

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

Code
Aa = Aa +1

   Как мы будем использовать eeprom? Допустим нужно нам сохранить какие-нибудь настройки в программе(даже если нет питание они должны остаться в памяти мк), которые изменяться будут очень редко, вот здесь та мы и воспользуемся eeprom. Как писалось выше эта память не зависит от питания. Стирается она только при программирование мк заново или при принудительном стирание. Этим она и хороша. Возьмём программу из статьи DS18B20. Не много переделаем её. Добавим переменные и процедуры:

Code

'****************************Задаём перемнные***********************************


Dim Signtemperatura As String * 1 , Celsium As String * 5 , Fahrenhei As String * 5

Dim Byte0 As Byte , Byte1 As Byte , T As Byte , X As Byte , Aa As Byte

Dim Temp As Byte , Temp1 As Byte , Temp2 As Byte

Dim Faren As Byte , Faren0 As Single

Dim A As Integer , B As Integer


'****************************Переменные Eeprom**********************************

Dim Ae As Eram Integer , Be As Eram Integer

A = Ae

B = Be


'***************************Назначаем процедуры*********************************

Declare Sub МенюП

Declare Sub Ввод_данных

Declare Sub Вверх_вниз_ввод

Declare Sub Температура

Declare Sub ТС                                              'Температура срабатывания

Далее, нам потребуется что-то вроде меню  для выбора температуры... Например при 29 будет выводится надпись Tem11, а при 27 Tem22.  

Code

Sub Ввод_данных()


   Cls

   Aa = 0

   X = A

   Do

   If X > 35 Then X = 0                                     'диапозон выбираемых значений от 35 до 0

   If X < 0 Then X = 35                                     'диапозон выбираемых значений от 0 до 35

   Locate 1 , 1

   Lcd "[>BГІop їeјѕ.<]"

   Locate 2 , 1

   Lcd "Teјѕ. іє».: " ; X

   Вверх_вниз_ввод

   Temp1 = X

   Loop Until Aa = 1

   A = Temp1


   Cls

   Aa = 0

   X = B

   Do

   If X > 35 Then X = 0                                     'диапозон выбираемых значений от 35 до 0

   If X < 0 Then X = 35                                     'диапозон выбираемых значений от 0 до 35

   Locate 1 , 1

   Lcd "[>BГІop їeјѕ.<]"

   Locate 2 , 1

   Lcd "Teјѕ. іГє».: " ; X ; "  "

   Вверх_вниз_ввод

   Temp2 = X

   Loop Until Aa = 1

   B = Temp2


   Gosub Сохраение_данных                                   'по завершению ввода данных сохраняем их в eeprom


End Sub

Sub Вверх_вниз_ввод()

   Waitms 300

   If Вверх = 0 Then Incr X                                 'увеливаем на единицу переменную Х при нажатие кнопки

   If Вниз = 0 Then Decr X                                  'уменьшаем на единицу переменную Х при нажатие кнопки

   If Ввод = 0 Then : Aa = 1 : Else : : Aa = 0 : End If     'переустанавливаем переменную при нажатие клавиши

End Sub


'*******************************************************************************

Sub МенюП()

Aa = 0

X = 0

Вверх_вниз_ввод

Ввод_данных

Cls

End Sub

И последний "штрих". Для того чтобы всем добром этим управлять надо 4 клавиши. Клавиши вызова меню, клавиша ввода и клавиши вверх, вниз.

Code
'***********************************Порты***************************************
Set Porta.1 : Вниз Alias Pina.1                             'Вниз
Set Porta.2 : Вверх Alias Pina.2                            'Вверх
Set Porta.0 : Меню Alias Pina.0                             'Меню
Set Porta.3 : Ввод Alias Pina.3                             'Ввод

И в результате получаем вот такой код:

Code
'*******************************************************************************
' Автор: Кирилл (Space)
' Сайт: www.enore.ucoz.ru
' CPU:  ATmega16
' Тактовая частота:  16000000  Hz
' Компилятор: BASCOM-AVR 1.11.9.0
'*******************************************************************************
' Программируемые Fuse:
' SUT0
' BOOTSZ0, BOOTSZ1
' CKORT
' SPIEN
'*******************************************************************************

'***************************Тип_микроконтроллера********************************
$regfile = "m16def.dat"
$crystal = 16000000

'************************Дополнительные библиотеки******************************
$lib "lcd4.lbx"                                             'используем 4-битное подключение дисплея с помощью альтернативной библиотеки

'***********************************Порты***************************************
Set Porta.1 : Вниз Alias Pina.1                             'Вниз
Set Porta.2 : Вверх Alias Pina.2                            'Вверх
Set Porta.0 : Меню Alias Pina.0                             'Меню
Set Porta.3 : Ввод Alias Pina.3                             'Ввод

Config 1wire = Portd.0                                      'Пин, на который повешан DS18B20

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7
Config Lcd = 20 * 4                                         'используем дисплей на 20 символ и 4 строки


'****************************Задаём перемнные***********************************

Dim Signtemperatura As String * 1 , Celsium As String * 5 , Fahrenhei As String * 5
Dim Byte0 As Byte , Byte1 As Byte , T As Byte , X As Byte , Aa As Byte
Dim Temp As Byte , Temp1 As Byte , Temp2 As Byte
Dim Faren As Byte , Faren0 As Single
Dim A As Integer , B As Integer

'****************************Переменные Eeprom**********************************
Dim Ae As Eram Integer , Be As Eram Integer
A = Ae
B = Be

'***************************Назначаем процедуры*********************************
Declare Sub МенюП
Declare Sub Ввод_данных
Declare Sub Вверх_вниз_ввод
Declare Sub Температура
Declare Sub ТС                                              'Температура срабатывания

'*************************Основной цикл программы*******************************

Cursor Off                                                  'отключаем курсор
Cls                                                         'очищаем экран дисплея

Do
Call Температура : Call ТС

Locate 1 , 1
Lcd "Ёo бe»ДcёЖ******" ; Celsium                            'выводим результат преобразвания Celsium
Locate 2 , 1
Lcd "Ёo ЄapeЅґe№їy***" ; Fahrenhei                          'выводим результат преобразвания Fahrenhei

If Меню = 0 Then : Gosub МенюП : End If                     'При нажатие клавиши осущевстляется переход на метку МенюП
Loop
End

Сохраение_данных:
Writeeeprom A , Ae                                          ' сохраняем переменную A в энергонезависимую память мк
Writeeeprom B , Be                                          ' сохраняем переменную B в энергонезависимую память мк
Return

'*******************************************************************************

Sub Температура                                             'процедура Температура
1wreset
1wwrite &HCC                                                ' Выдаем команду чтения ПЗУ
1wwrite &H44                                                ' Запуск измерения
Waitms 750                                                  ' Ждем окончания преобразования
1wreset
1wwrite &HCC
1wwrite &HBE                                                ' Команда чтения ОЗУ датчика
Byte0 = 1wread()                                            ' Читаем нулевой байт
Byte1 = 1wread()                                            ' Читаем первый байт
If Byte1 >= 248 Then                                        ' Проверяем на отрицательную температуру.248 в десятичном - 11111000 в двоичном. Если температура отрицательная - вычитаем из &HFF
Byte0 = &HFF - Byte0
Byte1 = &HFF - Byte1
Signtemperatura = "-"
Else
Signtemperatura = "+"
End If
Temp = Byte0 / 16                                           ' Сдвигаем нулевой байт вправо на 4 бита (2*2*2*2=16)
T = Byte1 * 16                                              ' Сдвигаем первый байт влево на 4 бита (2*2*2*2=16)
Temp = Temp + T                                             ' Формирмируем результам и выдаем его на индикатор. Команда LCD сама преобразует его в десятичный вид
Faren0 = Temp * 1.8
Faren = Faren0 + 32
Celsium = Signtemperatura + Str(temp) + "C"
Fahrenhei = Signtemperatura + Str(faren) + "F "
End Sub

Sub ТС

Temp1 = A
Temp2 = B

If Temp => Temp1 Then
  Locate 3 , 1
  Lcd "Tem11"
 End If

If Temp <= Temp2 Then
  Locate 3 , 1
  Lcd "Tem22"
 End If

End Sub

Sub Ввод_данных()

   Cls
   Aa = 0
   X = A
   Do
   If X > 35 Then X = 0                                     'диапозон выбираемых значений от 35 до 0
   If X < 0 Then X = 35                                     'диапозон выбираемых значений от 0 до 35
   Locate 1 , 1
   Lcd "[>BГІop їeјѕ.<]"
   Locate 2 , 1
   Lcd "Teјѕ. іє».: " ; X
   Вверх_вниз_ввод
   Temp1 = X
   Loop Until Aa = 1
   A = Temp1

   Cls
   Aa = 0
   X = B
   Do
   If X > 35 Then X = 0                                     'диапозон выбираемых значений от 35 до 0
   If X < 0 Then X = 35                                     'диапозон выбираемых значений от 0 до 35
   Locate 1 , 1
   Lcd "[>BГІop їeјѕ.<]"
   Locate 2 , 1
   Lcd "Teјѕ. іГє».: " ; X ; "  "
   Вверх_вниз_ввод
   Temp2 = X
   Loop Until Aa = 1
   B = Temp2

   Gosub Сохраение_данных                                   'по завершению ввода данных сохраняем их в eeprom

End Sub

'*******************************************************************************

Sub Вверх_вниз_ввод()
   Waitms 300
   If Вверх = 0 Then Incr X                                 'увеливаем на единицу переменную Х при нажатие кнопки
   If Вниз = 0 Then Decr X                                  'уменьшаем на единицу переменную Х при нажатие кнопки
   If Ввод = 0 Then : Aa = 1 : Else : : Aa = 0 : End If     'переустанавливаем переменную при нажатие клавиши
End Sub

'*******************************************************************************
Sub МенюП()
Aa = 0
X = 0
Вверх_вниз_ввод
Ввод_данных
Cls
End Sub

'*******************************************************************************

Так выглядит меню:

И так работает при определённых температурах. При разогреве до 29 выводим на 3 строчке надпись Tem11, как только температура будет равна 27 или меньше 27 будет надпись Tem22.


Исходник и прошивку можно скачать здесь.







Источник: http://enore.ucoz.ru
Категория: Программирование в BascomAVR | Добавил: Space (17.04.2011) | Автор: Space E W
Просмотров: 1487 | Теги: eeprom, eeprom atmega16, как работать с eeprom, eeprom avr, eeprom мк, как пользоваться eepom, eeprom bascomavr, avr, работа с eeprom
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]