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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Xmega захват длительности импульса


Xmega захват длительности импульса

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

1

Возникла необходимость в замере длительности импульсов.
В описании на МК нашел следующее:
http://sg.uploads.ru/t/X56MP.jpg

Код:

Код:
'*******************************************************************************
 Config Portc.0 = Input
 Config Xpin = Portc.0 , Outpull = Pulldown , Sense = Both  ' Подтяжка к минусу питания, Both-обнаружение обоих фронтов
'*******************************************************************************
' Источник событий PORTC_PIN0, коэффициент цифрового фильтра = 8
 Config Event_system = Dummy , Mux0 = Portc.0 , Digflt0 = 8
'-------------------------------------------------------------------------------
' Конфигурация таймера=Normal, выбор синхронизации=EVCH0, канал события=0, PWC-захват длительности импульса
 Config Tcc0 = Normal , Prescale = E0 , Event_source = E0 , Event_action = Pwc
'*******************************************************************************

Do
'-------------------------------------------------------------------------------
  Locate 2 , 1 : Lcd "TCC0_CNT = " ; Tcc0_cnt
'-------------------------------------------------------------------------------
Loop

'*******************************************************************************


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

Пробовал напрямую к регистрам обращаться, то же самое.

Код:
'*******************************************************************************
  Portc_dir = &B00000000                                    ' PORTC на вход
  Portc_pin0ctrl = &B0_0_010_000                            ' Подтяжка к минусу питания, обнаружение обоих фронтов
'-------------------------------------------------------------------------------
  Evsys_ch0mux = &B0110_0000                                ' Мультиплексор канала событий - источник событий PORTC_PIN0
  Evsys_ch0ctrl = &B00_0_0_111                              ' Значение коэффициента цифрового фильтра - 8
  Tcc0_ctrla = &B0000_1000                                  ' Выбор синхронизации - EVCH0
  Tcc0_ctrlb = &B0000_0000                                  ' Конфигурация таймера - Normal
  Tcc0_ctrld = &B110_0_1000                                 ' Захват длительности импульса, канал события - 0
'*******************************************************************************

Do
'-------------------------------------------------------------------------------
  Locate 2 , 1 : Lcd "TCC0_CNT = " ; Tcc0_cnt
'-------------------------------------------------------------------------------
Loop

'*******************************************************************************


Подскажите пожалуйста как правильно реализовать данную функцию.

0

2

Хм... я ещё это не использовал.
По идее таймер тут будет считать не длительность импульса, а просто кол-во прерываний канала события.
Возможно режим таймера не тот или его  Prescale = E0 , Event_source = E0 - по идее он должен набрать нужное кол-во чего-то между импульсами.

0

3

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

по идее он должен набрать нужное кол-во чего-то между импульсами.

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

0

4

Рабочий код, фиксирует длительность от 20 мкс до 100 мс ( можно и больше )

Код:
'*******************************************************************************
$regfile = "xm64a3def.dat"
$crystal = 32000000
$hwstack = 80
$swstack = 80
$framesize = 80
'*******************************************************************************
  Config Osc = Disabled , Extosc = Enabled , Pllosc = Enabled , Range = 2mhz_9mhz , _
  Startup = Xtal_1kclk , Pllsource = Extclock , Pllmul = 4
  Config Sysclock = Pll , Prescalea = 1 , Prescalebc = 1_1
  Config Priority = Static , Vector = Application , Lo = Enabled
  Enable Interrupts
'*******************************************************************************

  Config Lcd = 20 * 4
  Config Lcdpin = Pin , Rs = Portf.2 , E = Portf.3 , Db4 = Portf.4 , Db5 = Portf.5 , Db6 = Portf.6 , Db7 = Portf.7
  Initlcd                                                   ' Иницилиция дисплея
  Cursor Off
  Cls
'*******************************************************************************


'*******************************************************************************
  Config Pinc.0 = Input
  Config Xpin = Pinc.0 , Sense = Both , Outpull = Pulldown  ' Подтяжка к минусу питания, Both-обнаружение обоих фронтов
'*******************************************************************************
' Источник событий PORTC_PIN0, коэффициент цифрового фильтра = 8
  Config Event_system = Dummy , Mux0 = Portc.0 , Digflt0 = 8
'-------------------------------------------------------------------------------
  Config Tcc0 = Normal , Prescale = 64 , Capturea = Enabled , Event_source = E0 , Event_action = Pwc
'******************************************************************************
  Enable Interrupts
'*******************************************************************************

  Dim Длительность As Single
  Dim Индикация_длительность As String * 5

'*******************************************************************************
Do


  Длительность = Tcc0_cca
  Длительность = Длительность / 500
  Индикация_длительность = Fusing(длительность , "0.000")
  Locate 3 , 1 : Lcd "TCC0_CCA = " ; Индикация_длительность ; " ms"

  Waitms 200


Loop

'*******************************************************************************


В чем был косяк можно найти здесь:
http://s5.uploads.ru/t/hAI57.jpg

0

5

А я как раз про это и говорил:  Prescale = 64 .... Event_source = E0 , источник тактировании и события при подсчёте в интервале времени не должны быть одним источником. :writing:

0

6

Да, проблема была в синхронизации.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Xmega захват длительности импульса