Например TDA7294

Форум РадиоКот :: Просмотр темы - MSP430 + внутренний таймер
Форум РадиоКот
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/