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

 
 
> прерывания от таймеров в SAM, опять затупил :(
SpiritDance
сообщение Jun 26 2006, 09:41
Сообщение #1


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

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



Что-то с самом у меня не клеится. Не пионимаю как организовать прерывание по переполнению таймера.
вобщем что понятно. нужно проинициализировать aic и поставить таймер в режим сравнения. в регистр сравнения rc таймера записать максимальное значение 0xFFFF
Код
void set_timer_channel1_to_timer_mode(void)
{
    /* */
    //AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC1] = PRIORITY_TIMER1 | AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE;
    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_TC1] = PRIORITY_TIMER1 | AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED;

    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_TC1] = (unsigned int)ih_timer1_overload;
    /* ðàçðåøàåì ïðåðûâàíèå îò êàíàëà 1 òàéìåðà-ñ÷åò÷èêà */
    AT91C_BASE_AIC->AIC_IECR = (1 << AT91C_ID_TC1);

    /* ïîäêëþ÷àåì ê êàíàëó ñèñòåìíóþ ÷àñòîòó è âêëþ÷àåì âûâîä */
    AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_TC1);

    /*  */
    AT91C_BASE_TC1->TC_CMR = AT91C_TC_CLKS_TIMER_DIV1_CLOCK
                             |
                             AT91C_TC_WAVE
                             |
                             AT91C_TC_WAVESEL_UP_AUTO;


    AT91C_BASE_TC1->TC_RC = 0xFFFF;
    AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS;

    /* çàïóñêàåì òàéìåð */
    AT91C_BASE_TC1->TC_CCR = AT91C_TC_CLKEN | AT91C_TC_SWTRG;
}


далее пишется простенький обработчик
Код
void ih_timer1_overload(void) __irq
{
//    Time = AT91C_BASE_AIC->AIC_IVR;                 //automatic clear current interrupt
    AT91C_BASE_AIC->AIC_ICCR = (1 << AT91C_ID_TC1);  //clear current interrupt
  
    //if(AT91C_BASE_TC1->TC_SR & AT91C_TC_CPCS)
    {
        Time   = 0xFFFF;
        ReloadCountTime++;
        ReloadCountPulses = 0;
    }
}


Что не понятно.
1. Надо ли очищать какой-то флаг источника прерываний в САМе? То есть правильно ли я делаю что пишу первую(закоментированную) или вторую строчки обработчика?

2. Каким образом таймер генерит прерывания и выбирается их конкретный источник (сравнение по ra rb rc, захват и пр.) в даташите по этому поводу очень грамотно написано
Цитата
Interrupt
The TC has an interrupt line connected to the Advanced Interrupt Controller (AIC). Handling the
TC interrupt requires programming the AIC before configuring the TC.

Круто ничего не скажешь... дальше то что?angry.gif
по поводу определения истьочника подозреваю надо читать статус. Но генерятся то прерывания когда?

3 Прерывание вызывается но только один раз. Подозреваю это из-за того что я что-то упустил с источниками прерываний. Или вообще что-то упустил. При этом я вижу в эмуляторе что флаг cpcs в регистре статуса не изменяется. При каких условиях сбрасывается CPCS?

Памажите а?


--------------------
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
 
Start new topic
Ответов
SpiritDance
сообщение Sep 11 2006, 12:28
Сообщение #2


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

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



Кто-нибудь может скинуть рабочий код для PIT?
Странно но заработало вот так (я там кстати включить прерывание забыл blush.gif )
Код
void init_interrupt_PIT(t_uint32 Interval, void InterruptHandler(void))
{
    if (InterruptHandler != NULL)
    {
        AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_SYS,
                              PIT_PRIORITY, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
                              InterruptHandler);
    }
    else
    {
        AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_SYS,
                              PIT_PRIORITY, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,
                              (void(*)(void))ih_PIT);
    }
    AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SYS);

    AT91C_BASE_PITC->PITC_PIMR = (((__int64)(MCK / 16) * Interval / 1000000) & AT91C_PITC_PIV)
                               |
                               AT91C_PITC_PITEN
                               |
                               AT91C_PITC_PITIEN;
}

void ih_fromPIT(void) __irq
{
    volatile t_uint32 temp = 0;
    if (AT91C_BASE_PITC->PITC_PISR & AT91C_PITC_PITS )
    {
        g_systemSignals.displayStart = 1;
        temp = AT91C_BASE_PITC->PITC_PIVR;
    }    
    /* îáðàáîò÷èê çàâåðøåí */
    AT91C_BASE_AIC->AIC_EOICR = temp;
}

При этом если не читать PIVR флаг прерывания не снимается.
Отсюда вопрос каким образом от данного таймера получить интервал прерываний больший 20-разрядной части и зачем вообще нужен PICNT?


--------------------
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
Сергей Борщ
сообщение Sep 11 2006, 19:38
Сообщение #3


Гуру
******

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



Цитата(SpiritDance @ Sep 11 2006, 15:28) *
Кто-нибудь может скинуть рабочий код для PIT?

Код
//Инициализация
#define    MAINCLK        4032000L
#define    PLLMUL        36
#define    PLLDIV        3
#define    MCK            ((MAINCLK * PLLMUL) / PLLDIV)

#define    RTOS_TICK_RATE    100        // Hz


    // RTOS Timer
    AT91C_BASE_PITC->PITC_PIMR = (((MCK / 16) / RTOS_TICK_RATE - 1) & AT91C_PITC_PIV) \
                    | (1 * AT91C_PITC_PITEN) | (1 * AT91C_PITC_PITIEN);

    AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE | AT91C_AIC_PRIOR_LOWEST;
    AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (uint32_t)OS::SystemTimer_Wrapper;

    AT91C_BASE_AIC->AIC_IECR = (1<<AT91C_ID_SYS);
//обработчик:
OS_INTERRUPT void OS::SystemTimer_Wrapper() {
    volatile dword Tmp = AT91C_BASE_PITC->PITC_PIVR >> 20;
    while(Tmp--) {
        SystemTimer_ISR();
    }
}

Цитата(SpiritDance @ Sep 11 2006, 15:28) *
При этом если не читать PIVR флаг прерывания не снимается.
Да, именно. НЕ СНИМАЕТСЯ ЕСЛИ НЕ ЧИТАТЬ PIVR. Я вот удивляюсь - а документацию кто читать должен? Уже на gaw.ru и перевод сделали для тех, кому лень выучить необходимые для пониманий 90% текста 50 слов и сочетаний по-английски.
Цитата(SpiritDance @ Sep 11 2006, 15:28) *
Отсюда вопрос каким образом от данного таймера получить интервал прерываний больший 20-разрядной части

1) Уменьшить MCLK
2) Организовать в прерывании этого таймера хоть 128-битный программный счетчик.
Цитата(SpiritDance @ Sep 11 2006, 15:28) *
и зачем вообще нужен PICNT?

Для формирования периодических прерываний с постоянным интервалом. Например системный таймер RTOS, который обычно генерит прерывания с частотой 100-1000Гц.


--------------------
На любой вопрос даю любой ответ
"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
сообщение Sep 12 2006, 11:57
Сообщение #4


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

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



Цитата
1) Уменьшить MCLK
2) Организовать в прерывании этого таймера хоть 128-битный программный счетчик.

Я вобщем не спрашивал как организовать счетчик. Просто я так понял что больший интервал аппаратных прерываний чем записывается в PIVR получить нельзя.

Цитата
Для формирования периодических прерываний с постоянным интервалом. Например системный таймер RTOS, который обычно генерит прерывания с частотой 100-1000Гц.

Не понял. При чем здесь счетчик переполнений? Он же сбрасывается при считывании PIVR?

Что касается документации то да, признаю, я часто бываю невнимателен.


--------------------
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
Сергей Борщ
сообщение Sep 12 2006, 13:04
Сообщение #5


Гуру
******

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



Цитата(SpiritDance @ Sep 12 2006, 14:57) *
Я вобщем не спрашивал как организовать счетчик. Просто я так понял что больший интервал аппаратных прерываний чем записывается в PIVR получить нельзя.
Да, нельзя. Тогда я не понял вопроса. А какой таймер позволяет делать больший чем разрядность таймера?

Цитата
Не понял. При чем здесь счетчик переполнений? Он же сбрасывается при считывании PIVR?
Извиняюсь, я тоже бываю невнимателен. Почему-то показалось, что вопрос был про PIT вообще. Видимо чтобы узнать сколько прерываний было потеряно если это прерывание было запрещено надолго и потом программно вызвать обработчик нужное количество раз:
Код
    volatile dword Tmp = AT91C_BASE_PITC->PITC_PIVR >> 20;
    while(Tmp--) {
        SystemTimer_ISR();
    }


--------------------
На любой вопрос даю любой ответ
"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
сообщение Sep 12 2006, 16:44
Сообщение #6


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

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



Цитата(Сергей Борщ @ Sep 12 2006, 17:04) *
Да, нельзя. Тогда я не понял вопроса. А какой таймер позволяет делать больший чем разрядность таймера?

Ну вообще-то полная разрядность таймера PIT 20 + 12 smile.gif Хотя если подумать для чего сделан данный таймер то вобщем достаточно и 20 разрядов. Жаль только частота фиксированная.


--------------------
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

Сообщений в этой теме
- SpiritDance   прерывания от таймеров в SAM   Jun 26 2006, 09:41
- - SpiritDance   Кстати при выборе TC_IER = AT91C_TC_COVFS прерыван...   Jun 26 2006, 09:57
- - aaarrr   Цитата(SpiritDance @ Jun 26 2006, 13:41) ...   Jun 26 2006, 10:36
|- - SpiritDance   БЛИИИИН я пропустил этот ;*№* EOICR. А уж было дум...   Jun 26 2006, 11:26
|- - AVR   Спасите, я тоже уже готов повеситься. Не могу поня...   Jul 26 2006, 22:04
- - SpiritDance   Какой-то не такой у вас файл описаний , возьмите ...   Jul 27 2006, 06:57
|- - AVR   SpiritDance, ничего не помогло... PeripheralID ...   Jul 27 2006, 20:46
|- - SpiritDance   Цитата(AVR @ Jul 28 2006, 00:46) SpiritDa...   Jul 28 2006, 06:08
- - aaarrr   Цитата(AVR @ Jul 28 2006, 00:46) Peripher...   Jul 27 2006, 21:00
- - AVR   Не получается... Кодvolatile int x, y; void Int...   Jul 29 2006, 10:29
- - aaarrr   Цитата(AVR @ Jul 29 2006, 14:29) Не получ...   Jul 29 2006, 15:32
|- - AVR   Спасибо, aaarrr. Код#include "AT91SAM7S64.h...   Aug 2 2006, 22:27
- - aaarrr   Ну уж одно прерывание в данном случае должно произ...   Aug 2 2006, 23:21
- - aaarrr   Смотрите внимательнее, оба примера рабочие. Да, а...   Aug 2 2006, 23:43
|- - AVR   Цитата(aaarrr @ Aug 3 2006, 03:43) Смотри...   Aug 3 2006, 15:44
|- - AVR   Попробовал модифицировать пример AT91SAM7S64-Perio...   Aug 3 2006, 19:23
- - SpiritDance   Почему вы так |= работаете с регистрами в АРМ. Уни...   Aug 3 2006, 07:01
- - aaarrr   Вены резать рано. Рабочий код должен выглядеть при...   Aug 3 2006, 19:41
|- - AVR   Цитата(aaarrr @ Aug 3 2006, 23:41) Это ^^...   Aug 3 2006, 20:22
|- - gladov   Цитата(aaarrr @ Aug 3 2006, 19:41) P.S. Э...   Dec 3 2006, 13:37
|- - aaarrr   Цитата(gladov @ Dec 3 2006, 13:37) А пояс...   Dec 4 2006, 04:27
|- - gladov   Цитата(aaarrr @ Dec 4 2006, 04:27) Вопрос...   Dec 4 2006, 22:55
- - SpiritDance   Ну глюки в армах вобщем привычное дело. У меня вот...   Aug 4 2006, 06:24
- - aaarrr   ЦитатаПохоже, дело в самом SAM7S... ЦитатаНу глюки...   Aug 4 2006, 09:20
- - SpiritDance   Руки у меня действительно не самые прямые но когда...   Aug 4 2006, 18:55
|- - AVR   Цитата(SpiritDance @ Aug 4 2006, 22:55) Х...   Aug 5 2006, 15:27
- - aaarrr   К сожалению, у меня нет IAR'а, но есть некотор...   Aug 5 2006, 18:32
|- - AVR   Цитата(aaarrr @ Aug 5 2006, 22:32) К сожа...   Aug 5 2006, 20:11
- - aaarrr   Глобально запретить прерывания можно на уровне ядр...   Aug 5 2006, 21:09
- - GetSmart   А забавно будет если AVR не знал, что нужно хоть р...   Aug 5 2006, 22:07
|- - AVR   Цитата(GetSmart @ Aug 6 2006, 02:07) А за...   Aug 5 2006, 22:14
- - aaarrr   ЦитатаТеперь у меня программа натыкается на то что...   Aug 5 2006, 22:30
|- - AVR   Цитата(aaarrr @ Aug 6 2006, 02:30) Поздра...   Aug 5 2006, 22:38
|- - AVR   Ура! Огромное спасибо всем за помощь! Сраб...   Aug 5 2006, 22:50
- - aaarrr   ЦитатаТочно, всё аналогично AVRкам, тоже надо доба...   Aug 5 2006, 22:56
|- - AVR   Цитата(aaarrr @ Aug 6 2006, 02:56) Что-то...   Aug 5 2006, 23:13
- - GetSmart   Я тоже начинал с такого варианта прерываний. Он пр...   Aug 5 2006, 23:46
- - aaarrr   Ну если так проще, тогда ладно. P.S. Интересно, к...   Aug 6 2006, 00:05
|- - AVR   Цитата(aaarrr @ Aug 6 2006, 04:05) P.S. И...   Aug 6 2006, 12:20
- - aaarrr   Цитата(AVR @ Aug 6 2006, 16:20) Есть ли в...   Aug 6 2006, 13:53
|- - AVR   Что нужно сделать, чтобы срабатывали несколько раз...   Aug 8 2006, 11:57
|- - Сергей Борщ   Цитата(AVR @ Aug 8 2006, 14:57) Что нужно...   Aug 8 2006, 12:07
|- - AVR   Сергей Борщ, спасибо   Aug 8 2006, 12:13
- - Timofey   Прошу прощения, что поднимаю старую тему и за очер...   Aug 16 2006, 05:33
|- - AVR   Цитата(Timofey @ Aug 16 2006, 09:33) Если...   Aug 16 2006, 20:14
|- - Timofey   Цитата(AVR @ Aug 17 2006, 02:14) По всей ...   Aug 17 2006, 03:56
- - SpiritDance   Исходные данные Инициализация Кодvoid init_interr...   Sep 11 2006, 11:07
|- - vet   Цитата(SpiritDance @ Sep 11 2006, 16:28) ...   Sep 11 2006, 12:43
- - aaarrr   Сейчас уже не помню, в чем было дело, но кажется п...   Dec 5 2006, 00:05
- - gladov   Цитата(aaarrr @ Dec 5 2006, 00:05) Сейчас...   Dec 5 2006, 11:47
- - Сергей Борщ   Цитата(gladov @ Dec 5 2006, 10:47) Инициа...   Dec 5 2006, 19:35
- - gladov   Цитата(Сергей Борщ @ Dec 5 2006, 19:35) Ц...   Dec 5 2006, 19:43
- - Сергей Борщ   Цитата(gladov @ Dec 5 2006, 18:43) Нет, J...   Dec 6 2006, 00:03
- - gladov   Итак, подводим итоги. Может быть кому-нибудь приго...   Dec 6 2006, 10:23


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 00:47
Рейтинг@Mail.ru


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