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

    

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: живьём проца у меня, увы, нет; а жаль - занятная балалайка.

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация