Добрый вечер! Рабтаю с микроконтроллером MSP430F5438IPZ в среде разработки IAR. Пытаюсь обработать прерывания от таймера, но не получается, не знаю в чём дело.... Что я делаю: 1. Регистр TACCR0 = 0xFFFF (это регистр сравнения, если счетчик дойдёт до этого значения, возникает переполнение и реализуется прерывание) 2. регистр TA0R = 0x0000 (этот регистр счетчик инкрементируется, при равном значении с регистром TACCR0 генерируется прерывание)
теперь идет настройка регистра TA0CCTL0: 3. TA0CCTL0 |= 0x0020; //Настройка битов режима работы - непрерыный режим.... MCx 4. TA0CCTL0 |= 0x0003; // настройка битов ожидания и разрешения прерывания TAIFG, 5. TA0CCTL0 |= 0x0200; Выбор источника тактирования Таймера А - 10 SMCLK
объявление функции обработки прерывания: #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A (void) { ... пытаюсь мограть лампочками.... }
//непрерывный режим таймер вверх TA0CCTL0 |= 0x0020; TA0CCTL0 |= 0x0003; TA0CCTL0 |= 0x0200;
//Пределы счетчиков... TA0CCR0 = 0xFFFF;
P10DIR = 0; P10DIR |= 0xC0; P10OUT = 0xC0; }
добавил в окно наблюдения регистр TA0R, который должен инкрементироваться, но он не изменяется, и мк не переходит в функцию обработки прерывания ( лампочки не мигают). Надеюсь всё подробно описал. Заранее спасибо за ответ.
Настройки таймера следует производить в регистре TA0CTL. Следует правильно выбрать SMCLK, от которого тактируется Таймер. Следует разрешить прерывания (бит GIE в регистре SR).
1. Да, спасибо вы правы. Таймер заработал, регистр TA0R меняется, тактирование выбрал от SMCLK. 2. Теперь про прерывания.... бит GIE, поставит функция __bis_SR_register(GIE)? я сделал так: //Инициализация таймера TA0CTL = 0x0000; TA0R = 0; //Пределы счетчиков... TA0CCR0 = 0x8000; //непрерывный режим таймер вверх TA0CTL |= 0x0222; //Здесь мы убрали бит, что прерывание будем ждать... //Разрешить прерывания __bis_SR_register(GIE); функцию обработки прерывания мы определеили так:
Скорее всего не сбрасывается флаг прерывания. Попробуйте пройтись симулятором по шагам.
Спасибо за столь скорый ответ, я немного изменил формулировку вопроса..
1. Да, спасибо вы правы. Таймер заработал, регистр TA0R меняется, тактирование выбрал от SMCLK. 2. Теперь про прерывания.... бит GIE, поставит функция __bis_SR_register(GIE)? я сделал так: //Инициализация таймера TA0CTL = 0x0000; TA0R = 0; //Пределы счетчиков... TA0CCR0 = 0x8000; //непрерывный режим таймер вверх TA0CTL |= 0x0222; //Здесь мы убрали бит, что прерывание будем ждать... //Разрешить прерывания __bis_SR_register(GIE); функцию обработки прерывания мы определеили так:
__bis_SR_register(GIE); здесь перестало зависать ( если по шагам) после того как я убрал бит TAIFG в регистре TA0CTL. В функцию обработки прервания отладчик не заходит ( там стоит breakpoint)
Может быть я как-то не правильно для IAR определяю функцию обработки прервания?
Если хотите, чтобы произошло прерывание от таймера по достижении счетчиком значения в TA0CCR0, нужно разрешить прерываниe от канала 0 сравнения. Перепишите строчки кода как показано ниже TA0CTL = TASSEL_2 + MC_1 + TACLR; TA0CCTL0 = CCIE;
Так, частично проблема решилась: Я изменил строки инициализации таймера так:
//Инициализация таймер TA1CTL = 0x0000; TA1R = 0; //Пределы счетчиков... TA1CCR0 = 0xFFFF; //непрерывный режим таймер вверх TA1CTL |= 0x02E3;
Теперь прерывание генерится, отладчик останавливается в функции обработки прерывания, но проблема заключается теперь в том, что прерывание срабатывает каждый инкремент счетчика... тоесть не до того момента, когда TA1R будет равен TA1CCR0, а каждый раз, как TA1R будет изменяться
Очень рекомендую прочитать еще раз внимательно секцию про таймер в ДШ - там все достаточно ясно написано. Посмотрите еще примеры программ для MSP430F5xx, скачайте их с сайтa TI. Ну а если ничего не получится, выложите сюда весь код.
Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 15
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения