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

 
 
> Real Time Timer & Periodic Interval Timer у SAM7S
Timofey
сообщение Apr 4 2007, 12:29
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Что то я запутался как правильно сконфигурировать прерывания у обоих. Код:
Код
int test_flag=0,test_flag2==0;
#define PIT_INTERRUPT_LEVEL 7
#define PIV_MS 60000         ////////////////////////////////////////////////
void Timer_handler(void)
{
  unsigned int status;
  //проверяем, прерывание от RTT или нет
  if (AT91C_BASE_RTTC->RTTC_RTSR & AT91C_RTTC_RTTINC) {
    
     if (test_flag==1) {
         AT91C_BASE_PIOB->PIO_SODR = (1<<22);
         test_flag=0;
         }
     else {
       AT91C_BASE_PIOB->PIO_CODR = (1<<22);
       test_flag=1;
     }
    
   }
  
  //проверчем преривание от PIT ли
  if (AT91C_BASE_PITC->PITC_PISR & AT91C_PITC_PITS) {
     status = AT91C_BASE_PITC->PITC_PIVR;//сброс прерывания
     status =status;
     if (test_flag2==0) {
         AT91C_BASE_PIOB->PIO_SODR = (1<<19);
         test_flag2==1
         }
     else {
       AT91C_BASE_PIOB->PIO_CODR = (1<<19);
       test_flag2==0;
     }
    
   }
  
  
  
  AT91C_BASE_AIC->AIC_EOICR=0x00;
  
}    /////////////////////////////////////////////
////////Конфигурирование Timer TC1///////////
/////////////////////////////////////////////
void CnfTime1 (void)
{
  AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA );//конфигурируем PIT
  AT91C_BASE_PITC->PITC_PIMR = AT91C_PITC_PITEN | AT91C_PITC_PITIEN | PIV_MS;
  //Конфигурируем RTT
  AT91C_BASE_RTTC->RTTC_RTMR=((unsigned int) 0x8000 <<  0)  |
                             ((unsigned int) 0x0 << 16)     |
                             ((unsigned int) 0x1 << 17)     |
                             ((unsigned int) 0x1 << 18)    ;
  
  
  AT91F_AIC_ConfigureIt (AT91C_BASE_AIC,
                         AT91C_ID_SYS,
                         PIT_INTERRUPT_LEVEL,
                         AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL,
                         Timer_handler);
  
  AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);
  
} ////////////////////////////////////////
// Основная функция/////////////////////
////////////////////////////////////////
main (void)
{
//Запускаем колки на PIOA and PIOB
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOB);


AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91B_LED_MASK);
AT91F_PIO_SetOutput(AT91C_BASE_PIOB, AT91B_LED_MASK);

CnfTime1();
  //бесконечный цикл
while(1)
    {
    
    }
    
}
Вобщем когда выполняю из рам пошагово - нормально, мигают лампочки, когда жму кнопку Go то вылетает полностью. Тогда решил без дебага ... просто залил через самбу бинарик во флэш - реакция ноль. Нутром знаю что не так сконфигурировал перывание, но что не так?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 5)
beer_warrior
сообщение Apr 4 2007, 12:44
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Это работает (PIT)

Код
//--------------------------------------------------------------------------
void InitSysTimer(void)
{
/*
//configure interrupt
AT91F_AIC_ConfigureIt    (AT91C_BASE_AIC,             //base adr
                        AT91C_ID_SYS,                //int number
                        AT91C_AIC_PRIOR_HIGHEST,    //priority
                        1,                            //int source type
                        SysTimerInterrupt            //handler
                        );            
*/                        
//---

unsigned int mask;
mask = 1 << AT91C_ID_SYS;
// Disable the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_IDCR = mask;
// Save the interrupt handler routine pointer and the interrupt priority
AT91C_BASE_AIC->AIC_SVR[AT91C_ID_SYS ] = (unsigned int) SysTimerInterrupt;
// Store the Source Mode Register
AT91C_BASE_AIC->AIC_SMR[AT91C_ID_SYS ] = 1 | (AT91C_AIC_PRIOR_HIGHEST-1);
// Clear the interrupt on the interrupt controller
AT91C_BASE_AIC->AIC_ICCR = mask;

//---                    
//init 100uS timer
//AT91F_PITInit(AT91C_BASE_PITC,100,48);
AT91C_BASE_PITC->PITC_PIMR = 100? (100 * 48 + 8) >> 4 : 0;
AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITEN;    

//enable interrupt
//AT91F_PITEnableInt(AT91C_BASE_PITC);
AT91C_BASE_PITC->PITC_PIMR |= AT91C_PITC_PITIEN;    
//AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_SYS);
AT91C_BASE_AIC->AIC_IECR = 0x1 << AT91C_ID_SYS;
hTimer_100us  = NULL;
hTimer_1ms  = NULL;
hTimer_1s  = NULL;
}
//--------------------------------------------------------------------------


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 4 2007, 14:38
Сообщение #3


Гуру
******

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



Цитата(Timofey @ Apr 4 2007, 11:29) *
но что не так?
Не видно кода перехода по вектору прерывания. Есть подозрение, что это кусок на ассемблере из одной команды LDR PC, AT91C_AIC_IVR. Тогда прерывание должно быть описано как __irq void Timer_handler(void)


--------------------
На любой вопрос даю любой ответ
"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
Timofey
сообщение Apr 9 2007, 07:30
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Спасибо за ответы. Но у меня по отдельности эти прерывания работают.Они оба "сидят" на одном ID (если я правильно понял даташит). Вот в этом у меня и получилась загвоздка. Вместе они не хотят работать. Пару раз иногда индикатор на плате мигнет (который зажигается в RTT) и все глохнет. __irq сделал - эффекта не дало. Как заставить работать оба прерывания? Или я не правильно понял даташит? По идее ведь я разрешаю прерывание и у того, и у того. Само прерывание настраиваю на AT91C_ID_SYS и в функции прерывания просто смотрю какое из них сработало. Логика правильная? Или нет?
Go to the top of the page
 
+Quote Post
SpiritDance
сообщение Apr 9 2007, 09:25
Сообщение #5


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

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



Код
if (test_flag2==0) {
         AT91C_BASE_PIOB->PIO_SODR = (1<<19);
         test_flag2==1;
         }
     else {
       AT91C_BASE_PIOB->PIO_CODR = (1<<19);
       test_flag2==0;
     }


хехе А может все-таки вот так?
Код
if (test_flag2==0) {
         AT91C_BASE_PIOB->PIO_SODR = (1<<19);
         test_flag2=1
         }
     else {
       AT91C_BASE_PIOB->PIO_CODR = (1<<19);
       test_flag2=0;
     }




Кстати а что это за PIOB в S серии?


--------------------
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
Timofey
сообщение Apr 9 2007, 10:43
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 119
Регистрация: 3-07-06
Пользователь №: 18 528



Цитата(SpiritDance @ Apr 9 2007, 12:25) *
хехе А может все-таки вот так?
Код
if (test_flag2==0) {
         AT91C_BASE_PIOB->PIO_SODR = (1<<19);
         test_flag2=1
         }
     else {
       AT91C_BASE_PIOB->PIO_CODR = (1<<19);
       test_flag2=0;
     }
Извиняюсь. Но это так и есть. Просто не правильно в форум скопировал. К тому же если бы я их оставил, компилятор бы меня не пустил smile.gif
Цитата(SpiritDance @ Apr 9 2007, 12:25) *
Кстати а что это за PIOB в S серии?
Это не S, это Х серия: SAM7X256
Go to the top of the page
 
+Quote Post

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

 


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


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