Здравствуйте дорогие форумчане!!!
Делаю хронограф. Решил использовать для изтерения Т единственный порт в Мега8 ICP1.
Что произойдет если первый импульс запустит таймер, а второго не будет?
Вопрос про TIMER1 в режиме Capture Edge.
Сообщений 1 страница 30 из 35
Поделиться12020-07-17 18:43:22
Поделиться22020-07-17 21:01:28
Скорее всего пойдет по кругу.
Поделиться32020-07-17 21:59:28
Yuriy.pv
Должен пойти. Каждое переполнение можно тоже как то считать.
Как?
Поделиться42020-07-17 22:49:27
Прерывание по переполнению 
Поделиться52020-07-17 23:10:02
Yuriy.pv
$regfile = "m8adef.dat"
$crystal = 16000000
'========================настраиваем таймер в режим захвата================
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Falling
On Capture1 Захват
'----------------------------------------------------------------------------------------------------------------
Захват:
Длительность = Capture1
Timer1 = 0
W = 1
Return
Как считать переполнения?
Не создовал бы тему, если бы она решалась очень просто.
Поделиться62020-07-17 23:12:50
Весь код.
$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Поделиться72020-07-18 00:27:55
Что произойдет если первый импульс запустит таймер, а второго не будет?
К сожалению в AVR (включая xmega) нет такого полезного режима работы таймера как ШИМ захват. Можно было бы организовать выход по таймауту.
Поделиться82020-07-18 06:59:15
'=============================настраиваем таймер в режим захвата================
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)
Поделиться92020-07-18 08:34:14
Как я понял, импульс на ICP нужен только для запуска таймера? Если так, то можно попробовать в обработчике прерывания по захвату переконфигурировать таймер на работу по переполнению. Не уверен, что будет работать, но можно попробовать.
Поделиться102020-07-18 15:56:40
Yuriy.pv
Про это как раз думал. Как правильно прописать не знаю.
On Capture1 Захват
On Timer1 T_ovf
В принипе рабочее выражение. Тож мну в сначала так придумалось.
Только попроще.
If TIMER1 = 5000 Then TIMER1 = 0
Только это не останавливает таймер. Он считать начал по спаду на землю(0).
Остановиться только следующим импульсом.
Как реально его остановить, без резета МК?
Отредактировано rom-i (2020-07-18 15:57:41)
Поделиться112020-07-18 16:04:06
Yuriy.pv
Не плохая тема. Та можно считать количество переполнений таймера.
T_ovf: 'переполнение
Incr Count_tovf
Return
Но не останавливает захват.
Количество переполнений можно считать хоть год. Инкорнируй переменные.
Вопрос. Как сбросить таймер в режиме захвата?
ВДТ не предлогать. Без сброса МК.
Отредактировано rom-i (2020-07-18 16:08:03)
Поделиться122020-07-18 16:28:52
Вообще реально
If Capture1 > 65534 Then
Disable Capture1
TIMER1 = 0
Длительность = 0
Waitms 10
Enable Capture1
End If
Но это как то по детски.
Поделиться132020-07-18 16:47:48
"ВДТ не предлогать. Без сброса МК." - я и не предлогаю сброс. Его можно и как таймер использовать.
Если вы хотите мерить период, то Count_tovf поможет на длительных задержках..
Time = Count_tovf*65535+timer1.
А сбрасывать можно по таймауту.
Если просто сбросить счетчик то timer1=0
Отредактировано Yuriy.pv (2020-07-18 16:50:11)
Поделиться142020-07-18 19:15:33
Yuriy.pv
Time = Count_tovf*65535+timer
Это инопланетное вторжение?
Поделиться152020-07-18 19:20:49
Yuriy.pv
Вопрос задан не про среднеквадратичное число.
Про работу таймера, в режиме захвата.
Поделиться162020-07-19 07:49:49
Решил использовать для изтерения Т единственный порт в Мега8 ICP1.
Что произойдет если первый импульс запустит таймер, а второго не будет?
Думал, что время измеряете. 
Поделиться172020-07-19 08:30:31
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)
Поделиться182020-07-19 09:11:59
Ааа.. Так вам и не нужны днинные измерения, ну да тогда Err при пераполнении. Я не придал значения что хронограф делаете..
Поделиться192020-07-19 11:22:44
Yuriy.pv
Двухбайтного таймера хватает, ну просто за глаза. 16 мГц точность очень отличная. 4мкс.
Скорость звука 331м/c. Даже если принять, что создали инженеры, это 10 махов. 3310м/c. Таймера хватит по любому. Ведь L можно изменять как душе угодно. Конструктивно.
В данном случае надобность измерения от 50 до 350 м/c. Рогатка, воздушка, стрейкбольные воздушки.
В основном народ делает на двух прерываниях INT. Первое запускает таймер, второе останавливат. Можно мерить даже стрельбу из лука. Просто решил изучить именно CAPTURE.
С INT гораздно проще. Необходимые задержки в тиках сами собой компенсируются. А вот в режиме захвата буду позжее спрашивать.
Сколько тиков уйдет на запуск, и остановку таймера. Можно считать это вопросом.
Поделиться202020-07-19 15:12:00
Датчики в паралельно ставятся? Как с длинным предметом, когда перекрываются оба, если длинный 2 импульса, при коротком 4.
Поделиться212020-07-19 15:57:26
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)
Поделиться222020-07-19 21:05:37
Вы прям навеяли.. Я тож в "прошлой жизни" десять лет мотался на соревнования по стрельбе, правда стрелял из боевого ПМ (макар). Интересно б подтвердить ТТХ, вроде 315м/с обещали.
Отредактировано Yuriy.pv (2020-07-19 21:06:07)
Поделиться232020-07-20 13:25:42
Yuriy.pv
Ясно. Но это лирика.
По теме. Поможет принудительное Stop TIMER1 сбросить захват?
Поделиться242020-07-20 14:24:36
Нет. Он просто останавливает таймер. Думаю надо очищать ICR
Поделиться252020-07-21 00:36:12
Извините за немного флуда, но полная свобода с таймерами на серии Xmega, эх и чудеса там творить можно, жаль что ТТЛ 3.3в.
Поделиться262020-07-21 09:05:21
Я ща проекты в основном делаю на CR2032, так идеально получается (ведь как правило COG экраны номинальное напряжение 3В ровно).
Поделиться282020-07-21 13:33:24
У него нет понятия захвата, он меряет между импульсами. В пошаговом режиме посмотрите регистры.
Поделиться292020-07-21 17:57:22
Yuriy.pv
Понятно все.
Единственно в симуляторе пропускается один такт таймера. Это протеус врет, или действительно он пропускается?
Поделиться302020-07-21 22:36:29
Не знаю, все может быть. Я протеусом давно не пользуюсь, много косяков которых нет в реальном железе. Так что сильно не доверяйте ему.
