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

 
 
> Проблема с прерываниями от таймера в AT91R40008, не срабатывает прерывание по достижению счетчиком заданного значения
Supernaut
сообщение Mar 15 2007, 16:15
Сообщение #1


Участник
*

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



Привет всем!
Кто-нибудь сталкивался с такой трудностью - не срабатывает прерывание от таймера, хотя само событие, по которому должно случиться прерывание - происходит?
Таймер должен отмерять интервал времени 300 мкс для формирования манчестерского кода. Приведу кусок своей программы, может, кто-нибудь увидит ошибку:

Код
/* Настраиваем регистры контроллера прерываний */
  AIC_IECR = (unsigned int)(1<<TC0IRQ); // бит TC0IRQ = 1 - разреш. прер. от таймера (канал 0)
  AIC_SMR4 = 0x00000007;            // PRIOR   = 111  - приоритет =7 - самый высший
                                // SRCTYPE = 00   - по уровню
  AIC_SVR4 = (unsigned int)(&TC0_IRQ);  // адрес обработчика прерывания таймера (канал 0)

/* Настраиваем 0-й канал таймера */
  TC_BCR=0x00000000;   // SYNC=0 - 3 блока таймера работают независимо;
  TC_BMR=0x00000015;   // TC0XC0S=01 \
                  // TC0XC1S=01  | запрещ. внеш. такт. сигналы для всех 3-х блоков
                  // TC0XC2S=01 /

  TC_CCR0=0x00000001;  // CLKEN=1    - разрешаем подачу тактовой частоты на канал 0

  TC_CMR0=0x00008040;  // TCCLKS=000 - такт. частота MCK/2=32,768 МГц
                   // CLKI=0     - не инвертируем такт. частоту
                   // BURST=00   - такт. частота - не управляется внешним сигналом
                   // CPCSTOP=1  - останов такт. ч-ты когда достигнем значения RC0
                   // CPCDIS=0   - не запрещаем такт. ч-ту когда достигнем значения RC0
                   // EEVTEDG=00
                   // EEVT=00
                   // ENETRG=0
                   // CPCTRG=0
                   // WAVE=1     - waveform mode
                   // остальные биты=0 - никакой внешней реакции на достижение RC0

  TC_RC0 = T_300mks;              // константа, соотв. 300 мкс при такт. ч-те =32,768 МГц
  TC_IER0=(unsigned int)(1<<CPCS);  // CPCS=1 - прерывание по достижению значения RC0

/* Обработчик прерывания от таймера 300 мкс (канал 0). Для отладки - моргнуть светодиодом и записать некое число в регистр tmp */
__irq __arm void TC0_IRQ(void)
{
tmp = AIC_IVR;
tmp = 0xAABBCCDD;

PIO_SODR=1<<4;
delay(10);              // Задержка 10 мкс
PIO_CODR=1<<4;

AIC_EOICR = 1;
}

/* Основная программа */
.............................
/* Запускаем таймер и ждем пока пройдет 300 мкс */
  TC_CCR0=(TC_CCR0 | 0x00000004);     // SWTRG=1 - сброс таймера и подача такт. частоты      
            while(1)
            {
              if( ((TC_SR0 >> CPCS) & 1) == 1 ) break;
//              if( tmp == 0xAABBCCDD ) { tmp=0; break; }
            }
...........................


Если выхожу из бесконечного цикла по флагу CPCS в статусном регистре TC_SR0 - все в порядке, т. е. таймер работает правильно. Тем не менее, если заменить усл-е выхода из бесконечного цикла на закомментированное - программа не работает, т. е. обработчик прерывания не выполняется.

Буду очень благодарен за советы и за любую помощь.

Сообщение отредактировал Supernaut - Mar 15 2007, 16:17
Go to the top of the page
 
+Quote Post



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

 


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


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