реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как подключить ТС на тактирование от PA0, Проблема с BMR
Тема
сообщение Feb 6 2008, 07:49
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 31-01-08
Из: Екатеринбург
Пользователь №: 34 632



Как я понял от PA0 (TIOA0) может тактироваться лишь TC1
Я включил PA0 в режим B,
в TC1 в TC_CMR тактирование от XC0
но как подключить ХС0 к PA0, в даташите сказано что надо именить TC_BMR но как модифицировать не понял,что попробовал не получилось.
Подскажите как модифицировать BMR и что сделать дальше чтоб счетчик просто считал импульсы без прерывания. 05.gif

ATSAM7S256 процессор


--------------------
Наша электроника и программы - http://soft-ee.com
Go to the top of the page
 
+Quote Post
_dem
сообщение Feb 6 2008, 09:14
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



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

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

p/s. 2zltigo : готов пройти профилактическое промывание smile.gif но уж больно много народу подобного появилось в последнее время

Сообщение отредактировал _dem - Feb 6 2008, 09:15
Go to the top of the page
 
+Quote Post
Тема
сообщение Feb 6 2008, 09:40
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 31-01-08
Из: Екатеринбург
Пользователь №: 34 632



У меня ничего и не получилось...Не знаю про что вы говорите
Код
#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;
}


Вот код почему он не работает?


--------------------
Наша электроника и программы - http://soft-ee.com
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Feb 6 2008, 10:14
Сообщение #4


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(Тема @ 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;


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


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
_dem
сообщение Feb 6 2008, 10:43
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 2-02-07
Из: CN, Ukraine
Пользователь №: 24 970



Что в итоге нужно получить ? считать импульсы на ноге или количество срабатываний счетчика ?
Go to the top of the page
 
+Quote Post
Тема
сообщение Feb 6 2008, 12:18
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 31-01-08
Из: Екатеринбург
Пользователь №: 34 632



Цитата(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


--------------------
Наша электроника и программы - http://soft-ee.com
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Feb 6 2008, 16:14
Сообщение #7


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(Тема @ 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;
}


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 6 2008, 18:13
Сообщение #8


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(SpiritDance @ Feb 6 2008, 18:14) *
Это невозможно.
Почему? Согласно рисунку 32-1 даташита TIOA0 через мультиплексор приходит на вход счетчика. И согласно описанию TC_BMR TIOA0 может быть выбран как External Clock Signal 1 (XC1). Или есть какие-то еще препятствия?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Feb 7 2008, 10:14
Сообщение #9


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(Сергей Борщ @ Feb 6 2008, 21:13) *
Почему? Согласно рисунку 32-1 даташита TIOA0 через мультиплексор приходит на вход счетчика. И согласно описанию TC_BMR TIOA0 может быть выбран как External Clock Signal 1 (XC1). Или есть какие-то еще препятствия?

Насколько я понимаю TIOA0 на этом рисунке обозначает выход таймера 0 (внутреняя линия) а не ногу контроллера. Я не прав?


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 7 2008, 12:29
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(SpiritDance @ Feb 7 2008, 12:14) *
Насколько я понимаю TIOA0 на этом рисунке обозначает выход таймера 0 (внутреняя линия) а не ногу контроллера. Я не прав?
Мне казалось, что это название внутреннего сигнала. И именно этот сигнал можно при желании вывести на ногу контроллера. Я этот режим не использовал, поэтому и интересуюсь. Читая даташит препятствий не видно, думал может у вас есть какие-то ссылки на другие места даташита, которые я пропустил.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
KAlex
сообщение Feb 7 2008, 13:25
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 387
Регистрация: 20-12-06
Из: Obninsk
Пользователь №: 23 719



TIOA0 может подключаться к XC1 и XC2. За это отвечает TC0XC1S TC0XC2S в регистре TC_BMR.
В регистре TC_CMR указывается TCCLKS - выбор синхронизации XC1 или XC2.
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Feb 8 2008, 10:26
Сообщение #12


Дух погибшего транзистора
****

Группа: Свой
Сообщений: 877
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 288



Цитата(Сергей Борщ @ Feb 7 2008, 15:29) *
Мне казалось, что это название внутреннего сигнала.

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

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

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

Кстати, рад с Вами пообщаться, давно меня здесь не было. smile.gif


--------------------
Yes, there are two paths you can go by But in the long run Theres still time to change the road youre on.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 17th July 2025 - 23:24
Рейтинг@Mail.ru


Страница сгенерированна за 0.01606 секунд с 7
ELECTRONIX ©2004-2016