boryx 0 25 мая, 2006 Опубликовано 25 мая, 2006 · Жалоба столкнулся с проблемой. конфигурю регистры для любого таймера скажем для 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 должно сработать прерывание. на практике прекращается загрузка сисетмы и прерыване запускается все время, захватывая все ресурсы я так понимаю, что флажок не сбрасывается. Или я что-то не так делаю??? какие будут соображения Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 25 мая, 2006 Опубликовано 25 мая, 2006 · Жалоба А вы правильно настроили AIC? B что-нибудь подобное использовали? //clear interrupt flag AT91F_PITGetPIVR(AT91C_BASE_PITC); //end of intterupt AT91C_BASE_AIC->AIC_EOICR = 0; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
boryx 0 25 мая, 2006 Опубликовано 25 мая, 2006 · Жалоба А вы правильно настроили 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 и такой проблемы не возникало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 25 мая, 2006 Опубликовано 25 мая, 2006 · Жалоба Я наверное невнятно спросил - флажок прерывания должен сниматься явно в 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. Или каким-то образом конфликтует с Линухом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
boryx 0 25 мая, 2006 Опубликовано 25 мая, 2006 · Жалоба Я наверное невнятно спросил - флажок прерывания должен сниматься явно в 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, буду пробовать. Может для прерываний у таймеров влажок почему-то не сбрасывается. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sapID 0 26 мая, 2006 Опубликовано 26 мая, 2006 · Жалоба Еще в прерывании стоит считать регистр статуса таймера Код от Atmel для SAM7 (в rm9200, вроде, также): //* Acknowledge interrupt status dummy = AT91C_BASE_TC1->TC_SR; //* Suppress warning variable "dummy" was set but never used dummy = dummy; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться