Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Не понимаю таймер...


Не понимаю таймер...

Сообщений 1 страница 30 из 31

1

Вот кусок кода:

Код:
$regfile = "m32def.dat"                                     ' specify the used micro
$crystal = 16000000                                         ' used crystal frequency
$baud = 19200                                               ' use baud rate
$hwstack = 64                                               ' default use 32 for the hardware stack
$swstack = 40                                               ' default use 10 for the SW stack
$framesize = 80                                             ' default use 40 for the frame space

Config Timer0 = Timer , Prescale = 1024
On Timer0 Pulse0
do

Loop
End

Pulse0:
 Incr C
 Incr Disp
 If Disp = 125 Then
   Disp = 0
   Stop Timer0
   Toggle Disp2
   Start Timer0
  End If
Return

Проверяется только в Протеусе.
По расчетам, таймер должен сбрасываться каждые 8 миллисекунд
1024/16000000 * 125
В действительности же переключение переменной Disp2 происходит примерно раз в 3 секунды.
Косяк мой или Протеуса?

0

2

Данный фрагмент кода, вообще не будет работать!

0

3

Формула для расчёта 8-ми битных таймеров:

1000 / ( f МК / делитель / 256 )

В вашем случае ещё

1000 / ( 16000000 / 1024 / 256 ) * 125 = ~ 2 сек  -  это при условии исправлении ошибок.

Отредактировано sasha_1973 (2014-01-13 08:12:07)

+1

4

sasha_1973 написал(а):

Данный фрагмент кода, вообще не будет работать!

Почему? Работает же :-)

sasha_1973 написал(а):

Формула для расчёта 8-ми битных таймеров:

1000 / ( f МК / делитель / 256 )

В вашем случае ещё

1000 / ( 16000000 / 1024 / 256 ) * 125 = ~ 2 сек  -  это при условии исправлении ошибок.

Отредактировано sasha_1973 (Сегодня 08:12:07)

Ни в одном из примеров, что в сети выложены, нет такого варианта  :blush:
Везде приведена (делитель/Fмк)*Т

0

5

rustr написал(а):

Почему? Работает же

Как он может работать, если:

1). Не включены прерывания
2). Не определены переменные

rustr написал(а):

Ни в одном из примеров, что в сети выложены, нет такого варианта

Согласно того, что Вы находите в интернете, у Вас не получается. Попробуйте мой вариант, а потом будуте спорить!

Отредактировано sasha_1973 (2014-01-13 11:34:55)

0

6

sasha_1973 написал(а):

Как он может работать, если:

1). Не включены прерывания
2). Не определены переменные

Согласно того, что Вы находите в интернете, у Вас не получается. Попробуйте мой вариант, а потом будуте спорить!

Отредактировано sasha_1973 (Сегодня 11:34:55)

Ну, я подумал, что это подразумевается  :flag:

Код:
$regfile = "m32def.dat"                                     ' specify the used micro
$crystal = 16000000                                         ' used crystal frequency
$baud = 19200                                               ' use baud rate
$hwstack = 64                                               ' default use 32 for the hardware stack
$swstack = 40                                               ' default use 10 for the SW stack
$framesize = 80                                             ' default use 40 for the frame space


'$sim
'=================================
$lib "ds1307clock.lib"

  '$lib "lcd4busy.lbx"                                       ' Используемая библиотека
  'Const _lcdport = Portb                                    ' К чему подключен LCD
  'Const _lcdddr = Ddrb
  'Const _lcdin = Pinb
  'Const _lcd_e = 2                                          ' Имеется ввиду PORTB.3
  'Const _lcd_rw = 4                                         ' Имеется ввиду PORTB.2
  'Const _lcd_rs = 1                                         ' Имеется ввиду PORTB.1

  'Config Lcd = 20 * 4                                       ' Используемый LCD
  'Initlcd                                                   ' Инициализируем LCD
  'Waitms 50                                                 ' Ждем пока все запустится

Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.1 , Rs = Portb.0
Config Lcd = 20 * 4

Config Int2 = Falling
On Int2 But_int

Config Timer0 = Timer , Prescale = 1024
On Timer0 Pulse0

Key_up Alias Pinb.2
Key_set Alias Pinc.2
Key_down Alias Pinc.3
Key_left Alias Pinc.4
Key_right Alias Pinc.5
Trigg Alias Portc.6
Led Alias Portd.7
Config Portc.2 = Input : Portc.2 = 1
Config Portc.3 = Input : Portc.3 = 1
Config Portc.4 = Input : Portc.4 = 1
Config Portc.5 = Input : Portc.5 = 1
Config Portc.6 = Output : Portc.6 = 1
Config Portc.7 = Input : Portc.7 = 1
Config Portb.2 = Input : Portb.2 = 1
Config Led = Output

Config Sda = Portc.1                                        ' I2C Data
Config Scl = Portc.0                                        ' I2C Clock
Config I2cdelay = 1                                         '> Задержки i2c "10 - 100кГц, 5 - 200кГц, 2 - 500кГц, 1 - 1Мгц" - для стабильной работы чем длиннее провода тем меньше частота

Config Clock = User
Const Ds1307w = &HD0
Const Ds1307r = &HD1

Enable Interrupts
Enable Timer0
Enable Int2                                                 '>  Включаем прерывание INT2


'*******************************************************************************
  Dim String_lcd As Byte                                    'переменные
  Dim Cursor_lcd As Byte                                    'генератора
  Dim Buffer_lcd As String * 20                             'русского
  Dim Length As Integer                                     'алфавита
  Dim Cycle_lcd_print As Integer
  Dim Code_simbol As Byte
  Dim Code_simbol_lcd As Byte
  Dim Simbol_lcd As String * 1
  Dim Simbol As String * 1
  Dim Out_lcd As String * 20
'*******************************************************************************

'-------------------------------------------------------------------------------
'--------------------- Графика для формирования цифр ---------------------------
'-------------------------------------------------------------------------------
  Deflcdchar 0 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32      ' верхняя черточка
  Deflcdchar 1 , 32 , 32 , 32 , 32 , 32 , 32 , 31 , 31      ' нижняя черточка
  Deflcdchar 2 , 31 , 31 , 32 , 32 , 32 , 32 , 31 , 31      ' 2 черточки
  Deflcdchar 3 , 7 , 15 , 31 , 31 , 31 , 31 , 31 , 31       ' левый верхний угол
  Deflcdchar 4 , 31 , 31 , 31 , 31 , 31 , 31 , 15 , 7       ' левый нижний угол
  Deflcdchar 5 , 28 , 30 , 31 , 31 , 31 , 31 , 31 , 31      ' правый верхний угол
  Deflcdchar 6 , 31 , 31 , 31 , 31 , 31 , 31 , 30 , 28      ' правый нижний угол
  Deflcdchar 7 , 32 , 1 , 3 , 7 , 14 , 12 , 32 , 32         ' Кусочек для единицы
'-------------------------------------------------------------------------------
'-------------   Переменные для подпрограммы вывода больших цифр   -------------
'-------------------------------------------------------------------------------
  Dim Цикл_1 As Byte , Цикл_2 As Byte , X1 As Byte , X2 As Byte , Y As Byte
  Dim Количество_больших_символов As Byte
  Dim Выводимая_строка_big As String * 6 , Большие_цифры_lcd As String * 6
  Dim Большие_символы_верх As String * 6 , Большие_символы_низ As String * 6

'====флаг изменения дисплея=======
Dim Disp As Byte
Dim Disp2 As Bit
Dim C As Word
'====переменные часов=============
Dim _dat As Byte

Dim Bit_ds1307 As Byte
Dim Time_ds1307 As Byte

Dim Seco_bcd As Byte
Dim Mine_bcd As Byte
Dim Hour_bcd As Byte
Dim Day_bcd As Byte
Dim Dat_bcd As Byte
Dim Month_bcd As Byte
Dim Year_bcd As Byte

Dim Secostr As String * 2
Dim Minestr As String * 2
Dim Hourstr As String * 2
Dim Daystr As String * 2
Dim Datstr As String * 12
Dim Monthstr As String * 2
Dim Yearstr As String * 4

Dim Seco_wr As Byte
Dim Mine_wr As Byte
Dim Hour_wr As Byte
Dim Day_wr As Byte
Dim Month_wr As Byte
Dim Year_wr As Byte

Dim Seco_wr_bcd As Byte
Dim Mine_wr_bcd As Byte
Dim Hour_wr_bcd As Byte
Dim Day_wr_bcd As Byte
Dim Month_wr_bcd As Byte
Dim Year_wr_bcd As Byte

Dim Secostr_wr As String * 2
Dim Minestr_wr As String * 2
Dim Hourstr_wr As String * 2
Dim Daystr_wr As String * 2
Dim Monthstr_wr As String * 2
Dim Yearstr_wr As String * 4

'====переменные таймеров==========
Dim Tim1_hour_on As Byte
Dim Tim1_mine_on As Byte
Dim Tim1_hour_off As Byte
Dim Tim1_mine_off As Byte
Dim Tim1_day As Byte
Dim Tim2_hour_on As Byte
Dim Tim2_mine_on As Byte
Dim Tim2_hour_off As Byte
Dim Tim2_mine_off As Byte
Dim Tim2_day As Byte
'====переменные датчика HC-SR04===
Dim Trim_ As Byte
Dim Sonar As Word
Dim Dist As Single
Const K = 0.1725
Dim Percent As Byte
'====переменные датчиков фаз======
Dim Lv_ As Byte
Dim La_ As Byte
Dim Lv As Byte
Dim La As Byte
Dim V_set As Byte
Dim A_set As Byte

Dim Lv_set As Byte                                          'переменная пределов
Dim La_set As Byte                                          'защиты
Dim Lv_set_eep As Eram Byte                                 'для записи в
Dim La_set_eep As Eram Byte                                 'EEPROM
Dim Lvstr As String * 2                                     '
Dim Lastr As String * 2                                     '

Dim L1v As Byte                                             'напряжени линии 1
Dim L2v As Byte                                             '          линии 2
Dim L3v As Byte                                             '          линии 3
Dim L1vstr As String * 3                                    '
Dim L2vstr As String * 3                                    '
Dim L3vstr As String * 3                                    '

Dim L1a As Byte                                             'ток в линии 1
Dim L2a As Byte                                             '      линии 2
Dim L3a As Byte                                             '      линии 3
Dim L1astr As String * 3                                    '
Dim L2astr As String * 3                                    '
Dim L3astr As String * 3                                    '

Dim Lv_min As Byte                                          'нижний предел напряжения
Dim Lv_max As Byte                                          'верхний предел
Dim Lvminstr As String * 3
Dim Lvmaxstr As String * 3

Dim La_min As Byte                                          'нижний предел тока
Dim La_max As Byte                                          'верхний предел
Dim Laminstr As String * 3
Dim Lamaxstr As String * 3

'====переменные по емкости========
Dim Vol As Byte
Dim Vol_min As Word
Dim Vol_min_eep As Eram Word
Dim Vol_max As Word
Dim Vol_max_eep As Eram Word
Dim Vol_mid As Byte
Dim Vol_mid_eep As Eram Byte
Dim Volstr As String * 3
Dim Volminstr As String * 3
Dim Volmaxstr As String * 3
Dim Volmidstr As String * 3
'====переменные ШИМ===============

'====переменные для опроса клавиатуры
Dim Temp_butt As Byte
Dim Temp2_butt As Byte
Dim A As Word
Dim B As Byte
Dim Key_up As Bit
Dim Key_down As Bit
Dim Key_set As Bit
Dim Key_left As Bit
Dim Key_right As Bit
Dim Keycode As Byte
'====основной цикл================
I2cinit                                                     'Инициализация i2c

'--------------   Подпрограмма вывода русского языка на LCD HD44780    ----------
Declare Sub Lcd_print(byval Copy_lcd_print As String)
'--------------------   Подпрограмма вывода больших цифр   ---------------------
Declare Sub Формирование_больших_цифр()
'-------------------------------------------------------------------------------
'Vol_max = 0
'Vol_min = 0
Vol_max = Vol_max_eep
Vol_mid = Vol_mid_eep
Vol_min = Vol_min_eep
Lv_set = Lv_set_eep
La_set = La_set_eep

Cls
Cursor Off
'Locate 2 , 2
'Lcd "Pumphouse station"
'Wait 1
'Cls
A = 10
Keycode = 0
Disp = 0
Disp2 = 0

Lv_ = 230
La_ = 8


Do
 Gosub Ds1307                                               'переход на подпрограмму считывания времени и даты
 Gosub Measure                                              'переход на подпрограмму измерения
 Gosub Keybrd                                               'переход на подпрограмму обработки клавиатуры
  '====Выбор пункта меню============
Select Case A
 Case 10 : Gosub Display_main
 Case 11 To 14 : Gosub Menu_1st
 Case 15 : Gosub Menu_1_2st
 Case 150 To 151 : Gosub Dropping
 Case 110 To 115 : Gosub Menu_rtc
 Case 120 To 125 : Gosub Menu_tank
 Case 130 To 131 : Gosub Set_measure
 Case 1100 : Gosub Exit_rtc
 Case 1500 : Gosub Ye
 Case 1510 : Gosub Ne
End Select



Loop


End

Pulse0:
 Incr C
 If C = 1630 Then
  A = 10
   End If
 Incr Disp
 If Disp = 125 Then
  Disp = 0
   Stop Timer0
   Toggle Disp2
   Start Timer0
    End If
Return



$include "measure.bas"
$include "keybrd_1_INT.bas"
$include "Menu_1st.bas"
$include "Menu_1_2st.bas"
$include "Menu_rtc.bas"
$include "Menu_measure.bas"
$include "Display_main.bas"
$include "ds1307.bas"
$include "Menu_tank.bas"
$include "Reset.bas"
$include "rus_text.bas"

А вот расчет именно по Вашей формуле совпадает с результатом в Протеусе.
Спасибо за консультацию  :cool:
Я выражал непонимание тому, что в и-нете везде, получается, указаны некорректные сведения

0

7

Как можно догадаться, что Вы там написали у себя, надо выкладывать весь фрагмент, для корректного совета или подсказки!

Вы просто не совсем правильно считаете или не совсем внимательно читаете.

0

8

sasha_1973 написал(а):

Вы просто не совсем правильно считаете или не совсем внимательно читаете.

Может, вполне вероятно.
Вот, к примеру, один из ресурсов:

ссылка на другой форум

http://radiokot.ru/forum/viewtopic.php?f=20&t=6408&start=240

1 и 5 сообщения.
А вообще, Александр, честно, очень не хватает статьи про таймеры, подобной Вашей статье Прерывания INT0, INT1, PCINTx Atmega8_88_328

0

9

rustr написал(а):

http://radiokot.ru/forum/viewtopic.php?f=20&t=6408&start=240

И что-же там неправильного, специально посчитал?

t = Kдел / Fтак * 256 , время получается в секундах, * 1000 - получаете ms

у меня немного другой вариант этой-же формулы, математика в чистом виде!

Отредактировано sasha_1973 (2014-01-13 12:16:30)

0

10

Я, наверное, не понимаю  :dontknow:
1024/16000000=0,000064*1000=0,064 мс
0,064*125=8 мс
Вот так я понимаю эти примеры

0

11

rustr написал(а):

Я, наверное, не понимаю

TIMER0 - это 8-ми битный счётчик, т.е., считает до 256, сбрасывается, затем начинает счёт с "0"

Поэтому:

1024 / 16000000 = 0,000064 * 1000 = 0,064 мс * 256 = 16,384 ms * 125 = 2,048 сек

+1

12

Прерывание каждые ~ 8 ms

$regfile = "m32def.dat"       ' specify the used micro
$crystal = 16000000 ' used crystal frequency
$baud = 19200       ' use baud rate
$hwstack = 64       ' default use 32 for the hardware stack
$swstack = 40       ' default use 10 for the SW stack
$framesize = 80     ' default use 40 for the frame space

Config Timer0 = Timer , Prescale = 256
On Timer0 Pulse0

Dim C As Byte
Dim Disp As Byte
Dim Disp2 As Byte

Enable Timer0
Enable Interrupts

Do

Loop
End

Pulse0:
Incr C
Incr Disp
If Disp = 2 Then
   Disp = 0
   Stop Timer0
   Toggle Disp2
   Start Timer0
  End If
Return

Или так

$regfile = "m32def.dat"       ' specify the used micro
$crystal = 16000000 ' used crystal frequency
$baud = 19200       ' use baud rate
$hwstack = 64       ' default use 32 for the hardware stack
$swstack = 40       ' default use 10 for the SW stack
$framesize = 80     ' default use 40 for the frame space

Config Timer0 = Timer , Prescale = 1024
Tcnt0 = 128
On Timer0 Pulse0

Dim C As Byte
Dim Disp As Byte
Dim Disp2 As Byte

Enable Timer0
Enable Interrupts

Do

Loop
End

Pulse0:

Tcnt0 = 128

Return

Для более точных отсчётов прерываний, надо переходить на Ассемблер.

Отредактировано sasha_1973 (2014-01-13 13:07:00)

+2

13

sasha_1973 написал(а):

TIMER0 - это 8-ми битный счётчик, т.е., считает до 256, сбрасывается, затем начинает счёт с "0"

Поэтому:

1024 / 16000000 = 0,000064 * 1000 = 0,064 мс * 256 = 16,384 ms * 125 = 2,048 сек

Вот здесь я и заблуждался, по видимому.
Я думал, что при предделителе 1024 1 тик таймера = 0,064 мс, но таймер ограничен 125 тиками поэтому 0,064*125
А считать мне надо именно 2 секунды

Отредактировано rustr (2014-01-13 13:23:59)

0

14

Вы определитесь точно, сколько Вам надо?

0

15

Пока мне надо два отсчета - 2 сек и 30 сек
Первый я считаю  переменной Disp,
а второй -  переменной С

Код:
Enable Interrupts
Enable Timer0
Config Timer0 = Timer , Prescale = 1024
On Timer0 Pulse0
'====флаг изменения дисплея=======
Dim Disp As Byte
Dim Disp2 As Bit
Dim C As Word
Pulse0:
 Incr C
 If C = 1630 Then
  A = 10
   End If
 Incr Disp
 If Disp = 122 Then
  Disp = 0
   Stop Timer0
   Toggle Disp2
   Start Timer0
    End If
Return

Отредактировано rustr (2014-01-13 13:31:59)

0

16

А почему, 16 МГц?

0

17

sasha_1973 написал(а):

А почему, 16 МГц?

Кварц такой в наличии, и, потом, мне надо очень живо реагировать на изменение измеряемых напряжения и тока.
Хотя, в промышленных реле время срабатывания порядка 200 мс...

0

18

А зачем Вам вообще таймер использовать, у Вас-же есть Ds1307, вот и пользуйтесь. Чёткие секундные отрезки времени.

0

19

Заводить сигнал с 7 ножки?
Или контролировать изменение бита секунд?
А вообще, как говориться - если на стене висит ружьё... то таймер должен считать :-)

Отредактировано rustr (2014-01-13 14:08:43)

0

20

C какой 7 ножки?

Давайте через mail, а то только переписываемся без толку?

0

21

rustr написал(а):

А вообще, Александр, честно, очень не хватает статьи про таймеры, подобной Вашей статье Прерывания INT0, INT1, PCINTx Atmega8_88_328

полностю поддерживаю

двумя руками и остальными частями организма - ЗА

0

22

sasha_1973 написал(а):

Давайте через mail, а то только переписываемся без толку?

елки палки, всемже интересно  1!!!!!!!!

0

23

sasha_1973

а про 2 таймер врежиме часов можете просветить 7?

и формулу ращота тоже

0

24

Alex90 написал(а):

а про 2 таймер врежиме часов можете просветить 7?

и формулу ращота тоже

Позже выложу

0

25

sasha_1973
Тоже хотелось бы посмотреть, присоединяюсь +1
Примеры доходчивые, уж очень )) в лучшем смысле.. иные в копилочку ложу, за что особое спасибо. ( Исследование MAX7219 (SPI драйвер 7seg led индикаторов))

0

26

Софтовые часы на TIMER2

Исходник

'===============================================================================
'*
'*  Автор: Sasha_1973
'*  Дата:  14.01.2014 г.
'*
'*  МК:  ATmega8А
'*  Тактовая частота МК:  1 MГц
'*
'*  Скорость передачи USART: 9600 бод
'*
'*  Компилятор: BASCOM-AVR 2.0.7.1
'*  Используемый шрифт в Bascom: Consolas; размер = 14
'*
'*  Программа симулятор: Proteus 7.10 SR0
'*
'*  Описание:
'*           Реализация программных часов на TIMER2, кварц 32768 кГц на выводах XTAL1(PB6) и XTAL2(PB7)
'*
'===============================================================================

'-------------------  Настройка контроллера  -----------------------------------

  $map              ' Получаем карту распределения памяти компилятором Bascom
  $regfile = "m8def.dat"       ' Используемый контроллер
  $crystal = 1000000       ' 2000000  ' 4000000  ' 8000000
  $framesize = 32
  $hwstack = 40
  $swstack = 16

'--------------------------  Настройка USART  ----------------------------------

  $baud = 4800      '1200     '2400     '4800     '9600     '19200     '38400     '57600     '115000
  Ucsra.1 = 1       ' Двойная скорость работы USART, скорость трансляции = $baud * 2

'---  Настройка прерывания TIMER2, для работы часов (раскомментировать нужное)

'  Config Timer2 = Timer , Async = On , Prescale = 64       ' Делитель 32768 / 64 / 256 = 0,5 сек (прерывание TIMER2 = 2 раза в секунду)
'  Const Количество_срабатываний_timer2 = 2

'---------------------------------------------------------------

  Config Timer2 = Timer , Async = On , Prescale = 128       ' Делитель 32768 / 128 / 256 = 1 сек (прерывание TIMER2 = 1 раз в секунду)
  Const Количество_срабатываний_timer2 = 1       ' Значение константы используется в подпрограмме "Обработка_прерывания_timer2"
' Ссылка на подпрограмму обработчика прерывания TIMER2, для работы часов
  On Timer2 Обработка_прерывания_timer2 Nosave       ' Ссылка на подпрограмму обработчика прерывания TIMER2

'---------------  Настройка пониженного энергопотребления МК  ------------------

  Assr.3 = 1 : Waitms 100       ' Включить НЧ-генератор AS2 и подождать стабилизации амплитуды генератора
'  При включении  бита AS2 (3) в регистре ASSR (ASSR.3), становится возможным применение режима
' "Powersave" - разновидность спящего режима. Пробуждение МК от TIMER2
'  Mcucr = &B10000000                              ' Разрешаем режим пониженного энергопотребления  Power Idle
  Mcucr = &B10110000       ' Разрешаем режим пониженного энергопотребления  Power Save

'-----------------------  Используемые переменные  -----------------------------

  Dim Часы As Byte
  Dim Минуты As Byte
  Dim Секунды As Byte

  Dim Время_работы_часы As Byte
  Dim Время_работы_минуты As Byte
  Dim Время_работы_секунды As Byte

  Dim Флаг_работа_окончена As Byte
  Dim Осталось_работать_часы As Byte
  Dim Осталось_работать_минуты As Byte
  Dim Осталось_работать_секунды As Byte

  Dim Счетчик_прерываний_timer2 As Byte
  Dim Флаг_обновить_данные_времени As Byte
  Dim Флаг_данные_для_передачи_usart As Byte

'------------------------  Предварительные настройки  --------------------------

  Часы = 20
  Минуты = 50
  Секунды = 0

  Осталось_работать_часы = 1
  Осталось_работать_минуты = 0
  Осталось_работать_секунды = 0

'-------------------  Передайм настройки времени в USART  ----------------------
  Print "Настройки времени"
  Print Часы ; ":" ; Минуты ; ":" ; Секунды : Print
  Wait 1
'--------------  Разрешаем работу необходимых прерываний  ----------------------

  Enable Timer2

'------------  Разрешаем работу всех включенных прерываний  --------------------

  Enable Interrupts

'===============================================================================

'                   Г Л А В Н Ы Й         Ц И К Л

'===============================================================================
  Главный_цикл:

      If Флаг_обновить_данные_времени = 1 Then
          Gosub Расчет_времени_работы
          Gosub Обновить_данные_времени
          Gosub Расчет_осталось_работать
          Флаг_обновить_данные_времени = 0
          Флаг_данные_для_передачи_usart = 1
          Goto Главный_цикл
      End If

      If Флаг_данные_для_передачи_usart = 1 Then
          Gosub Передача_uart
          Флаг_данные_для_передачи_usart = 0
          Goto Главный_цикл
      End If

'-----------------------
   Спящий_режим:
    sleep           ' или так Power Powersave
  Goto Главный_цикл
End
'===============================================================================

'               И С П О Л Ь З У Е М Ы Е    П О Д П Р О Г Р А М М Ы

'===============================================================================

'===============================================================================
' Подпрограмма обработки прерывания TIMER2, происходит 1 или 2 раза в секунду, в зависимости от настроек TIMER2
'===============================================================================
  Обработка_прерывания_timer2:
'-------------------------------------------------------------------------------

'----  Сохраняем регистры, которые используем в обработке прерывания

      !Push R31     ' Сохраняем регистры, которые используем в обработке прерывания
      !In R31 , Sreg
      !Push R31

'------------------  Считаем количество прерываний TIMER2  ---------------------

      !Lds R31 , {счетчик_прерываний_timer2}       ' Считываем значение переменной "Счетчик_прерываний_timer2" в регистр "R31", для последующих операций
      !Inc R31      ' Увеличиваем значение переменной в регистре "R31"
      !sts {счетчик_прерываний_timer2} , R31       ' Пишем значение из регистра "R31" в переменную "Счетчик_прерываний_timer2"

'------------------

      !Andi R31 , количество_срабатываний_timer2       ' Сравниваем полученное значение с значением "Const количество_срабатываний_timer2"

'------------------

      !Breq Выход_прерывание_timer2       ' Если полученное значение меньше значениея "Const количество_срабатываний_timer2", уходим на метку "Выход_прерывание_timer2" -- иначе
      !clr R31                                     ' Если полученное значение равно значениию "Const количество_срабатываний_timer2", пишем "0" в регистр "R31
      !sts {счетчик_прерываний_timer2} , R31       ' Заносим значение из регистра "R31" в переменную "Счетчик_прерываний_timer2" и переходим к подпрограмме расчета времени

'--------  Подпрограммы обрабатываемые по 2 срабатыванию TIMER2  ---------------

      !ldi R31 , 1
      !sts {Флаг_обновить_данные_времени} , R31       ' Поднимаем флажок, что надо обновить время

'---------------  Восстанавливаем ранее сохраненные регистры  ------------------

     Выход_прерывание_timer2:
      !Pop R31
      !Out Sreg , R31       ' Восстанавливаем регистры
      !Pop R31

'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'-----------  Подпрограмма расчета времени: часов, минут и секунд  ---------
'===============================================================================
  Обновить_данные_времени:
'-------------------------------------------------------------------------------
    Incr Секунды    ' Плюс секунда

    If Секунды > 59 Then       ' При необходимости
        Секунды = 0 : Goto Обновить_минуты       ' корректируем счетчик секунд и обновляем счетчик минут
    End If

    Goto Выход_обновить_данные_времени
'----------------------------------------------------
   Обновить_минуты:
'----------------------------------------------------
    Incr Минуты     ' Плюс минута

    If Минуты > 59 Then       ' При необходимости
        Минуты = 0 : Goto Обновить_часы       ' корректируем счетчик минут и обновляем счетчик часов
    End If

      Goto Выход_обновить_данные_времени
'----------------------------------------------------
    Обновить_часы:
'----------------------------------------------------
      Incr Часы     ' Плюс час

      If Часы > 23 Then       ' При необходимости
          Часы = 0  ' корректируем счетчик часов
      End If
'-------------------------------------------------------------------------------
   Выход_обновить_данные_времени:
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Расчет_времени_работы:
'-------------------------------------------------------------------------------
nop
    Incr Время_работы_секунды       ' Плюс секунда

    If Время_работы_секунды > 59 Then       ' При необходимости
        Время_работы_секунды = 0 : Goto Обновить_время_работы_минуты       ' корректируем счетчик секунд и обновляем счетчик минут
    End If

    Goto Выход_расчет_времени_работы
'----------------------------------------------------
   Обновить_время_работы_минуты:
'----------------------------------------------------
    Incr Время_работы_минуты       ' Плюс минута

    If Время_работы_минуты > 59 Then       ' При необходимости
        Время_работы_минуты = 0 : Goto Обновить_время_работы_часы       ' корректируем счетчик минут и обновляем счетчик часов
    End If

      Goto Выход_расчет_времени_работы
'----------------------------------------------------
    Обновить_время_работы_часы:
'----------------------------------------------------
      Incr Время_работы_часы       ' Плюс час

      If Время_работы_часы > 23 Then       ' При необходимости
          Время_работы_часы = 0       ' корректируем счетчик часов
      End If

   Выход_расчет_времени_работы:
nop
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
  Расчет_осталось_работать:
'-------------------------------------------------------------------------------
nop
    If Осталось_работать_секунды = 0 Then       ' При необходимости
        Осталось_работать_секунды = 59 : Goto Обновить_осталось_работать_мин       ' корректируем счетчик секунд и обновляем счетчик минут
    End If

    Decr Осталось_работать_секунды       ' Минус секунда

    Goto Выход_расчет_осталось_работать
'----------------------------------------------------
   Обновить_осталось_работать_мин:
'----------------------------------------------------
    If Осталось_работать_минуты = 0 Then       ' При необходимости
        Осталось_работать_минуты = 59 : Goto Обновить_осталось_работать_часы       ' корректируем счетчик минут и обновляем счетчик часов
    End If

    Decr Осталось_работать_минуты       ' Минус минута

    Goto Расчет_осталось_работать
'----------------------------------------------------
   Обновить_осталось_работать_часы:
'----------------------------------------------------
    If Осталось_работать_часы = 0 And Осталось_работать_минуты = 0 And Осталось_работать_секунды = 0 Then       ' При необходимости
        Флаг_работа_окончена = 1
    '    Осталось_работать_часы = 0       ' корректируем счетчик часов
    End If

    Decr Осталось_работать_часы       ' Минус час

   Выход_расчет_осталось_работать:
nop
'-------------------------------------------------------------------------------
  Return
'===============================================================================

'===============================================================================
'---  Подпрограмма обработки вывода на компьютер (аппаратный USART)
'===============================================================================
  Передача_uart:
'-------------------------------------------------------------------------------

    Print

    Print "Время работы - " ;
    Print Время_работы_часы ; ":" ;
    If Время_работы_минуты < 10 Then Print "0" ;
    Print Время_работы_минуты ; ":";
    If Время_работы_секунды < 10 Then Print "0" ;
    Print Время_работы_секунды

    Print "Текущее время - " ;
    Print Часы ; ":" ;
    If Минуты < 10 Then Print "0" ;
    Print Минуты ; ":";
    If Секунды < 10 Then Print "0" ;
    Print Секунды

    Print "Осталось работать - " ; Осталось_работать_часы ; ":" ; Осталось_работать_минуты ; ":" ; Осталось_работать_секунды

    Print

'-------------------------------------------------------------------------------
  Return
'===============================================================================

http://s7.uploads.ru/t/SDuZW.jpg

Симуляция в Протеус 7.10 + исходники (Bascom 2.0.7.1)  -  скачать

Отредактировано sasha_1973 (2014-01-15 05:52:03)

+2

27

Спасибо.

0

28

На здоровье!

0

29

sasha_1973, какой версией/сборкой протеуса пользуешься?

0

30

RDW написал(а):

sasha_1973, какой версией/сборкой протеуса пользуешься?

В исходнике написано.

sasha_1973 написал(а):

Программа симулятор: Proteus 7.10 SR0

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Не понимаю таймер...