Главная » Статьи » Программирование » Программирование в BascomAVR |
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) | | |
Просмотров: 1565 | |
Всего комментариев: 0 | |