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

Какой подход выбрать?

Доброго времени суток.

 

Есть необходимость генерировать на AT91SAM7s256 сигнал с частотой 4 МГц и вызовом прерываниия.

 

Получится ли настроить прерывание от какого-нибудь таймера на такую частоту?

Можно ли программируемым тактовым сигналом PCKx вызывать прерывание контроллера ввода-вывода на изменение состояния порта?

Если нет, то удастся ли вывести PCKx наружу и тут же завести на соседний вывод с настроенным прерыванием на изменение состояния порта?

Стоит ли использовать для генерации сигнала и прерывания ШИМ контроллер?

 

Подскажите, пожалуйста, какой подход наиболее предпочтителен?

 

P. S. Если не затруднит, ещё один блиц-вопрос... У меня выход PLL равен 128 МГц. В регистре PMC_MCKR указал тактирование от PLL и значение делителя 4. Это означает, что задающий сигнал MCK равен 32 МГц, а процессорный тактовый сигнал PCK равен 128МГц?

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


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

Генерацию прерывания с частотой 4 МГц на этом процессоре - зачем? (не успеть обработать). Или какие-то ещё побочные эффекты будут использоваться?

Просто выход с частотой 4 МГц получить при тактовой частоте, кратной 8 МГц (или 16 МГц в случае если требуется меандр на выходе) вполне возможно - минимальный предделителдь для таймера 2.

 

 

Вот вам кусок кода из проекта - может, поможет?

/* 
  инициализация внутреннего умножителя частоты. 
  Вход - 12 МГц, кварцевый резонатор 
  внутренняя тактовая - 48 МГц, 
  частота генератора - 96 МГц 
  Частота сравнения PLL = 12 МГц
*/
static void lowlevel_init_pll_clock_48_xtal12(void)
{
    enum { osc_mul = 8, osc_div = 1 };    // 12 MHz / 1 * 8 = 96 MHz

    // before reprogramming - set safe waitstates
    AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_2FWS;

    ///////////////////////////////////////////////////////////////////////////
    // Init PMC Step 1. Enable Main Oscillator
    // Main Oscillator startup time is board specific:
    // Main Oscillator Startup Time worst case (3MHz) corresponds to 15ms
    // (0x40 for AT91C_CKGR_OSCOUNT field)
    ///////////////////////////////////////////////////////////////////////////
    AT91C_BASE_PMC->PMC_MOR = (((AT91C_CKGR_OSCOUNT & (0x40 << 8)) | AT91C_CKGR_MOSCEN));
    // Wait Main Oscillator stabilization
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MOSCS))
    ;
    ///////////////////////////////////////////////////////////////////////////
    // Init PMC Step 2.
    // Set PLL to 96MHz (96,109MHz) and UDP Clock to 48MHz
    // PLL Startup time depends on PLL RC filter: worst case is choosen
    // UDP Clock (48,058MHz) is compliant with the Universal Serial Bus
    // Specification (+/- 0.25% for full speed)
    ///////////////////////////////////////////////////////////////////////////
    AT91C_BASE_PMC->PMC_PLLR = 
                        AT91C_CKGR_USBDIV_1 |
                        AT91C_CKGR_OUT_0 |
                        (AT91C_CKGR_PLLCOUNT & (16 << 8)) |        // PLL lock signalling delay
                        (AT91C_CKGR_MUL & ((osc_mul - 1) << 16)) |
                        (AT91C_CKGR_DIV & osc_div);        
    
    // Wait for PLL stabilization
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_LOCK))
    ;
    
    // Wait until the master clock is established for the case we already
    // turn on the PLL
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY))
    ;

    ///////////////////////////////////////////////////////////////////////////
    // Init PMC Step 3.
    // Selection of Master Clock MCK equal to (Processor Clock PCK) PLL/2=48MHz
    // The PMC_MCKR register must not be programmed in a single write operation
    // (see. Product Errata Sheet)
    ///////////////////////////////////////////////////////////////////////////
    AT91C_BASE_PMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2;    // тактовая частота процессора 96 / 2 = 48

    // Wait until the master clock is established
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY))
    ;

    AT91C_BASE_PMC->PMC_MCKR = (AT91C_PMC_PRES_CLK_2 | AT91C_PMC_CSS_PLL_CLK);

    // Wait until the master clock is established
    while (!(AT91C_BASE_PMC->PMC_SR & AT91C_PMC_MCKRDY))
    ;

    // as final stage - set desired waitstates
    AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS; // 1 Wait State to work at 48 MHz
}

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

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


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

4 МГц нужны для тактирования ПЗС-линейки, поэтому нужны прерывания для подсчёта количества считанных пикселей. Так же по мере поступления от внешнего АЦП с частотой 2 МГц нужно укладывать данные в память и периодически генерировать ещё несколько сигналов.

 

Спасибо, как я понимаю сигналы PCK и MCK всгда равны?

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


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

Для этого процессора - частота работы процессора и частота тактирования периферии равны.

Варианты применения внешнего АЦП с последовательным интерфейсом и приспособить для передачи данных от него SSC или SPI рассматривали?

А так - без прерываний, с запрещёнными прерываниями, в цикле - считывать с паралельного порта. И то, озаботиться о первых командах - пока заполнится конвеер.

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


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

4 МГц нужны для тактирования ПЗС-линейки, поэтому нужны прерывания для подсчёта количества считанных пикселей. Так же по мере поступления от внешнего АЦП с частотой 2 МГц нужно укладывать данные в память и периодически генерировать ещё несколько сигналов.

 

Спасибо, как я понимаю сигналы PCK и MCK всгда равны?

Не равны, PCK сам по себе, MCK сам по себе. В частном случае, когда источник сигнала и предделители одинаковые могут совпадать.

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


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

Для этого процессора - частота работы процессора и частота тактирования периферии равны.

Варианты применения внешнего АЦП с последовательным интерфейсом и приспособить для передачи данных от него SSC или SPI рассматривали?

А так - без прерываний, с запрещёнными прерываниями, в цикле - считывать с паралельного порта. И то, озаботиться о первых командах - пока заполнится конвеер.

 

Пока использование АЦП с последовательным интерфейсом не рассматривалось. Подскажите, пожалуйста, примеры таких АЦП, способных работать на частоте не менее 4МГц.

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

 

Можно ли сделать вывод, что AT91SAM7s256 не подойдет для генерации нескольких тактовых сигналов с частотами от 1 до 4 МГц и одновременной обработкой данных от АЦП из-за недостаточной скорости работы процессора?

 

 

Не равны, PCK сам по себе, MCK сам по себе. В частном случае, когда источник сигнала и предделители одинаковые могут совпадать.

 

Разве сигналы PCK и MCK не настраиваются через один регистр PMC_MCKR с помощью полей CSS и PRES? Как они могут оказаться не равны?

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


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

Не вникая в доставаемость - параметрический поиск от АналогДевайсов выдал AD7356 и AD7357.

Ещё немного поискал - вообще на ваш случай AD7626.

Интересный момент - до 3 MS/S выбор гораздо больше. Ваш случай (4 MS/S) сильно ограничивает в выборе микросхем.

Осталось узнать, выдержит ли требуемую тактовую (32 МГц для 8 бит АЦП) SSC.

Ещё подумал о внешнем перобразователе паралельного кода в последовательный.

 

PS: только сейчас заметил, что Вам надо 2 MS/S. Всё проще будет.

 

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

Нет, в данном случае формировать сигналы для запуска перобразования пришлось бы программно.

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

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


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

не тот проц вы для пзс пихаете. вам плис нуженлибо DSP с тактовой ~400mhz.

еслли чисто для генерации клока/переливки данных - Altera MAX2 то,что надо

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


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

Разве сигналы PCK и MCK не настраиваются через один регистр PMC_MCKR с помощью полей CSS и PRES? Как они могут оказаться не равны?

Если речь идет именно о периферийной функции вывода PCK, то они настраиваются в своих собственных регистрах, а если о Processor Clock(PCK)??? то он равен MCK.

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


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

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

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

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

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

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

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

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

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

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