Статья №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.  
 

Рис.1 - Блок-схема программы "TIMER-STOP" 
 
Программа  состоит  из  основного  цикла, в  котором  происходит  включение  и  отключение светодиода  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.
 
Рис.2 - Блок-схема программы "EEPROM0" 
 
В  начале  происходит  считывание  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