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

 
 
> Прерывание от таймера в AT91SAM7X256
ZAA
сообщение May 22 2008, 05:35
Сообщение #1


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

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



Используем FreeRTOS. ВОзникла необходимость использования таймера. Вроде просто так таймер запускается и работает, а вот прерывания не обрабатывает. Я подозреваю, что функцию обработки прерывания нельзя объявлять, как обычную функцию. Наверное, надо прописывать ещё вектор прерывания от таймера где-то там. В том и проблема, что не очень хорошо разбираюсь во всяких там секциях памяти, размещении векторов и т. д (по крайней мере в этом контроллере). Как бы это попроще организовать??? help.gif
ТЕкст (кстати стандартный) приведен ниже:
//ф-ия обработки прерывания
void timer1_c_irq_handler(void)
{
AT91PS_TC TC_pt = AT91C_BASE_TC1;
unsigned int dummy;
//* Acknowledge interrupt status
dummy = TC_pt->TC_SR;
//* Suppress warning variable "dummy" was set but never used
dummy = dummy;
count_timer0_interrupt++;
vParTestToggleLED( 2 );
}

void AT91F_TC_Open ( AT91PS_TC TC_pt, unsigned int Mode, unsigned int TimerId)
{
unsigned int dummy;
AT91F_PMC_EnablePeriphClock ( AT91C_BASE_PMC, 1<< TimerId ) ;
AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_TC1);
TC_pt->TC_CCR = AT91C_TC_CLKDIS ;
TC_pt->TC_IDR = 0xFFFFFFFF ;

dummy = TC_pt->TC_SR;

TC_pt->TC_CMR = Mode ;

TC_pt->TC_CCR = AT91C_TC_CLKEN ;
}

void timer_init ( void )
{
unsigned int oldHandler;
unsigned int mask ;
AT91S_AIC *pAIC = AT91C_BASE_AIC;
AT91S_TC *pTMR = AT91C_BASE_TC1;

//init the timer interrupt counter
count_timer0_interrupt=0;
count_timer1_interrupt=0;

//* Open timer1
AT91F_TC_Open(AT91C_BASE_TC1,TC_CLKS_MCK128,AT91C_ID_TC1);

//* Open Timer 1 interrupt
AT91F_AIC_ConfigureIt ( AT91C_BASE_AIC, AT91C_ID_TC1, TIMER1_INTERRUPT_LEVEL,AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, timer1_c_irq_handler);
AT91C_BASE_TC1->TC_IER = AT91C_TC_CPCS; // IRQ enable CPC
AT91F_AIC_EnableIt (AT91C_BASE_AIC, AT91C_ID_TC1);

//* Start timer1
//AT91C_BASE_TC1->TC_CCR = AT91C_TC_SWTRG ;

}

P.S. Знаю, что подобные посты уже были, но хотелось бы ещё раз остановиться на данной проблеме! Спасибо заранее за ответы.
Go to the top of the page
 
+Quote Post
3 страниц V  < 1 2 3  
Start new topic
Ответов (30 - 38)
ZAA
сообщение May 28 2008, 18:23
Сообщение #31


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

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



Цитата(aaarrr @ May 28 2008, 21:21) *

Спасибо, я в процессе...)))

Сообщение отредактировал ZAA - May 28 2008, 18:24
Go to the top of the page
 
+Quote Post
ZAA
сообщение May 28 2008, 20:51
Сообщение #32


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

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



Цитата(aaarrr @ May 28 2008, 21:21) *
...

В общем, полнейшая ерунда...Если разрешать прерывания по Tx, то программа какое-то количество раз заходит в обработчик, а потом все останавливается. А по Rx прерывания так и не воспринимаются, хотя все делаю по Вашим советам, да и по логике-то должно работать((( Вообще для общения с контроллером я пользуюсь программой Terminal.exe. В обработчике я пишу, так как Вы советовали:
Код
if(status & AT91C_US_TXRDY)
    {
        // Делаем что нужно, но обязательно пишем US_THR или запрещаем прерывание TXRDY
        (pUS0->US_THR) = 0x1;//Data & 0x1FF;
        vParTestToggleLED(2);
        AT91F_DBGU_Printc(count_uart_interrupt);    //эта функция по DBGU байт передает
    }

crying.gif crying.gif crying.gif Мозг взрывается уже
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 29 2008, 03:06
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ZAA @ May 29 2008, 00:51) *
Если разрешать прерывания по Tx, то программа какое-то количество раз заходит в обработчик, а потом все останавливается.

Останавливается как - процессор виснет, или прерывания не прерываются?

Цитата(ZAA @ May 29 2008, 00:51) *
А по Rx прерывания так и не воспринимаются, хотя все делаю по Вашим советам, да и по логике-то должно работать(((

А вот это совсем странно, тем более, что инициализируется оно одновременно с TX. Проверьте все внимательно еще раз. PDC точно выключен?
Go to the top of the page
 
+Quote Post
ZAA
сообщение May 29 2008, 03:11
Сообщение #34


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

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



Цитата(aaarrr @ May 29 2008, 06:06) *
Останавливается как - процессор виснет, или прерывания не прерываются?

Похоже на то, что прерывания не прерываются. Потому что в условии обработчика, где про Tx, я посылаю через DBGU значение счётчика, к-рый инкрементируется каждое прерывание. ПОсылается примерно значений 1500, а дальше все. Да ещё и в прерывание заходит, даже если кабель RS232 не подключен.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 29 2008, 04:56
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(ZAA @ May 29 2008, 07:11) *
Да ещё и в прерывание заходит, даже если кабель RS232 не подключен.

Ну, это правильно - откуда ему знать, подключен кабель, или нет? Какая-нибудь светодиодная моргалка в проекте есть?
Go to the top of the page
 
+Quote Post
ZAA
сообщение May 29 2008, 07:46
Сообщение #36


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

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



Цитата(aaarrr @ May 29 2008, 07:56) *
Ну, это правильно - откуда ему знать, подключен кабель, или нет? Какая-нибудь светодиодная моргалка в проекте есть?

Да, есть. Это функция vParTestToggleLED ('номер светодиода')
Я её использую, чтобы определить. зашла программа в прерывание или нет. Отладчика-то не имеется. вот и приходится лампочками отлаживать 05.gif
А не может дело быть в структуре самой программы? То есть в ф-ии main вызывается PrvSetupHardware (ну как обычно), потом ф-ия ReadComPort(), потом vStartSheduler;
А ф-ия ReadComPort выглядит так:
void ReadComPort()
{
init_uart();
}

init_uart - это инициализация уарта. про которую обсуждалось выше.

А данные в порт с компа все равно какой программой отправлять? (либо terminal.exe, либо ComPUMP ну или еще какой-нить sad.gif )

Сообщение отредактировал ZAA - May 29 2008, 07:52
Go to the top of the page
 
+Quote Post
aaarrr
сообщение May 29 2008, 07:50
Сообщение #37


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Так добавьте какую-нибудь задачу, которая просто будет LED'ом моргать. А то не понятно, хвост-IRQ отваливается, или лапы-OS smile.gif
Go to the top of the page
 
+Quote Post
ZAA
сообщение May 29 2008, 10:01
Сообщение #38


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

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



Цитата(aaarrr @ May 29 2008, 10:50) *
Так добавьте какую-нибудь задачу, которая просто будет LED'ом моргать. А то не понятно, хвост-IRQ отваливается, или лапы-OS smile.gif

Спасибо за поддержку. Попробую...)
Go to the top of the page
 
+Quote Post
ZAA
сообщение Jun 13 2008, 05:15
Сообщение #39


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

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



Цитата(aaarrr @ May 29 2008, 10:50) *
Так добавьте какую-нибудь задачу, которая просто будет LED'ом моргать. А то не понятно, хвост-IRQ отваливается, или лапы-OS smile.gif

Уважаемый aaarrr! Не было возможности Вам ответить раньше. Хочется очень Вас поблагодарить. проблема с UARTом разрешилась. причиной всему была собственная глупость, тупость и т п. если бы в руках схема не оказалась, долго бы ещё голову ломали. В общем, USART0, который я так настойчиво пыталась конфигурировать ,выведен совсем на другие выводы. Припаяли разъём на PA0, PA1 (к-рые отвечают за TxD RxD) и все заработало. Наука мне на будущее. СПАСИБО ещё раз
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 30th August 2025 - 05:59
Рейтинг@Mail.ru


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