Serg_Sm 0 4 октября, 2007 Опубликовано 4 октября, 2007 · Жалоба На AT91SAM7X-EK взял пример с таймерами и переделал его под частоту срабатываний прерываний в 500КГц т.е. режим прерывания по сравнению (MCK=48МГц, TIMER_CLOCK1 = 24МГц, TC_RC = 47). Максимально упростил проект - после инициализации таймера пустой бесконечный цикл и в самом прерывании инвертирование выхода. На практике (осциллографом) получается частота изменений (из длительности "0" или "1") максимум 460КГц, в среднем менее 400КГц, причем длительности импульсов "0" и "1" неодинаковые и постоянно болтаются. Контроллер не успевает обработать прерывания или ещё есть какие-нибудь подводные камни? И вообще можно обработать такой поток и успеть перегнать по USB? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NikolayZ 0 4 октября, 2007 Опубликовано 4 октября, 2007 · Жалоба На 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... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_dem 0 5 октября, 2007 Опубликовано 5 октября, 2007 · Жалоба А "обработать такой поток" - что за поток, от внешнего устройства ? Если да, то как этот девайс подключается (может, можно какой периферийный интерфейс приспособить, SPI там или SSC) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
NikolayZ 0 5 октября, 2007 Опубликовано 5 октября, 2007 · Жалоба Не знаю поможет ли Вам это или нет, но на плате MCBSTR-9 (процессор STR-912F) при тактовой частоте 96 Мгц минимальный пенриод срабатывания таймера получился порядка 7-10 мсек - правда я не старался сильно оптимизировать демонстрационную задачку работы с USB... Поправка - вместо USB надлежит читать URRT... Глюк в моске был - када вчерась писал... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_Sm 0 5 октября, 2007 Опубликовано 5 октября, 2007 · Жалоба Поток данных от внешнего устройства - асинхронный и непрерывный 512КБит/с. Алгоритм получения данных приблизительно такой: прерывание по изменению фронта, задержка (возможно вторым таймером) для подстройки под "середину" бита, затем считывание бита и запуск таймера с частотой 512КГц, а в прерывании по таймеру считывание остальных битов. Ну и переодическое повторение подстройки частоты, а в цикле передача данных по USB (по готовности). Но похоже придется обходные пути искать, а ПЛИС цеплять очень не хочется. PS: Кстати даже родной USB пример данные с неплохой скоростью гоняет - на передаче из контроллера блоков по 8КБайт (запрос один пакет) получилось ~727КБайт/с. Правда больше ничего не делалось :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Vitaliy_ARM 0 5 октября, 2007 Опубликовано 5 октября, 2007 · Жалоба Поток данных от внешнего устройства - асинхронный и непрерывный 512КБит/с. Алгоритм получения данных приблизительно такой: прерывание по изменению фронта, задержка (возможно вторым таймером) для подстройки под "середину" бита, затем считывание бита и запуск таймера с частотой 512КГц, а в прерывании по таймеру считывание остальных битов. Ну и переодическое повторение подстройки частоты, а в цикле передача данных по USB (по готовности). Но похоже придется обходные пути искать, а ПЛИС цеплять очень не хочется. PS: Кстати даже родной USB пример данные с неплохой скоростью гоняет - на передаче из контроллера блоков по 8КБайт (запрос один пакет) получилось ~727КБайт/с. Правда больше ничего не делалось :) Лучше запустить на обработку какую-нибудь альтеру Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_dem 0 8 октября, 2007 Опубликовано 8 октября, 2007 (изменено) · Жалоба а нельзя попробовать прикрутить для этих целей USART c STOP BITS = 0 / NO PARITY + DMA ? или SPI, сделав на одном внешнем элементе генератор "клока" для него ? Всяко эффективнее и точнее будет, чем пытаться софтово это делать - и ресурсы останутся для пересылки "наверх" у вас позволительна потеря части данных на время подстройки ? Изменено 8 октября, 2007 пользователем _dem Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_Sm 0 8 октября, 2007 Опубликовано 8 октября, 2007 · Жалоба а нельзя попробовать прикрутить для этих целей USART c STOP BITS = 0 / NO PARITY + DMA ? или SPI, сделав на одном внешнем элементе генератор "клока" для него ? Всяко эффективнее и точнее будет, чем пытаться софтово это делать - и ресурсы останутся для пересылки "наверх" у вас позволительна потеря части данных на время подстройки ? Я сейчас пробую нечто подобное сделать - внешний сдвиговый регистр тактируемый от таймера 0, который (пере) запускается по внешнему прерыванию и прерывание от таймера 1 срабатывающее от 8 тактов таймера 0, в нем загружаются данные с регистра в память. В принципе контроллер такое тянет, проблема в одном - внешнее прерывание срабатывает через 1.4-1.6 микросекунды. Если время реакции уменьшить раза этак в два то должно работать. Что касается USART - проблема будет в подстройке частоты, чую убежит/прибьется битик в поток :) Вот с SPI уже интереснее (сам об этом не подумал) - нужен только "клок" от таймера и без внешнего регистра. К нему DMA прикручивается? Потеря данных допустима только вначале - после поток прерываться не должен, а периодические подстройки делать все равно придется. В FAQ прочитал, что реакция на прерывание будет быстрее в THUMB режиме, а как его установить? Если поставить в настройках проекта в IAR, то с такой прошивкой девайс не работает. Как вообще уменьшить время реакции на прерывание? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_dem 0 8 октября, 2007 Опубликовано 8 октября, 2007 · Жалоба "...внешний сдвиговый регистр тактируемый от таймера 0..." А какова загрузка контроллера при этом ? К SPI DMA прикручивается. "В FAQ прочитал, что реакция на прерывание будет быстрее в THUMB режиме, а как его установить? Если поставить в настройках проекта в IAR, то с такой прошивкой девайс не работает." Какой у вас проект ( используется ли ОС, что взято за основу ИАР-ского проекта ) ? Ускорить реакцию на прерывание можно, использовав FIQ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 8 октября, 2007 Опубликовано 8 октября, 2007 · Жалоба Что касается USART - проблема будет в подстройке частоты, чую убежит/прибьется битик в поток Вот с SPI уже интереснее (сам об этом не подумал) - нужен только "клок" от таймера и без внешнего регистра. К нему DMA прикручивается? прикручивается, но опять же, тут просто напрашивается решение на ПЛИСке. Плисина принимает поток в fifo, и сигналит процу если fifo не пустой, проц забирает по стандартному SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_Sm 0 8 октября, 2007 Опубликовано 8 октября, 2007 · Жалоба "...внешний сдвиговый регистр тактируемый от таймера 0..." А какова загрузка контроллера при этом ? К SPI DMA прикручивается. "В FAQ прочитал, что реакция на прерывание будет быстрее в THUMB режиме, а как его установить? Если поставить в настройках проекта в IAR, то с такой прошивкой девайс не работает." Какой у вас проект ( используется ли ОС, что взято за основу ИАР-ского проекта ) ? Ускорить реакцию на прерывание можно, использовав FIQ Что значит загрузка контроллера? Практически получается считать данные, передать по USB и подкорректировать частоту приема внешним прерыванием. Но настоящей проверки пока не делал. Попробую переделать под SPI (внешнего регистра все равно в наличии нет) и прогнать на реальных данных. Подстройка частоты делается нормально и с такой заторможенной реакцией на прерывание, а вот поступающие данные надо проверять. Основа проекта - BasicUSB от Atmel + добавлены обработчики прерываний, ОС естественно нет. Даже c FIQ как я понял существенно ускорить реакцию на прерывание не получится (из FAQ). Не посоветуете пример с SPI и DMA? (DMA в контроллерах еще не доводилось использовать). to defunct: насчет ПЛИС это понятно, но требуется решение подешевле и попроще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_dem 0 8 октября, 2007 Опубликовано 8 октября, 2007 · Жалоба пример поищите в форуме, очень неоднократно обсасывалось - практически у каждого, кто запускает SPI на этом чипе, возникает масса вопросов. Если все же не найдете, отпишитесь - завтра выкушу из проекта и поделюсь, сегодня уже просто не успею Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serg_Sm 0 23 октября, 2007 Опубликовано 23 октября, 2007 · Жалоба Если кому интересно, то я доделал данный проект. Правда с прерываниями не получилось - очень тормознутая система (по некоторым замерам до 12 микросекунд). Но оказалось, что средств контроллера вполне хватает, чтобы реализовать прием 512К (возможно и 2М вытянет) потока. Коротко о реализации: данные принимаются по SPI с использованием PDC, а вот тактирует SPI внутренний таймер в режиме WAVESEL, со сбросом по внешнему событию (для подстройки такта). Ну и передача по USB на хост в главном цикле. В итоге только одно прерывание на перепрограммирование DMA контроллера. Так что ПЛИС не понадобилась :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться