Перейти к содержанию
    

ATSAMC21N18A, ASF4: Input capture

Доброго всем дня!

В данный момент пытаюсь запустить захват по фронту на контроллере ATSAMC21N18A. Во-первых, натолкнулся на странное. Документация по ASF4 гласит, что:

Quote

For example, instead of one timer-counter driver, the ASF4 has drivers for PWM, timer, and input-capture.

Но нигде больше никакого упоминания драйвера input-capture нет, ни в ASF4, ни на онлайн-версии Atmel START, драйвер PWM есть, а этого нет. Баг в документации? А как тогда с ним работать?

Второе. Попробовал настроить сам, минуя функции ASF4, потому что, судя по коду, там в драйвере Timer можно выставить только четкие периоды, которые ставятся через регистр CC, который мне нужен как раз для захвата.

Обнаружил в документации, что можно использовать либо систему событий, либо входы-выходы таймера TC WO[0]/WO[1]. Вроде как достаточно выставить в регистре CTRLA функцию захвата:

TC0->COUNT16.CTRLA.bit.CPTEN0 = 1;

и настроить WO[0] как вход:

TC3->COUNT16.CTRLC.bit.COPEN0 = 1;

Все, больше ничего не нужно. Вопрос только в том, каким образом он должен понять, какой режим работы выбран? Это документация скромно обходит стороной. Я пробовал все возможные настройки, обнуляс счетчик в прерывании по MC0, но ничего не помогает, максимум, что я смог достичь - это расчет длины периода, то есть, расстояние между двумя восходящими фронтами PWM-сигнала, который я подаю на вход WO[0]. При этом та же документация на процессор вообще лишь раз упоминает, что WO[0] может работать как вход, сильно подозреваю, что ей вообще нельзя доверять, потому что настройка режима работы захвата (PPW/PWP/PW) предусмотрено только в режиме работы от ивентов, а не от входов.

Ок, потратил кучу времени, бросил эту затею и решил перейти на ивенты. настроил в Start событие от внешнего прерывания, оба фронта, потребителем поставил таймер TC0, выставил режим PW - не работает вообще. Выставил PWP или PPW - работает, но криво, CC1 вообще никогда не обновляется, СС0 содержит расстояние между двумя фронтами. Ага, когда повезет - верное (между положительным и отрицательным), когда нет - то, что между отрицательным и положительным. То есть, если период PWM 1000 единиц, а длительность импульса - 300, получаем то 300, то 700.

Вот мой код:

hri_mclk_set_APBCMASK_TC0_bit(MCLK);
hri_gclk_write_PCHCTRL_reg(GCLK, TC0_GCLK_ID, CONF_GCLK_TC0_SRC | (1 << GCLK_PCHCTRL_CHEN_Pos));
//timer_init(&TIMER_0, TC0, _tc_get_timer());

TC0->COUNT16.CTRLA.bit.ENABLE = 0;
while (TC0->COUNT16.SYNCBUSY.bit.STATUS);
TC0->COUNT16.CTRLA.bit.PRESCALER = 3;
TC0->COUNT16.CTRLA.bit.PRESCSYNC = TC_CTRLA_PRESCSYNC_GCLK_Val;
TC0->COUNT16.CTRLA.bit.MODE = TC_CTRLA_MODE_COUNT16;
while (TC0->COUNT16.SYNCBUSY.bit.STATUS);
TC0->COUNT16.CTRLA.bit.CAPTEN0 = 1;
TC0->COUNT16.CTRLA.bit.CAPTEN1 = 0;
while (TC0->COUNT16.SYNCBUSY.bit.STATUS);
while (TC0->COUNT16.SYNCBUSY.bit.STATUS);
TC0->COUNT16.EVCTRL.bit.TCEI = 1;
TC0->COUNT16.EVCTRL.bit.EVACT = TC_EVCTRL_EVACT_PPW_Val;
while (TC0->COUNT16.SYNCBUSY.bit.STATUS);
TC0->COUNT16.CTRLA.bit.ENABLE = 1;
while (TC0->COUNT16.SYNCBUSY.bit.STATUS);

Инициализацию таймера через ASF4 отключил по причине ее неприспособленности к работе в режиме захвата. Внешнее прерывание точно работает, проверял вызовом обработчика. Генерация событий тоже точно работает, в противном случае ничего бы таймер вообще не ловил. Проблема, как мне кажется, в работе самого таймера.

Это вообще как? Кто-то вообще смог настроить этот бред? Такое впечатление, что у некрочипа документацию вообще негры пишут уже за еду, методом копипасты.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/2/2018 at 6:40 PM, Polaris said:

Это вообще как? Кто-то вообще смог настроить этот бред? Такое впечатление, что у некрочипа документацию вообще негры пишут уже за еду, методом копипасты.

Ну не знаю... Это ещё атмел, а на их доку грех было жаловаться.

Вот это гляньте мож поможет: http://ww1.microchip.com/downloads/en/AppNotes/Atmel-42123-SAM-Timer-Counter-(TC)-Driver_ApplicationNote_AT03263.pdf 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, видел уже эту доку, свалили в кучу все процессоры, что есть, а на деле тот же D20 имеет совсем другую структуру регистров в плане TC.

И в родной доке от C21/C21 WO стоят на схеме модуля как входы-выходы, а тут только как входы. Кому верить вообще - непонятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я в таких случаях медленно и вдумчиво "курю" свежий даташит и под отладчиком (в ИАРе), бывало даже вручную, режимы\флаги проверяю-устанавливаю-сбрасываю: ядро стоит, а периферия работает ;)

Помогло раз сравнение хидер-файла на периферию с её описанием в даташите (у ацп в SAM4S забыли канал термодатчика).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

45 minutes ago, Obam said:

Я в таких случаях медленно и вдумчиво "курю" свежий даташит и под отладчиком (в ИАРе), бывало даже вручную, режимы\флаги проверяю-устанавливаю-сбрасываю: ядро стоит, а периферия работает ;)

Помогло раз сравнение хидер-файла на периферию с её описанием в даташите (у ацп в SAM4S забыли канал термодатчика).

да я тоже уже неделю курю, правда, с отладчиком не так просто, у меня нет svd под этот контроллер, так что руками только по адресам. Но в целом ситуация такова, что никто пока не смог победить захват от входов:

https://www.avrfreaks.net/forum/samc21-cannot-use-tc-capture-inputs-ppw-or-pw-modes

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

А с захватом от Event system вроде бы вышло вот с этим руководством:

https://microchipsupport.force.com/articles/en_US/FAQ/SAM-D-L-C---TC-Capture-Example-using-Atmel-START?retURL=%2Fapex%2FNewCase&amp;popup=true

То есть, только с лайтовой версией драйвера TC и только с прерываниями. Мне кажется, что даже в AVR все было на порядок продвинутее, в сравнении с армами других производителей это, конечно, полное фиаско. Как-то я себе иначе представлял банальный захват PWM.

Столько телодвижений (таймер, внешнее прерывание, EVSYS, все это связать) для того, чтобы потом в прерывании получить желаемое значение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В гугле: atsamc21n.svd. У меня 3-м результатом "Microchip pacs repository": http://packs.download.atmel.com/  и там море разливанное... ;)

В http://packs.download.atmel.com/Atmel.SAMC21_DFP.1.1.144.atpack будет и svd.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/6/2018 at 8:43 PM, Obam said:

В гугле: atsamc21n.svd. У меня 3-м результатом "Microchip pacs repository": http://packs.download.atmel.com/  и там море разливанное... ;)

В http://packs.download.atmel.com/Atmel.SAMC21_DFP.1.1.144.atpack будет и svd.

Я в EmBitz работаю, а он не понимает атмеловских svd с их кластерированием :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, тогда остаётся последовать совету из https://www.embitz.org/forum/thread-829.html : "just register w. ARM and you can have as many svd as you like"; впрочем, первоисточником всё равно будет atmel.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Quote

Обнаружил в документации, что можно использовать либо систему событий, либо входы-выходы таймера TC WO[0]/WO[1]. Вроде как достаточно выставить в регистре CTRLA функцию захвата:


TC0->COUNT16.CTRLA.bit.CPTEN0 = 1;

и настроить WO[0] как вход:


TC3->COUNT16.CTRLC.bit.COPEN0 = 1;

Это указано направление сигнала в TC.

Quote

Все, больше ничего не нужно.

Нет нужно. WO это периферийная функция E или F, в настройках для нужных выводов в IO-контроллере должно быть настроено, что это не GPIO, а соответствующая периферия, вход (из ваших постов этого не видно).

Quote

При этом та же документация на процессор вообще лишь раз упоминает, что WO[0] может работать как вход, сильно подозреваю, что ей вообще нельзя доверять, потому что настройка режима работы захвата (PPW/PWP/PW) предусмотрено только в режиме работы от ивентов, а не от входов.

Ну, вообще-то: NOTE на стр. 713 DS60001479B.pdf

PS: живьём проца у меня, увы, нет; а жаль - занятная балалайка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/9/2018 at 11:07 PM, Obam said:

Ну, тогда остаётся последовать совету из https://www.embitz.org/forum/thread-829.html : "just register w. ARM and you can have as many svd as you like"; впрочем, первоисточником всё равно будет atmel.

Нет, не поможет, EmBitz не поддерживает кластеры в svd, так что результат будет тот же самый. Хорошая оболочка, но, к сожалению, автор ее не развивает...

2 hours ago, Obam said:

Это указано направление сигнала в TC.

Нет нужно. WO это периферийная функция E или F, в настройках для нужных выводов в IO-контроллере должно быть настроено, что это не GPIO, а соответствующая периферия, вход (из ваших постов этого не видно).

Ну, вообще-то: NOTE на стр. 713 DS60001479B.pdf

PS: живьём проца у меня, увы, нет; а жаль - занятная балалайка.

Да, мультиплексирование я включил, проблема не в этом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...