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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Таймеры, ШИМ и все про них » Вопрос про TIMER1 в режиме Capture Edge.


Вопрос про TIMER1 в режиме Capture Edge.

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

1

Здравствуйте дорогие форумчане!!!
Делаю хронограф. Решил использовать для изтерения Т единственный порт в Мега8 ICP1.
Что произойдет если первый импульс запустит таймер, а второго не будет?

0

2

Скорее всего пойдет по кругу.

0

3

Yuriy.pv
Должен пойти. Каждое переполнение можно тоже как то считать.
Как?

0

4

Прерывание по переполнению 8-)

0

5

Yuriy.pv
$regfile = "m8adef.dat"
$crystal = 16000000
'========================настраиваем таймер в режим захвата================
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Falling
On Capture1 Захват
'----------------------------------------------------------------------------------------------------------------
Захват:
  Длительность = Capture1
  Timer1 = 0
  W = 1
Return

Как считать переполнения?
Не создовал бы тему, если бы она решалась очень просто.

0

6

Весь код.

Код:
$regfile = "m8adef.dat"
$crystal = 16000000
$hwstack = 100
$swstack = 100
$framesize = 64

'========================настраиваем таймер в режим захвата================
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Falling
On Capture1 Захват
'--------------------------------------------------------------
Config Timer0 = Timer , Prescale = 64                       ' конфигурируем таймер (~250 Гц)
On Timer0 Refresh
'==============Переменные=======================================
Dim W As Bit : W = 0
Dim Y As Byte
Dim Pisec As Byte                                           ' счетчик для перебора разрядов
Dim Длительность As Word
Dim Ind_str As String * 1
Dim Скорость_sing As Single
Dim V As Word
Dim V_str As String * 4
Dim Строка_str As String * 10
Const T = 0.000004
Const L = 0.1
Dim Точка As Bit
Dim Энергия As Long
Dim E_str As String * 4
Dim M As Word
Dim M_str As String * 4
Dim Mee As Eram Word
Dim Счет As Word
Dim Flag As Bit
'==============Порта , и переменные индикации=======================================
Config Portc.3 = Output : Config Portb.2 = Output : Config Portd.1 = Output : Config Portc.0 = Output : Config Portc.1 = Output
Config Portd.7 = Output : Config Portb.4 = Output : Config Portc.5 = Output
A Alias Portc.3 : B Alias Portb.2 : C Alias Portd.1 : D Alias Portc.0 : E Alias Portc.1 : F Alias Portd.7 : G Alias Portb.4
H Alias Portc.5

Config Portd.2 = Output : Config Portd.0 = Output : Config Portc.4 = Output : Config Portc.2 = Output
Config Portb.5 = Output : Config Portb.3 = Output : Config Portb.1 = Output : Config Portd.6 = Output
Dig1 Alias Portd.2 : Dig2 Alias Portd.0 : Dig3 Alias Portc.4 : Dig4 Alias Portc.2
Dig5 Alias Portb.5 : Dig6 Alias Portb.3 : Dig7 Alias Portb.1 : Dig8 Alias Portd.6
'__________________________________________________________________________
Config Pind.5 = Input : Portd.5 = 1
Сброс Alias Pind.5
'__________________________________________________________________________
Config Pind.4 = Input : Portd.4 = 1
Минус Alias Pind.4
'__________________________________________________________________________
Config Pind.3 = Input : Portd.3 = 1
Плюс Alias Pind.3
'------------------------------------------------------------------------------
If Mee > 350 Then Mee = 200
M = Mee

Enable Interrupts
Enable Timer0 : Start Timer0
Enable Capture1

  For Pisec = 1 To 5
     Строка_str = "        "
     Waitms 300
     Строка_str = "--------"
     Waitms 300
  Next Pisec
'*******************************************************************************
Главный_цикл:

     Incr Счет
     If Счет > 40 Then Счет = 0

   If Сброс = 0 Then Длительность = 0
   If Сброс = 0 And Flag = 1 Then
     Flag = 0
     Mee = M
   End If
   If Минус = 0 Then
      Waitms 100
      Decr M : Flag = 1
   End If
   If Плюс = 0 Then
      Waitms 100
      Incr M : Flag = 1
   End If
   M_str = Str(m) : M_str = Format(m_str , "000")

      Скорость_sing = Длительность * T
      Скорость_sing = L / Скорость_sing
      V = Abs(скорость_sing)
      V_str = Str(v) : V_str = Format(v_str , "000")

      Энергия = V * V
      Энергия = Энергия * M
      Энергия = Энергия / 20000                             'E = 1 / 200000 * M * V ^ 2
      E_str = Str(энергия) : E_str = Format(e_str , "000")


     If Flag = 0 Then
      Строка_str = V_str + "n" + E_str + "j"
     End If
     If Flag = 1 Then
      Строка_str = V_str + "n" + M_str + "g"
     End If
    Waitms 100

Goto Главный_цикл
'*******************************************************************************

'***********************************[Процедуры обработки подпрограмм и прерываний]*******************************
Refresh:

  Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4 : Set Dig5 : Set Dig6 : Set Dig7 : Set Dig8 : H = 0       ' гасим индикатор

 Incr Y : If Y > 8 Then Y = 1                               ' выбираем какой разряд сейчас включать

    Ind_str = Mid(строка_str , Y , 1)
  Select Case Ind_str
    Case "0" : A = 1 : B = 1 : C = 1 : D = 1 : E = 1 : F = 1 : G = 0
    Case "1" : A = 0 : B = 1 : C = 1 : D = 0 : E = 0 : F = 0 : G = 0
    Case "2" : A = 1 : B = 1 : C = 0 : D = 1 : E = 1 : F = 0 : G = 1
    Case "3" : A = 1 : B = 1 : C = 1 : D = 1 : E = 0 : F = 0 : G = 1
    Case "4" : A = 0 : B = 1 : C = 1 : D = 0 : E = 0 : F = 1 : G = 1
    Case "5" : A = 1 : B = 0 : C = 1 : D = 1 : E = 0 : F = 1 : G = 1
    Case "6" : A = 1 : B = 0 : C = 1 : D = 1 : E = 1 : F = 1 : G = 1
    Case "7" : A = 1 : B = 1 : C = 1 : D = 0 : E = 0 : F = 0 : G = 0
    Case "8" : A = 1 : B = 1 : C = 1 : D = 1 : E = 1 : F = 1 : G = 1
    Case "9" : A = 1 : B = 1 : C = 1 : D = 1 : E = 0 : F = 1 : G = 1
    Case " " : A = 0 : B = 0 : C = 0 : D = 0 : E = 0 : F = 0 : G = 0
    Case "-" : A = 0 : B = 0 : C = 0 : D = 0 : E = 0 : F = 0 : G = 1
    Case "n" : A = 0 : B = 0 : C = 1 : D = 0 : E = 1 : F = 0 : G = 1
    Case "j" : A = 0 : B = 1 : C = 1 : D = 1 : E = 1 : F = 0 : G = 0
    Case "g" : A = 0 : B = 0 : C = 0 : D = 0 : E = 1 : F = 0 : G = 1
  End Select

  If Flag = 0 And Y = 6 Then H = 1
  If Flag = 1 And Y = 5 Then H = 1

  Select Case Y                                             ' и включаем соответствующий разряд индикатора
    Case 1 : Reset Dig1
    Case 2 : Reset Dig2
    Case 3 : Reset Dig3
    Case 4 : Reset Dig4
    Case 5 : Reset Dig5
    Case 6 : Reset Dig6
    Case 7 : Reset Dig7
    Case 8 : Reset Dig8
  End Select

 Return
'----------------------------------------------------------------------------------------------------------------
Захват:
  Длительность = Capture1
  Timer1 = 0
  W = 1
Return

0

7

rom-i написал(а):

Что произойдет если первый импульс запустит таймер, а второго не будет?

К сожалению в AVR (включая xmega) нет такого полезного режима работы таймера как ШИМ захват. Можно было бы организовать выход по таймауту.

0

8

Код:
'=============================настраиваем таймер в режим захвата================
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Falling
On Capture1 Захват
On Timer1 T_ovf

'--------------------------------------------------------------
Config Timer0 = Timer , Prescale = 64                       ' конфигурируем таймер (~250 Гц)
On Timer0 Refresh
'===========================================


----------------------------------------------------------------------------------------------------------------
Захват:
  Длительность = Capture1
  Timer1 = 0
  W = 1
Return

----------------------------------------------------------------------------------------------------------------

T_ovf:                'переполнение

    Incr Count_tovf 

Return

И как посоветовал Петр, таймаут сделайте хоть на wdt или таймере, если свободен. Можно тут же проверять Count_tovf и по достижению какого либо значения выходить.

Отредактировано Yuriy.pv (2020-07-18 07:00:30)

0

9

Как я понял, импульс на ICP нужен только для запуска таймера? Если так, то можно попробовать в обработчике прерывания по захвату переконфигурировать таймер на работу по переполнению. Не уверен, что будет работать, но можно попробовать.

0

10

Yuriy.pv
Про это как раз думал. Как правильно прописать не знаю.
On Capture1 Захват
On Timer1 T_ovf
В принипе рабочее выражение. Тож мну в сначала так придумалось.
Только попроще.
If TIMER1 = 5000 Then TIMER1 = 0
Только это не останавливает таймер. Он считать начал по спаду на землю(0).
Остановиться только следующим импульсом.
Как реально его остановить, без резета МК?

Отредактировано rom-i (2020-07-18 15:57:41)

0

11

Yuriy.pv
Не плохая тема. Та можно считать количество переполнений таймера.
T_ovf:                'переполнение
    Incr Count_tovf
Return
Но не останавливает захват.
Количество переполнений можно считать хоть год. Инкорнируй переменные.
Вопрос. Как сбросить таймер в режиме захвата?
ВДТ не предлогать. Без сброса МК.

Отредактировано rom-i (2020-07-18 16:08:03)

0

12

Вообще реально
If Capture1 > 65534 Then
   Disable Capture1
  TIMER1 = 0
   Длительность = 0
Waitms 10
Enable Capture1
End If
Но это как то по детски.

0

13

"ВДТ не предлогать. Без сброса МК." - я и не предлогаю сброс. Его можно и как таймер использовать.

Если вы хотите мерить период, то Count_tovf поможет на длительных задержках..
Time = Count_tovf*65535+timer1.
А сбрасывать можно по таймауту.

Если просто сбросить счетчик то timer1=0

Отредактировано Yuriy.pv (2020-07-18 16:50:11)

0

14

Yuriy.pv
Time = Count_tovf*65535+timer
Это инопланетное вторжение?

0

15

Yuriy.pv
Вопрос задан не про среднеквадратичное число.
Про работу таймера, в режиме захвата.

0

16

Решил использовать для изтерения Т единственный порт в Мега8 ICP1.
Что произойдет если первый импульс запустит таймер, а второго не будет?

Думал, что время измеряете.  :dontknow:

0

17

Yuriy.pv
Время, и измеряю. Обычная формула V=L/S.
Конструкция еще не готова. Свето-фото только отправлены из Китая. Как в реале все пойдет неизвестнто.
Но столкнуться с этим придется при настройке.
Как на счет Stop TIMER1?
По сути Capture Edge запускает таймер, и также останавливает.

T_ovf:                'переполнение
'    Incr Count_tovf
Stop TIMER1
Return

Есть в этом смысл?
Даже проще к кнопке обнуления показаний привязать. А в переполнение таймера добавить индикацию ошибки "Error".

Отредактировано rom-i (2020-07-19 08:36:18)

0

18

Ааа.. Так вам и не нужны днинные измерения, ну да тогда Err при пераполнении. Я не придал значения что хронограф делаете..

0

19

Yuriy.pv
Двухбайтного таймера хватает, ну просто за глаза. 16 мГц точность очень отличная. 4мкс.
Скорость звука 331м/c. Даже если принять, что создали инженеры, это 10 махов. 3310м/c. Таймера хватит по любому. Ведь L можно изменять как душе угодно. Конструктивно.
В данном случае надобность измерения от 50 до 350 м/c. Рогатка, воздушка, стрейкбольные воздушки.
В основном народ делает на двух прерываниях INT. Первое запускает таймер, второе останавливат. Можно мерить даже стрельбу из лука. Просто решил изучить именно CAPTURE.
С INT гораздно проще. Необходимые задержки в тиках сами собой компенсируются. А вот в режиме захвата буду позжее спрашивать.
Сколько тиков уйдет на запуск, и остановку таймера. Можно считать это вопросом.

0

20

Датчики в паралельно ставятся? Как с длинным предметом, когда перекрываются оба, если длинный 2 импульса, при коротком 4.

0

21

Yuriy.pv
Если длинный предмет(например стрела) тогда нужно использовать прерывания по INT. Моя тема для воздушек. Пули, шары маленького размера.
Пневматика для спортивной стрельбы 4.5, 5.5, 6.35 мм. Длина максимум 100мм. Шары для стрейкбола диаметр 6.0мм.
Для чего нужен хронограф. Для спортивной стрельюы во время перевозки сила выстрела не должна превышать 3 Джоуля. E=M*(V^2)/2. M в килограммах. V то, что мерим м/с. Хранить по любому нужно в железном ящике. Недоступном кроме Вас ни кому.
Для стрейкбола. Мне не нравиться целится в людей. Сам не занимаюсь, но друзья увлекаются.
Все организовано, но. Если соревнования региональные, там каждый ствол проходит проверку на силу выстрела.
Когда соревнуются просто договоришись две команды. Случаи нарушения часты. Ради победы навинчивают мощьность. На более большом расстоянии бьет прицельней. Что увеличимает шанс победы, но не на равных. И черевато пробить защиту (например шлем) на близком расстоянии. Они, и так все в синяках приезжают. Шарик оставляет диаметром в 10см синяк. Но спорт, есть спорт.

Отредактировано rom-i (2020-07-19 15:58:15)

0

22

Вы прям навеяли.. Я тож в "прошлой жизни" десять лет мотался на соревнования по стрельбе, правда стрелял из боевого ПМ (макар). Интересно б подтвердить ТТХ, вроде 315м/с обещали.

Отредактировано Yuriy.pv (2020-07-19 21:06:07)

0

23

Yuriy.pv
Ясно. Но это лирика.
По теме. Поможет принудительное Stop TIMER1 сбросить захват?

0

24

Нет. Он просто останавливает таймер. Думаю надо очищать ICR

0

25

Извините за немного флуда, но полная свобода с таймерами на серии Xmega, эх и чудеса там творить можно, жаль что ТТЛ 3.3в.

+1

26

Я ща проекты в основном делаю на CR2032, так идеально получается (ведь как правило COG экраны номинальное напряжение 3В ровно).

0

27

https://upforme.ru/uploads/0000/25/b8/2019/t13149.jpg
Левый МК выдает 2 импульса то есть нормально, или 1 когда сбой. В обоих случаях нет зацикливания. МК всегда выходит из режима захвата. Но как? По переполнению TIMER1?

0

28

У него нет понятия захвата, он меряет между импульсами. В пошаговом режиме посмотрите регистры.

0

29

Yuriy.pv
Понятно все.
Единственно в симуляторе пропускается один такт таймера. Это протеус врет, или действительно он пропускается?

0

30

Не знаю, все может быть. Я протеусом давно не пользуюсь, много косяков которых нет в реальном железе. Так что сильно не доверяйте ему.

0


Вы здесь » Программирование ATMEL в BASCOM. » Таймеры, ШИМ и все про них » Вопрос про TIMER1 в режиме Capture Edge.