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

 
 
> Тамер B и переполнение стека.
Sinoptic555
сообщение Feb 19 2008, 12:24
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 91
Регистрация: 22-08-06
Пользователь №: 19 737



Пытаюсь добиться, чтобы таймер B каждую секунду генерил прерывание.
Проблема в том, что переполняется стек и программа перестает работать.

Таймер запускаю в режиме "вверх" MCx=01 и TBCCR0=0x7FFF;
Таймер тактирую от часового кварца от ACLK.


В общем 1, может 2 раза оба прерывания отрабатываются: TIMERB0_VECTOR и
переполнение таймера по TBIV=0E.
Однако, если ставится большой период в TBCCR0 то вообще ничего не отрабатывается, стек переполняется и все.
Сложных функций нет, рекурсий нет, да и программы как таковой нет
откуда переполнение ума не приложу.


Скажите, это нормально что при переполнении таймера и установке TBIFG=1 во всех
регистрах TBCCTLx (кроме нулевого) CCIFG устанавливается в 1?

Всю голову уже сломал что не так, но понять не могу что не так.
Подскажите может кто то с переполнениями стека уже сталкивался.

Внизу привожу код - в общем то все по книжке.

Код
void TimerB_Init(void){
  
  //Register Clearing
  TBCTL|=TBCLR; //Clear timer [TAR] value
  TBCTL|=CNTL_0; // Set counter lenght: 16 bit
  TBCTL|=TBSSEL_1; //select ACLK (32768) input
  TBCTL|=TBCLGRP_0; //Timer B Group: 0 - individually
  TBCTL&=0xFF0F; //IDx=00b, MCx=00xx
  TBCTL|=TBIE; //  Timer B interrupt enable =ON
  TBCTL&=~TBIFG; // Timer B interrupt flag =OFF
  
  TBCCTL0=0x000; TBCCTL0|=CLLD_0+CCIE;
  TBCCTL1=0x000;
  TBCCTL2=0x000;
  TBCCTL3=0x000;
  TBCCTL4=0x000;
  TBCCTL5=0x000;
  TBCCTL6=0x000;
  
  //Set start conditions
  TBCCR0=0x7FFF; //Interrupt every 1 sec.
  //TBCCR0=0x100;
  TBCCR1=0x0000;
  TBCCR2=0x0000;
  TBCCR3=0x0000;
  TBCCR4=0x0000;
  TBCCR5=0x0000;
  TBCCR6=0x0000;
  
  TBCTL&=0xFFCF; //MCx=00
  TBCTL|=0x10; // Start timer UP in continious mode
}



#pragma vector=TIMERB0_VECTOR
__interrupt void TimerB0(void){
  int a=0;
    a++;
}


#pragma vector=TIMERB1_VECTOR
__interrupt void TimerB1(void){
int b=0;

  switch(TBIV){
    case 0x02:
    break;
    
    case 0x04:
    break;
    
    case 0x0E: // Timer overflow
       b++;
    break;
  }
}



int main( void )
{
  int a=0;

   WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
  
   FLL_CTL0&=0xF; // Reset high 4 bits
   SCFI0 &=0x3F;  // Clear FLLDx
   SCFI0 |= FN_2; // x2 DCO, 4MHz nominal DCO
   SCFQCTL = 74;  // (74+1) x 32768 = 2.45Mhz
  
   _BIS_SR(GIE); // Global interrupt enable
  
   TimerB_Init();


  // Wait for interrupts
  while(1){
    a=a+1;
    if(a>500)
      a=0;
  }
  
  return 0;
}


Сообщение отредактировал Sinoptic555 - Feb 19 2008, 12:29
Go to the top of the page
 
+Quote Post



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

 


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


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