Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не понятно поведение MSP430F2012
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
PhX
Написал следующий код:

Код
// P1.0 - OUTA Энкодер А
// P1.1 - OUTB Энкодер B
// P1.2 - Выход ШИМ
// P1.3 - Выход направления
// P1.4 - Выбор микросхемы SPI
// P1.5 - Синхросигнал SPI
// P1.6 - Данные SPI

#include <msp430x20x2.h>

unsigned int cnt = 0; // Переменная счетчик

void main(void)
{
  WDTCTL = WDTPW + WDTHOLD; // Чтобы не мешал Watchdog
  BCSCTL1 = CALBC1_16MHZ; // Устанавливаем DCO 16MHz
  DCOCTL = CALDCO_16MHZ; // Устанавливаем DCO 16MHz

// Настройка портов I/O

  P1DIR &= ~0x02; // P1.0, P1.1 на вход
  P1DIR |= 0x08;  //P1.3 на выход
  P1IE |= 0x02;    // P1.1 вкл. прерывания
  P1IES &= ~0x02; // P1.1 Передний фронт
  P1IFG &= ~0x02; // P1.1 сбросить флаг прерывания

// Настройка таймера

  P1SEL |= 0x04; // P1.3 вкл. функции переферии
  P1DIR |= 0x04; // P1.3 на выход
  TACCTL1 = OUTMOD_3 + CCIE; // PWM set/reset, interrupt enabled
  TACTL = TASSEL_2 + MC_1 + TAIE; // SMCLK, Up to CCR0, interrupt enabled
  TACCR0 = 1600;
  TACCR1 = 500;

  _EINT();
  for(;;);
}

// Обработчик прерывания Timer A1
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1 (void)
{
  if (TAIV==2) cnt++;
}

#pragma vector=PORT1_VECTOR
__interrupt void Port1_int (void)
{
// Выдаем на P1.3 направление вращения  
  if (P1IN & BIT1) P1OUT |= BIT3;
      else P1OUT &= ~BIT3;
// Меняем планку ШИМ в соответствии со скоростью.
  if (cnt<1590) TACCR1 = cnt;
    else TACCR1 = 1590;
  if (cnt<10) TACCR1 = 10;
  cnt = 0;
  P1IFG &= ~0x02;                           // P1.4 IFG cleared
}


Если убрать из обработчика прерывания таймера if (TAIV==2), оставив только cnt++; перестает работать прерывание PORT1. С чем связано такое поведение?

Да и вот еще вопрос, у таймера есть 2 вектора прерывания TIMERA0_VECTOR и TIMERA1_VECTOR в каких случаях работает первый, а в каких второй?
rezident
Цитата(PhX @ Oct 24 2010, 00:00) *
Если убрать из обработчика прерывания таймера if (TAIV==2), оставив только cnt++; перестает работать прерывание PORT1. С чем связано такое поведение?
До чего же люди ленивы в прочтении руководств? wink.gif Цитирую раздел 12.2.6 Timer_A Interrupts из MSP430x2xx Family User's Guide (Rev.E)
Цитата
Any access, read or write, of the TAIV register automatically resets the highest pending interrupt flag. If another interrupt flag is set, another interrupt is immediately generated after servicing the initial interrupt.
То бишь без обращения к регистру TAIV флаг прерывания автоматом не сбрасывается, а остается активным. А поскольку прерывание с адресом вектора TIMERA1_VECTOR имеет больший приоритет, чем прерывание PORT1_VECTOR (это указано в datasheet), то второе прерывание просто перестает вызываться.
Цитата(PhX @ Oct 24 2010, 00:00) *
Да и вот еще вопрос, у таймера есть 2 вектора прерывания TIMERA0_VECTOR и TIMERA1_VECTOR в каких случаях работает первый, а в каких второй?
Снова цитата из того же раздела руководства smile.gif
Цитата
Two interrupt vectors are associated with the 16-bit Timer_A module:
- TACCR0 interrupt vector for TACCR0 CCIFG
- TAIV interrupt vector for all other CCIFG flags and TAIFG
PhX
Большое спасибо!
Цитата(rezident @ Oct 23 2010, 22:42) *
До чего же люди ленивы в прочтении руководств? wink.gif...

Мы их ужё курили курили... Все здоровье подорвали... crying.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.