This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430G2553:timerA、而不是延迟函数

Guru**** 2534260 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/867731/msp430g2553-timera-instead-of-delay-function

器件型号:MSP430G2553

你(们)好

我正在处理代码中的小移位、我使用了延迟周期、但我想使用 timerA。尝试了一些东西、但它不起作用。

#include "msp430g2553.h"


#define SW1 BIT3
#define SW2 BIT4
#define SW3 BIT5
#define SEG_A BIT0
#define SEG_B BIT1
#define SEG_C BIT2
#define SEG_D BIT3
const unsigned int digit[5]={SEG_A BIT1 + SEG_A
~


+ SEG_D + SEG_A + SEG_A + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG + SEG UNsigned INVAL INT INT INT INT INT_UN

int b;
int c;
int t;
int 语言;
int nextposition;
void GO_up (void);
void GO_DOWN (void);


void main (void)
{
电流位置= 2;
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P2DIR =(SEG_A + SEG_B + SEG_C + SEG_D);
P1DIR =~SW1 +~SW2 +~SW3; //设置 SW 引脚->输入
P1REN = SW1 + SW2 + SW3; // SW 引脚的使能电阻器
P1OUT = SW1 + SW2 + SW3;
P1IE |= BIT3 + BIT4 + BIT4;
P1IES |= BIT3 + BIT4 + BIT4;
P1REN |= BIT3 + BIT4 + BIT4;
P1OUT |= BIT3;
P1IFG &=~BIT3 +~BIT4 +~BIT4;
while (1) //循环永远,我们处理中断!
{_BIS_SR (CPUOFF + GIE);}
//输入带中断


的 LPM0 }


//端口1中断服务例程的地址为 Port1_vector
#pragma vector=Port1_vector
__interrupt void Button (void)
{
if (!(P1IN 和 SW1)) //检查是否按下了 SW
{

_delay_cycles (10000);
A = 1;
nextposition = currentposition - A;

if (nextposition = 1)(如果(nextposition = 1))
{
语言= 1;
GO_dow();
}
if (nextposition == 2)
{
语言= 4;
GO_dow();

}
当前位置= 1;


}




if (!(P1IN 和 SW2)) //检查是否按下了 SW
{
_delay_cycles (10000);


b = 2;
nextposition = currentposition - b;

if (nextposition =-1)(如果(nextposition =-1))
{
语言= 2;
GO_dow();
}
if (nextposition = 1)(如果(nextposition = 1))
{
语言= 1;
GO_dow();
}
当前位置= 2;
}

if (!(P1IN 和 SW3)) //检查是否按下了 SW
{
C = 3;
nextposition = currentposition - c;
if (nextposition =-2)
{

语言= 3;
GO_dow();
}
if (nextposition =-1)(如果(nextposition =-1))
{
语言= 2;
GO_dow();

}
当前位置= 3;
}


P1IFG &=~BIT3;
__DELAY_CYCLES (1000);


}

void GO_UP (void){


volatile unsigned int i;
对于(x = 0;x < 100;x++)
{




对于(I = 0;I < 4;I++)
{
P2OUT =(P2OUT 和 DMASK)+数字[i];

__delay_cycles (10000);


}
__DELAY_CYCLES (1000);
}






P2OUT = 0;
}

void GO_DOWN (void){

volatile unsigned int i;

for (t = 100;t > 0;t-)
{


对于(I = 4;I > 0;I-)
{
P2OUT =(P2OUT 和 DMASK)+数字[i];

__delay_cycles (10000);


}
__DELAY_CYCLES (1000);
}





P2OUT = 0;


}

void GO_dow (void){

switch (language){
案例1:
{

GO_DOWN();
语言= 0;
中断;

}
案例2:
{
GO_UP();
语言= 0;
中断;
}
案例3:
{
GO_UP();
GO_UP();
语言= 0;
中断;
}
案例4:
{
GO_DOWN();
GO_DOWN();
语言= 0;
中断;
}
}

#include "msp430g2553.h"

#define SW1 BIT3
#define SW2 BIT4
#define SW3 BIT5
#define SEG_A BIT0
#define SEG_B BIT1
#define SEG_C BIT2
#define UNsigned SEG_D BIT3

#define DMASK ~(SEG_A + SEG_B + SEG_B

+ SEG_B + SEG_B + SEG_B + SEG_UNLOCK UNLOCK INT_UNLOCK 位数;SEG_INT_UNLOCK + SEG_D + SEG_INT_UNLOCK + SEG_INT_UNLOCK + SEG_INT_UNLOCK + SEG[SEG_INT_SEG_INT_SEG]



int a;
int b;
int c;
int t;
int 语言;
int nextposition;
void GO_up (void);
void GO_DOWN (void);

volatile unsigned char delay;

#pragma vector=TIMER0_A0_vector
__interrupt void TIMER0_A0_ISR (void)
{
延迟= 0;
}

void timer_delay (unsigned int msec)
{
延迟= 1;
if (msec > 174)
msec = 174;

TACCR0 = msec*375 + TA0R;
TACCTL0 = CCIE;
while (延迟>0);
TACCTL0 &=~CCIE;
}


void timer_init (void)
{
BCSCTL2 |= DIVS_3;
TACTL |= TASSEL_2 | ID_2;
TACTL |= TACLR | MC_2;
}


void main (void)
{
电流位置= 2;
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P2DIR |=(SEG_A + SEG_B + SEG_C + SEG_D);
P1DIR &=~Ω(SW1 + SW2 + SW3); //设置 SW 引脚->输入
P1REN |=(SW1 + SW2 + SW3); // SW 引脚的使能电阻器
P1OUT |=(SW1 + SW2 + SW3);
P1IE |= BIT3 + BIT4 + BIT4;
P1IES |= BIT3 + BIT4 + BIT4;
P1REN |= BIT3 + BIT4 + BIT4;
P1OUT |= BIT3;
P1IFG &=~(BIT3 + BIT4 + BIT4);
timer_init();

while (1) //循环永远,我们处理中断!
{
_BIS_SR (CPUOFF + GIE);
}
//通过中断
输入 LPM0}

void go_dow (void);

//端口1中断服务例程的地址为 Port1_vector
#pragma vector=Port1_vector
__interrupt void Button (void)
{
IF (!(P1IN 和 SW1)) //检查是否按下了 SW
{
Timer_delay (8);
//
A = 1;
nextposition = currentposition - A;

如果(nextposition = 1)
{
语言= 1;
GO_dow();
}
如果(nextposition == 2)
{
语言= 4;
GO_dow();
}
当前位置= 1;
}

IF (!(P1IN 和 SW2)) //检查是否按下了 SW
{
Timer_delay (8);
//
b = 2;
nextposition = currentposition - b;

如果(nextposition =-1)
{
语言= 2;
GO_dow();
}
如果(nextposition = 1)
{
语言= 1;
GO_dow();
}
当前位置= 2;
}

IF (!(P1IN 和 SW3)) //检查是否按下了 SW
{
C = 3;
nextposition = currentposition - c;
如果(nextposition =-2)
{
语言= 3;
GO_dow();
}
如果(nextposition =-1)
{
语言= 2;
GO_dow();
}
当前位置= 3;
}

P1IFG &=~BIT3;
Timer_delay (1);

}

void GO_UP (void)
{
volatile unsigned int i;
对于(x = 0;x < 100;x++)
{

对于(I = 0;I < 4;I++)
{
P2OUT =(P2OUT 和 DMASK)+数字[i];

Timer_delay (8);
//

}
Timer_delay (1);
//
}

P2OUT = 0;
}

void GO_DOWN (void)
{

volatile unsigned int i;

对于(t = 100;t > 0;t-)
{

对于(I = 4;I > 0;I-)
{
P2OUT =(P2OUT 和 DMASK)+数字[i];

Timer_delay (8);
//

}
Timer_delay (1);
//
}

P2OUT = 0;
}

void GO_dow (void)
{
开关(语言)
{
案例1:
{
GO_DOWN();
语言= 0;
中断;
}
案例2:
{
GO_UP();
语言= 0;
中断;
}
案例3:
{
GO_UP();
GO_UP();
语言= 0;
中断;
}
案例4:
{
GO_DOWN();
GO_DOWN();
语言= 0;
中断;
}
}



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    >      while(delay>0);

    这将等待 TIMER0_A0_VECTOR 被调用、但它(仅限)从 ISR 调用、因此中断被禁用、因此永远不会发生。

    此处的一个简单更改是:

    >     TA0CCTL0 =(0*CCIFG);   //初始清除 IFG

    >     while ((TA0CCTL0 & CCIFG)=0)/*empty*/;  //等待计时器过期

    显式等待 IFG。 在这种情况下、 不需要 CCIE 和 ISR。 (实际上、它们会妨碍您的工作。)

    未经请求:您的 Port1 ISR 看起来永远不会清除 SW2/SW3的 IFG、因此(在第一次推送之后)您的程序将只循环执行 ISR。 由于显式 P1IN 检查、这可能最终会执行正确的操作、但您可能会得到一些奇怪的效果。

    [编辑:为清晰起见、重新措辞。]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您的问题如何?

    此致

    Johnson

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢