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

AT91SAM7 допустимая частота прерываний

На AT91SAM7X-EK взял пример с таймерами и переделал его под частоту срабатываний прерываний в 500КГц т.е. режим прерывания по сравнению (MCK=48МГц, TIMER_CLOCK1 = 24МГц, TC_RC = 47).

Максимально упростил проект - после инициализации таймера пустой бесконечный цикл и в самом прерывании инвертирование выхода. На практике (осциллографом) получается частота изменений (из длительности "0" или "1") максимум 460КГц, в среднем менее 400КГц, причем длительности импульсов "0" и "1" неодинаковые и постоянно болтаются.

 

Контроллер не успевает обработать прерывания или ещё есть какие-нибудь подводные камни?

И вообще можно обработать такой поток и успеть перегнать по USB?

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


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

На AT91SAM7X-EK взял пример с таймерами и переделал его под частоту срабатываний прерываний в 500КГц т.е. режим прерывания по сравнению (MCK=48МГц, TIMER_CLOCK1 = 24МГц, TC_RC = 47).

Максимально упростил проект - после инициализации таймера пустой бесконечный цикл и в самом прерывании инвертирование выхода. На практике (осциллографом) получается частота изменений (из длительности "0" или "1") максимум 460КГц, в среднем менее 400КГц, причем длительности импульсов "0" и "1" неодинаковые и постоянно болтаются.

 

Контроллер не успевает обработать прерывания или ещё есть какие-нибудь подводные камни?

И вообще можно обработать такой поток и успеть перегнать по USB?

 

Не знаю поможет ли Вам это или нет, но на плате MCBSTR-9 (процессор STR-912F) при тактовой частоте 96 Мгц минимальный пенриод срабатывания таймера получился порядка 7-10 мсек - правда я не старался сильно оптимизировать демонстрационную задачку работы с USB...

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


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

А "обработать такой поток" - что за поток, от внешнего устройства ?

Если да, то как этот девайс подключается (может, можно какой периферийный интерфейс приспособить, SPI там или SSC) ?

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


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

Не знаю поможет ли Вам это или нет, но на плате MCBSTR-9 (процессор STR-912F) при тактовой частоте 96 Мгц минимальный пенриод срабатывания таймера получился порядка 7-10 мсек - правда я не старался сильно оптимизировать демонстрационную задачку работы с USB...

 

Поправка - вместо USB надлежит читать URRT...

Глюк в моске был - када вчерась писал...

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


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

Поток данных от внешнего устройства - асинхронный и непрерывный 512КБит/с.

Алгоритм получения данных приблизительно такой: прерывание по изменению фронта, задержка (возможно вторым таймером) для подстройки под "середину" бита, затем считывание бита и запуск таймера с частотой 512КГц, а в прерывании по таймеру считывание остальных битов. Ну и переодическое повторение подстройки частоты, а в цикле передача данных по USB (по готовности).

Но похоже придется обходные пути искать, а ПЛИС цеплять очень не хочется.

 

PS: Кстати даже родной USB пример данные с неплохой скоростью гоняет - на передаче из контроллера блоков по 8КБайт (запрос один пакет) получилось ~727КБайт/с. Правда больше ничего не делалось :)

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


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

Поток данных от внешнего устройства - асинхронный и непрерывный 512КБит/с.

Алгоритм получения данных приблизительно такой: прерывание по изменению фронта, задержка (возможно вторым таймером) для подстройки под "середину" бита, затем считывание бита и запуск таймера с частотой 512КГц, а в прерывании по таймеру считывание остальных битов. Ну и переодическое повторение подстройки частоты, а в цикле передача данных по USB (по готовности).

Но похоже придется обходные пути искать, а ПЛИС цеплять очень не хочется.

 

PS: Кстати даже родной USB пример данные с неплохой скоростью гоняет - на передаче из контроллера блоков по 8КБайт (запрос один пакет) получилось ~727КБайт/с. Правда больше ничего не делалось :)

 

Лучше запустить на обработку какую-нибудь альтеру

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


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

а нельзя попробовать прикрутить для этих целей USART c STOP BITS = 0 / NO PARITY + DMA ?

 

или SPI, сделав на одном внешнем элементе генератор "клока" для него ? Всяко эффективнее и точнее будет, чем пытаться софтово это делать - и ресурсы останутся для пересылки "наверх"

 

у вас позволительна потеря части данных на время подстройки ?

Изменено пользователем _dem

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


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

а нельзя попробовать прикрутить для этих целей USART c STOP BITS = 0 / NO PARITY + DMA ?

 

или SPI, сделав на одном внешнем элементе генератор "клока" для него ? Всяко эффективнее и точнее будет, чем пытаться софтово это делать - и ресурсы останутся для пересылки "наверх"

 

у вас позволительна потеря части данных на время подстройки ?

 

Я сейчас пробую нечто подобное сделать - внешний сдвиговый регистр тактируемый от таймера 0, который (пере) запускается по внешнему прерыванию и прерывание от таймера 1 срабатывающее от 8 тактов таймера 0, в нем загружаются данные с регистра в память. В принципе контроллер такое тянет, проблема в одном - внешнее прерывание срабатывает через 1.4-1.6 микросекунды. Если время реакции уменьшить раза этак в два то должно работать.

Что касается USART - проблема будет в подстройке частоты, чую убежит/прибьется битик в поток :)

Вот с SPI уже интереснее (сам об этом не подумал) - нужен только "клок" от таймера и без внешнего регистра.

К нему DMA прикручивается?

 

Потеря данных допустима только вначале - после поток прерываться не должен, а периодические подстройки делать все равно придется.

 

В FAQ прочитал, что реакция на прерывание будет быстрее в THUMB режиме, а как его установить? Если поставить в настройках проекта в IAR, то с такой прошивкой девайс не работает.

Как вообще уменьшить время реакции на прерывание?

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


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

"...внешний сдвиговый регистр тактируемый от таймера 0..."

А какова загрузка контроллера при этом ?

 

К SPI DMA прикручивается.

 

"В FAQ прочитал, что реакция на прерывание будет быстрее в THUMB режиме, а как его установить? Если поставить в настройках проекта в IAR, то с такой прошивкой девайс не работает."

 

Какой у вас проект ( используется ли ОС, что взято за основу ИАР-ского проекта ) ?

 

Ускорить реакцию на прерывание можно, использовав FIQ

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


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

Что касается USART - проблема будет в подстройке частоты, чую убежит/прибьется битик в поток

Вот с SPI уже интереснее (сам об этом не подумал) - нужен только "клок" от таймера и без внешнего регистра. К нему DMA прикручивается?

прикручивается, но опять же, тут просто напрашивается решение на ПЛИСке.

Плисина принимает поток в fifo, и сигналит процу если fifo не пустой, проц забирает по стандартному SPI.

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


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

"...внешний сдвиговый регистр тактируемый от таймера 0..."

А какова загрузка контроллера при этом ?

 

К SPI DMA прикручивается.

 

"В FAQ прочитал, что реакция на прерывание будет быстрее в THUMB режиме, а как его установить? Если поставить в настройках проекта в IAR, то с такой прошивкой девайс не работает."

 

Какой у вас проект ( используется ли ОС, что взято за основу ИАР-ского проекта ) ?

 

Ускорить реакцию на прерывание можно, использовав FIQ

 

Что значит загрузка контроллера? Практически получается считать данные, передать по USB и подкорректировать частоту приема внешним прерыванием. Но настоящей проверки пока не делал.

Попробую переделать под SPI (внешнего регистра все равно в наличии нет) и прогнать на реальных данных. Подстройка частоты делается нормально и с такой заторможенной реакцией на прерывание, а вот поступающие данные надо проверять.

Основа проекта - BasicUSB от Atmel + добавлены обработчики прерываний, ОС естественно нет.

Даже c FIQ как я понял существенно ускорить реакцию на прерывание не получится (из FAQ).

Не посоветуете пример с SPI и DMA? (DMA в контроллерах еще не доводилось использовать).

 

to defunct: насчет ПЛИС это понятно, но требуется решение подешевле и попроще.

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


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

пример поищите в форуме, очень неоднократно обсасывалось - практически у каждого, кто запускает SPI на этом чипе, возникает масса вопросов. Если все же не найдете, отпишитесь - завтра выкушу из проекта и поделюсь, сегодня уже просто не успею

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


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

Если кому интересно, то я доделал данный проект. Правда с прерываниями не получилось - очень тормознутая система (по некоторым замерам до 12 микросекунд). Но оказалось, что средств контроллера вполне хватает, чтобы реализовать прием 512К (возможно и 2М вытянет) потока.

Коротко о реализации: данные принимаются по SPI с использованием PDC, а вот тактирует SPI внутренний таймер в режиме WAVESEL, со сбросом по внешнему событию (для подстройки такта). Ну и передача по USB на хост в главном цикле. В итоге только одно прерывание на перепрограммирование DMA контроллера.

 

Так что ПЛИС не понадобилась :)

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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