|
прерывания от таймеров в SAM, опять затупил :( |
|
|
|
Jun 26 2006, 09:41
|

Дух погибшего транзистора
   
Группа: Свой
Сообщений: 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. Круто ничего не скажешь... дальше то что? по поводу определения истьочника подозреваю надо читать статус. Но генерятся то прерывания когда? 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.
|
|
|
|
|
 |
Ответов
|
Aug 3 2006, 19:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Вены резать рано. Рабочий код должен выглядеть примерно так: Код #include "AT91SAM7S64.h" #include "system.h" typedef unsigned char byte; byte sw = 0;
__irq void IRQ_1() { unsigned int a;
a = *AT91C_RTTC_RTSR; sw = !sw; if(sw) AT91C_BASE_PIOA->PIO_CODR = BIT30; else AT91C_BASE_PIOA->PIO_SODR = BIT30; AT91C_BASE_AIC->AIC_EOICR = a; }
int main() { AT91C_BASE_PIOA->PIO_PER = BIT30; AT91C_BASE_PIOA->PIO_OER = BIT30; AT91C_BASE_PIOA->PIO_CODR = BIT30;
AT91C_BASE_RTTC->RTTC_RTMR = 0x00008000 | AT91C_RTTC_RTTINCIEN | AT91C_RTTC_RTTRST;
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS] = (unsigned int)IRQ_1; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS] = (0x01 << 0x05); AT91C_BASE_AIC->AIC_IECR = (0x01 << AT91C_ID_SYS);
while(1); } Это ^^^ работает? P.S. Этот таймер далеко не так прост, как может показаться на первый взгляд. Использовать прерывание в данном случае я бы однозначно не рекомендовал. P.P.S. Но раз уж взялись - придется только добить.
|
|
|
|
|
Dec 3 2006, 13:37
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(aaarrr @ Aug 3 2006, 19:41)  P.S. Этот таймер далеко не так прост, как может показаться на первый взгляд. Использовать прерывание в данном случае я бы однозначно не рекомендовал. P.P.S. Но раз уж взялись - придется только добить. А поясните, пожалуйста, почему этот таймер не так прост и не рекомендуется использовать прерывания? Тоже только недано начал ковырять АРМ на AT91SAMx256 борде. И тоже попробовал поднять RTT. Поллинг работает, а прерывание стартует только в режиме LEVEL, но почему-то  рабоает нормально без запрета прерывания в прерывании и последующем его разрешении в основном цикле. Если меняю режим на EDGE то прерывание просто не запускается. Вообще. Если кому не напряжно глянуть в мои каракули, может подскажете где грабли? Код // Initialize the timer AT91F_RTTC_CfgPMC(); //Enable a clock source AT91F_RTTClearAlarmINT(AT91C_BASE_RTTC); AT91F_RTTSetPrescaler(AT91C_BASE_RTTC, 0x4000); AT91F_RTTRestart(AT91C_BASE_RTTC); AT91F_RTTSetRttIncINT(AT91C_BASE_RTTC);
// AIC initialization AT91F_AIC_CfgPMC(); AT91F_AIC_ConfigureIt(AT91C_BASE_AIC, AT91C_ID_SYS, AT91C_AIC_PRIOR_LOWEST, // AT91C_AIC_SRCTYPE_HIGH_LEVEL, AT91C_AIC_SRCTYPE_POSITIVE_EDGE, (void (*)())isr_system); AT91F_AIC_EnableIt(AT91C_BASE_AIC, AT91C_ID_SYS);
// Loop forever while (1) { int c;
c = AT91F_RTTReadValue(AT91C_BASE_RTTC); if (c != cval) { cval = c; if (AT91F_PIO_IsOutputDataStatusSet(AT91C_BASE_PIOB, led_mask[1])) AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, led_mask[1]); else AT91F_PIO_SetOutput(AT91C_BASE_PIOB, led_mask[1]); } } Код __irq void isr_system() { if (AT91F_PIO_IsOutputDataStatusSet(AT91C_BASE_PIOB, led_mask[3])) AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, led_mask[3]); else AT91F_PIO_SetOutput(AT91C_BASE_PIOB, led_mask[3]);
//If this is RTT interrupt if (AT91F_RTTGetStatus(AT91C_BASE_RTTC) != 0) { if (AT91F_PIO_IsOutputDataStatusSet(AT91C_BASE_PIOB, led_mask[0])) AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, led_mask[0]); else AT91F_PIO_SetOutput(AT91C_BASE_PIOB, led_mask[0]); } AT91C_BASE_AIC->AIC_EOICR = 0; }
|
|
|
|
|
Dec 4 2006, 04:27
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(gladov @ Dec 3 2006, 13:37)  А поясните, пожалуйста, почему этот таймер не так прост и не рекомендуется использовать прерывания? Тоже только недано начал ковырять АРМ на AT91SAMx256 борде. И тоже попробовал поднять RTT. Поллинг работает, а прерывание стартует только в режиме LEVEL, но почему-то  рабоает нормально без запрета прерывания в прерывании и последующем его разрешении в основном цикле. Вопрос в том, действительно ли прерывание RTT нормально работает в режиме LEVEL. Как я уже писал раньше, оно снимается через 2 цикла SCLK, то есть обработчик может вызываться несколько раз подряд, пока линия прерывания остается активной. А если количество вызовов будет нечетным, то на внешнем поведении светодиодов это не отразится  Цитата(gladov @ Dec 3 2006, 13:37)  Если меняю режим на EDGE то прерывание просто не запускается. Вообще. Режим EDGE для системного прерывания использовать не совсем корректно, так как у него может быть несколько источников, объединенных через логическое ИЛИ. То есть, если при выходе из обработчика останется активным хотя бы один из источников, дальнейшая работа будет заблокирована, что Вы, возможно, и наблюдаете.
|
|
|
|
|
Dec 4 2006, 22:55
|
Частый гость
 
Группа: Свой
Сообщений: 169
Регистрация: 10-11-05
Из: Воронеж
Пользователь №: 10 687

|
Цитата(aaarrr @ Dec 4 2006, 04:27)  Вопрос в том, действительно ли прерывание RTT нормально работает в режиме LEVEL. Как я уже писал раньше, оно снимается через 2 цикла SCLK, то есть обработчик может вызываться несколько раз подряд, пока линия прерывания остается активной. А если количество вызовов будет нечетным, то на внешнем поведении светодиодов это не отразится  Согласен полностью Цитата(gladov @ Dec 3 2006, 13:37)  Если меняю режим на EDGE то прерывание просто не запускается. Вообще. Режим EDGE для системного прерывания использовать не совсем корректно, так как у него может быть несколько источников, объединенных через логическое ИЛИ. То есть, если при выходе из обработчика останется активным хотя бы один из источников, дальнейшая работа будет заблокирована, что Вы, возможно, и наблюдаете. Почему системное прерывание не желательно использовать по фронту понятно, но я больше никакие системные прерывания кроме RTT не разрешаю. Конечно они могут быть у какой-либо периферии разрешены после старта (я конечно весь DS пока не прочитал), но здравый смысл подсказывает, что после старта вся периферия должна быть выключена. Выяснились новые подробности. Если перед основным циклом прочесть RTTC_RTSR то все работает как часы, из чего я делаю вывод, что иногда при старте прерывание от RTT уже активно! Сбросить его некому, т.к. у меня чтение его производится только из прерывания. Отсюда вопрос: а почему оно может быть активно после старта? Я же делаю ему (RTT) резет! Может я что-то не так инициализирую? В принципе, глюк ясен и понятен. Как бороться тоже ясно и вопрос почти снят, но хочется узнать где же были грабли....
|
|
|
|
Сообщений в этой теме
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 AVR Цитата(aaarrr @ Aug 3 2006, 23:41) Это ^^... Aug 3 2006, 20:22 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 SpiritDance Кто-нибудь может скинуть рабочий код для PIT?
Стра... Sep 11 2006, 12:28 vet Цитата(SpiritDance @ Sep 11 2006, 16:28) ... Sep 11 2006, 12:43 Сергей Борщ Цитата(SpiritDance @ Sep 11 2006, 15:28) ... Sep 11 2006, 19:38  SpiritDance Цитата1) Уменьшить MCLK
2) Организовать в прерыван... Sep 12 2006, 11:57   Сергей Борщ Цитата(SpiritDance @ Sep 12 2006, 14:57) ... Sep 12 2006, 13:04    SpiritDance Цитата(Сергей Борщ @ Sep 12 2006, 17:04) ... Sep 12 2006, 16:44 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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|