Статья №3
В заключении, говоря о таймерах, рассмотрим случай прерывания по совпадению. У Timer1 существует регистры сравнения CompareA и CompareB. В один из этих регистров можно положить какое – либо конкретное значение, и когда Timer1 сравняется сравняется со значением CompareA (B), предписанное действие даст результат на выводе OC1A – PB3 (OC1B – PB4) микроконтроллера ATtiny2313.
Cконфигурируем для данного случая таймер следующим образом:
Config Timer1 = Timer, Prescale = 1|8|64|256|1024, Compare A = Clear|Set|Toggle|Disconnect, Clear Timer = 0|1.
Здесь, как уже было отмечено в предыдущих статьях, Prescale – оператор с помощью которого устанавливается коэффициент деления частоты тактового генератора. Действием может быть:
- сбросить ОС1 (Clear)
- установить ОС1 (Set)
- переключить ОС1 (Toggle)
- отключить ОС1 (Disconnet).
С помощью Clear Timer можно очистить Timer1 (=1), когда произойдёт прерывание Compare A. Блок – схема программы “COMP” приведена на Рис.1.
Программа состоит из основного цикла, в котором происходит включение и отключение светодиода PORTD6. Когда счёт Timer1 совпадёт со значением, записанным в Compare A, произойдёт прерывание, в процессе обработки которого включится ОС1А (РВ3), и выполнение программы остановится. Теперь, чтобы запустить программу снова, необходимо сбросить микроконтроллер. Программа “TIMER-STOP” приведена ниже.
$Regfile = "attiny2313a.dat" 'настройки
$Crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
config PIND.6 = output 'конфигурирование портов
config PIND.3 = output
config PORTB.3 = 0
config Timer1 = Timer , Prescale = 1024 , COMPARE A = SET , Clear Timer = 1 'конфигурирование таймера
dim Wtime as Byte 'объявление переменных
dim Endtime as Word
On OC1A Compa 'подпрограмма обраб. прерываний
Endtime = 39063
COMPARE A = Endtime 'задание предела счёта таймера
Enable INTERRUPTS 'разрешение прерываний
Enable OC1A
Do ' цикл включения и отключения светодиода
Waitms Wtime
Set PORTD.6
Waitms Wtime
Reset PORTD.6
Waitms Wtime
Loop
Compa: 'обработка препрывания
Stop
Return
end 'end program
Программа находится в приложении 1 настоящей статьи.
EEPROM – встроенная энергонезависимая память (Flash – память) микроконтроллеров AVR. В ATtiny2313 доступно 128 байт EEPROM. EEPROM используется для хранения данных, которые редко изменяются. Чаще всего EEPROM используют для хранения калибровочных данных, которые используются в расчётах. EEPROM не нужно использовать в качестве оперативной памяти из – за небольшого лимита циклов перезаписи. Читать и записывать в EEPROM данные можно с помощью соответствующих команд: Readeeprom и Writeeprom. Но перед их использованием необходимо особым образом разместить данные в энергонезависимой памяти. Это можно сделать двумя способами. Первый – использовать оператор $eeprom.
. . . .
Dim ADCcal as Byte ‘объявление переменной
. . . .
$eeprom ‘переключение Bascom работы с блоками данных Data на блоки EEPROM
ADCcal1: ‘ метка блока данных
Data &H34 ‘данные (тип Long)
$data ‘переключение Bascom на работу с блоками данных
Readeeprom ADCcal , ADCcal1 ‘cчитывание ADCcal из блока данных ADCcal1
Строку $eeprom необходимо разместить перед тем местом в программе, в котором происходит обращение к константам памяти, т.е. перед строкой Data.
В качестве примера чтения и записи в EEPROM приведём программу “EEPROM0”, блок схема которой приведена на Рис.2.
В начале происходит считывание Buttencounter из блока данных Buttercounterdefault. Затем в цикле Do –Loop происходит увеличение данного значения. При обработке прерывания INT0 происходит запись нового значения Buttercounter в блок данных Buttercounter. При перезапуске микроконтроллера значение снова считывается, и счёт начинается с нового значения. Программа “EEPROM0” приведена ниже.
$Regfile = "attiny2313a.dat"
$Crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config PinD.6 = output 'конфигурирование выводов
Config PinD.2 = input
Config Pind.2 = 1
Config INT0 = FALLING 'внешнее прерывание по спаду импульса
Dim Wtime as Byte 'объявление переменных
Dim Addval as Integer
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 'начало цикла увеличения значения Buttoncounter
Set PORTD.6
Waitms Wtime
Reset PORTD.6
Waitms Wtime
Buttoncounter = Buttoncounter + Addval
cls
Lcd "Btn.Ctr:" ; Buttoncounter
Loop 'конец цикла
Button: 'подпрограмма обработки прерывания
Writeeeprom Buttoncounter , Buttoncounterdefault 'запись Buttoncounter в EEPROM
Lowerline 'перемещение курсора на нижнюю строчку дисплея
Lcd "to eeprom" 'индикация прохождения записи в EEPROM
Wait 3'задержка 3сек
Addval = 0
Return
End 'end program
Программа приведена в приложении 2 данной статьи.
Другой метод работы с EEPROM заключается в использовании оператора Dim:
. . . .
Dim ADCcal as Byte
Dim ADCcal1 as Eram Byte
. . . .
Здесь переменная ADCcal объявлена, как переменная типа Byte в ERAM (EEPROM). Присваиваем значение переменной ADCcal1 из EEPROM переменной ADCcal:
ADCcal = ADCcal1
Или, наоборот, помещаем значение переменной ADCcal в EEPROM, в область, зарезервированную под хранение значения ADCcal1:
ADCcal1 = ADCcal
В качестве примера приведём программу “EEPROM0a”, которая находится в приложении 3 настоящей статьи. Блок – схема программы почти идентична программе “EEPROM0”, которая описана выше. Сама программа “EEPROM0a” приведена далее.
$Regfile = "attiny2313a.dat" ‘ настройки
$Crystal = 4000000
$hwstack = 40
$swstack = 16
$framesize = 32
Config PinD.6 = output 'конфигурирование выводов
Config PinD.2 = input
Config Pind.2 = 1
Config INT0 = FALLING 'внешнее прерывание по спаду импульса
Dim Wtime as Byte 'объявление переменных
Dim Addval as Integer
Dim Buttoncounter as Integer
Dim Bc as Eram Integer 'объявляем переменную Bc,как переменную из EEPROM
Buttoncounter = Bc 'присваиваем переменной значение из EEPROM
cls
Lcd "Def.Ctr:" ; Buttoncounter 'индикация считанного значения
Addval = 1
On Int0 Button 'определение подпрограммы прерывания
Wtime = 255
Enable INTERRUPTS 'разрешение прерываний
Enable INT0
Do 'начало цикла увеличения значения Buttoncounter
Set PORTD.6
Waitms Wtime
Reset PORTD.6
Waitms Wtime
Buttoncounter = Buttoncounter + Addval
cls
Lcd "Btn.Ctr:" ; Buttoncounter
Loop 'конец цикла
Button: 'подпрограмма обработки прерывания
Bc = Buttoncounter 'помещаем значение перем.в EEPROM в область ВС
Lowerline 'перемещение курсора на нижнюю строчку дисплея
Lcd "to eeprom" 'индикация прохождения записи в EEPROM
Wait 3 'задержка 3сек
Addval = 0
Return
End 'end program