| Форум РадиоКот https://radiokot.ru/forum/ |
|
| MSP430 + внутренний таймер https://radiokot.ru/forum/viewtopic.php?f=59&t=82587 |
Страница 1 из 1 |
| Автор: | bishop-strip [ Вт дек 25, 2012 02:07:50 ] |
| Заголовок сообщения: | MSP430 + внутренний таймер |
Добрый вечер! Рабтаю с микроконтроллером 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) { ... пытаюсь мограть лампочками.... } код программы: #include "io430.h" //Функция инициализации портов и регистров void Initialization(); void main( void ) { Initialization(); //Входим в бесконечный цикл while(1) { } } void Initialization() { //Останавливаем сторжевой таймер WDTCTL = WDTPW + WDTHOLD; TA0R = 0x0000; TA0CCTL0 = 0x0000; //непрерывный режим таймер вверх TA0CCTL0 |= 0x0020; TA0CCTL0 |= 0x0003; TA0CCTL0 |= 0x0200; //Пределы счетчиков... TA0CCR0 = 0xFFFF; P10DIR = 0; P10DIR |= 0xC0; P10OUT = 0xC0; } добавил в окно наблюдения регистр TA0R, который должен инкрементироваться, но он не изменяется, и мк не переходит в функцию обработки прерывания ( лампочки не мигают). Надеюсь всё подробно описал. Заранее спасибо за ответ. |
|
| Автор: | Ser60 [ Вт дек 25, 2012 08:34:00 ] |
| Заголовок сообщения: | Re: MSP430 + внутренний таймер |
Настройки таймера следует производить в регистре TA0CTL. Следует правильно выбрать SMCLK, от которого тактируется Таймер. Следует разрешить прерывания (бит GIE в регистре SR). |
|
| Автор: | bishop-strip [ Вт дек 25, 2012 21:13:33 ] |
| Заголовок сообщения: | Re: MSP430 + внутренний таймер |
1. Да, спасибо вы правы. Таймер заработал, регистр TA0R меняется, тактирование выбрал от SMCLK. 2. Теперь про прерывания.... бит GIE, поставит функция __bis_SR_register(GIE)? я сделал так: //Инициализация таймера TA0CTL = 0x0000; TA0R = 0; //Пределы счетчиков... TA0CCR0 = 0x8000; //непрерывный режим таймер вверх TA0CTL |= 0x0222; //Здесь мы убрали бит, что прерывание будем ждать... //Разрешить прерывания __bis_SR_register(GIE); функцию обработки прерывания мы определеили так: //Обработчик прерывания от таймера #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A (void) { P10OUT = P10OUT ^ 0xC0; } Но прерывание не происходит... |
|
| Автор: | Ser60 [ Вт дек 25, 2012 21:28:07 ] |
| Заголовок сообщения: | Re: MSP430 + внутренний таймер |
Скорее всего это из-за того, что не сбрасывается флаг прерывания от таймера в прерывании. Попробуйте пройтись симулятором по шагам. |
|
| Автор: | bishop-strip [ Вт дек 25, 2012 21:30:31 ] |
| Заголовок сообщения: | Re: MSP430 + внутренний таймер |
Ser60 писал(а): Скорее всего не сбрасывается флаг прерывания. Попробуйте пройтись симулятором по шагам. Спасибо за столь скорый ответ, я немного изменил формулировку вопроса.. 1. Да, спасибо вы правы. Таймер заработал, регистр TA0R меняется, тактирование выбрал от SMCLK. 2. Теперь про прерывания.... бит GIE, поставит функция __bis_SR_register(GIE)? я сделал так: //Инициализация таймера TA0CTL = 0x0000; TA0R = 0; //Пределы счетчиков... TA0CCR0 = 0x8000; //непрерывный режим таймер вверх TA0CTL |= 0x0222; //Здесь мы убрали бит, что прерывание будем ждать... //Разрешить прерывания __bis_SR_register(GIE); функцию обработки прерывания мы определеили так: //Обработчик прерывания от таймера #pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A (void) { P10OUT = P10OUT ^ 0xC0; } __bis_SR_register(GIE); здесь перестало зависать ( если по шагам) после того как я убрал бит TAIFG в регистре TA0CTL. В функцию обработки прервания отладчик не заходит ( там стоит breakpoint) Может быть я как-то не правильно для IAR определяю функцию обработки прервания? |
|
| Автор: | Ser60 [ Вт дек 25, 2012 22:15:02 ] |
| Заголовок сообщения: | Re: MSP430 + внутренний таймер |
Если хотите, чтобы произошло прерывание от таймера по достижении счетчиком значения в TA0CCR0, нужно разрешить прерываниe от канала 0 сравнения. Перепишите строчки кода как показано ниже TA0CTL = TASSEL_2 + MC_1 + TACLR; TA0CCTL0 = CCIE; |
|
| Автор: | bishop-strip [ Ср дек 26, 2012 04:35:07 ] |
| Заголовок сообщения: | Re: MSP430 + внутренний таймер |
Так, частично проблема решилась: Я изменил строки инициализации таймера так: //Инициализация таймер TA1CTL = 0x0000; TA1R = 0; //Пределы счетчиков... TA1CCR0 = 0xFFFF; //непрерывный режим таймер вверх TA1CTL |= 0x02E3; Теперь прерывание генерится, отладчик останавливается в функции обработки прерывания, но проблема заключается теперь в том, что прерывание срабатывает каждый инкремент счетчика... тоесть не до того момента, когда TA1R будет равен TA1CCR0, а каждый раз, как TA1R будет изменяться |
|
| Автор: | Ser60 [ Ср дек 26, 2012 06:27:08 ] |
| Заголовок сообщения: | Re: MSP430 + внутренний таймер |
Очень рекомендую прочитать еще раз внимательно секцию про таймер в ДШ - там все достаточно ясно написано. Посмотрите еще примеры программ для MSP430F5xx, скачайте их с сайтa TI. Ну а если ничего не получится, выложите сюда весь код. |
|
| Автор: | bishop-strip [ Ср дек 26, 2012 21:12:02 ] |
| Заголовок сообщения: | Re: MSP430 + внутренний таймер |
Вроде получилось: //Инициализация таймера TA1CCTL0 = CCIE; TA1CCR0 = 0xFFFF; TA1CTL = TASSEL_2 + MC_2 + TACLR + ID0 + ID1; __enable_interrupt(); //Разрешение прерываний //Обработчик прерывания от таймера #pragma vector=TIMER1_A0_VECTOR __interrupt void Timer_A (void) { ...... } Вот так. Ser60, спасибо Вам за содействие в этом деле!) |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


