Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как подключить ТС на тактирование от PA0
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Тема
Как я понял от PA0 (TIOA0) может тактироваться лишь TC1
Я включил PA0 в режим B,
в TC1 в TC_CMR тактирование от XC0
но как подключить ХС0 к PA0, в даташите сказано что надо именить TC_BMR но как модифицировать не понял,что попробовал не получилось.
Подскажите как модифицировать BMR и что сделать дальше чтоб счетчик просто считал импульсы без прерывания. 05.gif

ATSAM7S256 процессор
_dem
-оффтоп-
Уважаемый Тема, на этом форуме принято отписыватся, чем закончились поиски решения той либо иной проблемы, а не создавать темы и исчезать после получения ответов на вопросы.

Другие люди могут столкнутся с подобными проблемами, и ветки форума помогут им решить их, а не просто приведут к мысли, что они во Вселенной не одиноки.

p/s. 2zltigo : готов пройти профилактическое промывание smile.gif но уж больно много народу подобного появилось в последнее время
Тема
У меня ничего и не получилось...Не знаю про что вы говорите
Код
#define Q24        (1<<0)     /* PA0  */
void AT91F_TC_Open (void)
//* Begin
{
    unsigned int dummy;
    //* First, enable the clock of the TIMER
         AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< AT91C_ID_TC1 );          
     //Config A and B mode in PIO
        AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA,0,Q24);        
     //* Disable the clock and the interrupts
     AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKDIS;
     AT91C_BASE_TC1->TC_IDR = 0xFFFFFFFF;
    //* Clear status bit
        dummy = AT91C_BASE_TC1->TC_SR;
    //* Suppress warning variable "dummy" was set but never used
        dummy = dummy;
    //* Set the Mode of the Timer Counter
     AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_XC1;
    //* Set the TCB_BMR of the TIOA0    
        AT91C_BASE_TCB->TCB_BMR|=AT91C_TCB_TC1XC1S_TIOA0;
    //* Enable the clock
     AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN;
}


Вот код почему он не работает?
SpiritDance
Цитата(Тема @ Feb 6 2008, 12:40) *
Вот код почему он не работает?

Потому что он идиотский. smile.gif
Я не понял что конкретно вам нужно получить в итоге, поэтому отвечу только на один вопрос
Как тактировать канал один1 от канала 0.
Для этого нужно сконфигурировать канал 0 на генерацию импульсов нужной вам тактовой частоты.
Код
    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_TC0);
//  можно отдать внешний вывод таймеру и посмотреть на нашу тактовую частоту
//    AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, 0, AT91C_PA15_TIOA0);


    AT91C_BASE_TC0->TC_CMR =   prescalerMask            
                             | AT91C_TC_WAVE
                             | AT91C_TC_WAVESEL_UP_AUTO
                             | AT91C_TC_ACPA_CLEAR          /* сброс tioa1 в начале работы      */
                             | AT91C_TC_ACPC_SET            /* установка в конце                */
                             | AT91C_TC_ASWTRG_SET          /* линии TIOA0 в 1                  */

    AT91C_BASE_TC0->TC_RA = 1;
    AT91C_BASE_TC0->TC_RC = interval+1;


В блоке BCR XC1 либо XC2 как TIOA0
Код
AT91C_BASE_TCB->TCB_BMR =  AT91C_TCB_TC0XC0S_NONE
                                                | AT91C_TCB_TC1XC1S_TIOA0
                                                | AT91C_TCB_TC2XC2S_NONE;

сконфигурировать канал 1 на тактирование от XC1 либо XC2
Код
    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_TC1);
    AT91C_BASE_TC1->TC_CMR =   AT91C_TC_CLKS_XC1
                             | AT91C_TC_WAVE
                             | AT91C_TC_WAVESEL_UP_AUTO
                             | AT91C_TC_ACPA_CLEAR          /* сброс tioa1 в начале работы      */
                             | AT91C_TC_ACPC_SET            /* установка в конце                */
                             | AT91C_TC_ASWTRG_SET          /* линии TIOA0 в 1                  */

    AT91C_BASE_TC1->TC_RA = 1;
    AT91C_BASE_TC1->TC_RC = interval+1;


незабудьте только запустить это хозяйство.
_dem
Что в итоге нужно получить ? считать импульсы на ноге или количество срабатываний счетчика ?
Тема
Цитата(SpiritDance @ Feb 6 2008, 15:14) *
Потому что он идиотский. smile.gif
Я не понял что конкретно вам нужно получить в итоге, поэтому отвечу только на один вопрос
Как тактировать канал один1 от канала 0.
Для этого нужно сконфигурировать канал 0 на генерацию импульсов нужной вам тактовой частоты.
Код
    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_TC0);
//  можно отдать внешний вывод таймеру и посмотреть на нашу тактовую частоту
//    AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, 0, AT91C_PA15_TIOA0);
    AT91C_BASE_TC0->TC_CMR =   prescalerMask            
                             | AT91C_TC_WAVE
                             | AT91C_TC_WAVESEL_UP_AUTO
                             | AT91C_TC_ACPA_CLEAR          /* сброс tioa1 в начале работы      */
                             | AT91C_TC_ACPC_SET            /* установка в конце                */
                             | AT91C_TC_ASWTRG_SET          /* линии TIOA0 в 1                  */

    AT91C_BASE_TC0->TC_RA = 1;
    AT91C_BASE_TC0->TC_RC = interval+1;


В блоке BCR XC1 либо XC2 как TIOA0
Код
AT91C_BASE_TCB->TCB_BMR =  AT91C_TCB_TC0XC0S_NONE
                                                | AT91C_TCB_TC1XC1S_TIOA0
                                                | AT91C_TCB_TC2XC2S_NONE;

сконфигурировать канал 1 на тактирование от XC1 либо XC2
Код
    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_TC1);
    AT91C_BASE_TC1->TC_CMR =   AT91C_TC_CLKS_XC1
                             | AT91C_TC_WAVE
                             | AT91C_TC_WAVESEL_UP_AUTO
                             | AT91C_TC_ACPA_CLEAR          /* сброс tioa1 в начале работы      */
                             | AT91C_TC_ACPC_SET            /* установка в конце                */
                             | AT91C_TC_ASWTRG_SET          /* линии TIOA0 в 1                  */

    AT91C_BASE_TC1->TC_RA = 1;
    AT91C_BASE_TC1->TC_RC = interval+1;


незабудьте только запустить это хозяйство.

Мне таймер надо тактировать от внешних импульсов с PA0
SpiritDance
Цитата(Тема @ Feb 6 2008, 15:18) *
Мне таймер надо тактировать от внешних импульсов с PA0

Это невозможно.
С PA0 можно делать захват. Тактировать таймер можно с TCLK0. Это PA4.

Например для канала 2.

Код
void set_timer_channel2_to_counter_mode(void)
{
    /* назначаем обработчик прерывания в AIC */
    AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_TC2,
                          AIC_PRIOR_TIMER2, AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,
                          (void(*)(void)) ih_timer2_overflow);

    /* разрешаем прерывание от канала 0 таймера-счетчика */
    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_TC2);

    /* подключаем к каналу внешнюю частоту и включаем вывод */
    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_TC2);
    AT91F_PIO_CfgPeriph(AT91C_BASE_PIOA, 0, AT91C_PA29_TCLK2);

    /* разрешаем преравыния по преполнению */
    AT91F_TC_InterruptEnable(AT91C_BASE_TC2, AT91C_TC_COVFS);  

    /* счетчик внешних импульсов */
    AT91C_BASE_TC2->TC_CMR = AT91C_TC_CLKS_XC2
                             |
                             AT91C_TC_WAVESEL_UP_AUTO
                             |
                             AT91C_TC_LDRA_RISING;
    
    /* запускаем таймер */
    AT91C_BASE_TC2->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
}
Сергей Борщ
Цитата(SpiritDance @ Feb 6 2008, 18:14) *
Это невозможно.
Почему? Согласно рисунку 32-1 даташита TIOA0 через мультиплексор приходит на вход счетчика. И согласно описанию TC_BMR TIOA0 может быть выбран как External Clock Signal 1 (XC1). Или есть какие-то еще препятствия?
SpiritDance
Цитата(Сергей Борщ @ Feb 6 2008, 21:13) *
Почему? Согласно рисунку 32-1 даташита TIOA0 через мультиплексор приходит на вход счетчика. И согласно описанию TC_BMR TIOA0 может быть выбран как External Clock Signal 1 (XC1). Или есть какие-то еще препятствия?

Насколько я понимаю TIOA0 на этом рисунке обозначает выход таймера 0 (внутреняя линия) а не ногу контроллера. Я не прав?
Сергей Борщ
Цитата(SpiritDance @ Feb 7 2008, 12:14) *
Насколько я понимаю TIOA0 на этом рисунке обозначает выход таймера 0 (внутреняя линия) а не ногу контроллера. Я не прав?
Мне казалось, что это название внутреннего сигнала. И именно этот сигнал можно при желании вывести на ногу контроллера. Я этот режим не использовал, поэтому и интересуюсь. Читая даташит препятствий не видно, думал может у вас есть какие-то ссылки на другие места даташита, которые я пропустил.
KAlex
TIOA0 может подключаться к XC1 и XC2. За это отвечает TC0XC1S TC0XC2S в регистре TC_BMR.
В регистре TC_CMR указывается TCCLKS - выбор синхронизации XC1 или XC2.
SpiritDance
Цитата(Сергей Борщ @ Feb 7 2008, 15:29) *
Мне казалось, что это название внутреннего сигнала.

ну да. Только этот сигнал не сам по себе существует и отдельно от таймера его нельзя рассматривать.

Цитата(Сергей Борщ @ Feb 7 2008, 15:29) *
Читая даташит препятствий не видно, думал может у вас есть какие-то ссылки на другие места даташита, которые я пропустил.

Да нет, мне просто логика подсказывает, что тактировать таймер с 2-х разных ног, наверное, плохо. smile.gif

Кстати, рад с Вами пообщаться, давно меня здесь не было. smile.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.