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

 
 
 
Reply to this topicStart new topic
> как работает TC на at91rm9200, прерывание не сбрасывается
boryx
сообщение May 25 2006, 06:55
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 25-05-06
Пользователь №: 17 428



столкнулся с проблемой.

конфигурю регистры для любого таймера скажем для TC5

at91_tc5_write(AT91_TC_CCR, AT91_TC_CLKEN);//enable timer
at91_tc5_write(AT91_TC_CMR,
AT91_TC_TIMER_CLOCK5| //slow clock ~32kHz
AT91_TC_WAVE| //wave mode
AT91_TC_WAVESEL_UP_AUTO); //triger on RC

at91_tc5_write(AT91_TC_RC, 0x1000);
at91_tc5_write(AT91_TC_CCR, AT91_TC_SWTRG); //restart timer
at91_tc5_write(AT91_TC_IER, AT91_TC_CPCS);//enable interrupt

теперь по даташиту счетчик должен считать, и когда дойдет до 0х1000 должно сработать прерывание.

на практике прекращается загрузка сисетмы и прерыване запускается все время, захватывая все ресурсы
я так понимаю, что флажок не сбрасывается. Или я что-то не так делаю???

какие будут соображения
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение May 25 2006, 07:26
Сообщение #2


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

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



А вы правильно настроили AIC?
B что-нибудь подобное использовали?
Код
//clear interrupt flag
AT91F_PITGetPIVR(AT91C_BASE_PITC);
//end of intterupt
AT91C_BASE_AIC->AIC_EOICR = 0;


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
boryx
сообщение May 25 2006, 10:05
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 25-05-06
Пользователь №: 17 428



Цитата(beer_warrior @ May 25 2006, 10:26) *
А вы правильно настроили AIC?
B что-нибудь подобное использовали?
Код
//clear interrupt flag
AT91F_PITGetPIVR(AT91C_BASE_PITC);
//end of intterupt
AT91C_BASE_AIC->AIC_EOICR = 0;


Да с этим вроде как все впорядке.
на at91rm9200 стоит LINUX.

при инициализации драйвера
request_irq(AT91_ID_TC5, ...)

до того момента, как я энаблю прерывание на соответствие с RC (да или любого другоа) все в порядке.
а как включаю прерывание, оно срабатывает сного и сного без перерыва.

Таимер я использую для своих нужд и ножки не энаблю в PIO.

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

Сейчас использую Линуксовский таймер, но промежутки получаются слишком большие.

в проце 6 таймеров а я linux загружаю лишней работой...

кто может привести рабочий пример как с таймером работать, какие команды в каком порядке запускать.

писал дрова для SPI,SSC и такой проблемы не возникало.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение May 25 2006, 10:56
Сообщение #4


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

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



Я наверное невнятно спросил - флажок прерывания должен сниматься явно в EOICR - вы это учли?
стр.258
The End of Interrupt Command Register is used by the interrupt routine to indicate that the interrupt treatment is complete.
Any value can be written because it is only necessary to make a write to this register location to signal the end of interrupt
treatment.
Или каким-то образом конфликтует с Линухом.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
boryx
сообщение May 25 2006, 14:00
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 20
Регистрация: 25-05-06
Пользователь №: 17 428



Цитата(beer_warrior @ May 25 2006, 13:56) *
Я наверное невнятно спросил - флажок прерывания должен сниматься явно в EOICR - вы это учли?
стр.258
The End of Interrupt Command Register is used by the interrupt routine to indicate that the interrupt treatment is complete.
Any value can be written because it is only necessary to make a write to this register location to signal the end of interrupt
treatment.
Или каким-то образом конфликтует с Линухом.



с Линухом конфликта быть не может. только мой драйвер обрабатывает прерывание с этим номером.
Интересно что при обработке других прерываний в др. драйверах никогда не обнулял этот флаг, так как это Линух где то сам делает в обработчике.

Спасибо, очень интересная идея с EOICR, буду пробовать. Может для прерываний у таймеров влажок почему-то не сбрасывается.
Go to the top of the page
 
+Quote Post
sapID
сообщение May 26 2006, 04:38
Сообщение #6


Участник
*

Группа: Свой
Сообщений: 24
Регистрация: 21-10-04
Из: Пермь, РФ
Пользователь №: 934



Еще в прерывании стоит считать регистр статуса таймера
Код от Atmel для SAM7 (в rm9200, вроде, также):

//* Acknowledge interrupt status
dummy = AT91C_BASE_TC1->TC_SR;
//* Suppress warning variable "dummy" was set but never used
dummy = dummy;
Go to the top of the page
 
+Quote Post

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

 


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


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