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:MSP430G2553

Guru**** 2535750 points
Other Parts Discussed in Thread: MSP430G2553

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/592171/msp430g2553-msp430g2553

器件型号:MSP430G2553

我正在尝试以下代码以在主循环的 ccr1为800旋转我的直流电机、当 IR 传感器从高电平变为低电平时、我将通过连接 IR 传感器来生成外部中断程序进入 ISR 并以 ccr1为300旋转; 之后、我将清除中断标志;但我的程序仍不会从 ISR 中退出。

请帮我解决这个问题

我是否需要在我的计划中添加额外的代码;如果需要、建议这样做;

封装:

#include "msp430g2553.h"
#include "intrinsics.h"


void main (void)

WDTCTL = WDTPW + WDTHOLD;//看门狗计时器设置

IF (CALBC1_1MHz =0xFF || CALDCO_1MHz =0xFF)

while (1);  
}  

BCSCTL1 = CALBC1_1MHz;//设置范围
DCOCTL = CALDCO_1MHz;//设置 DCO 步长+调制


P1DIR |= BIT2;
P1SEL |= BIT2;

// P1DIR |=~BIT3;
//P1IN |= BIT3;
P1IE |= BIT3;// P1.3中断被启用
P1IES |= BIT3;// P1.3高/低边沿
P1IFG &=~BIT3;// P1.3 IFG 被清零
bis_SR_register (GIE);
_ENABLE_INTERRUPT ();//启用所有中断


CCR0=1000-1;
CCTL1=OUTMOD_7;
CCR1=800;
TACTL=tassel_2+MC_1_ID_3;


#pragma vector=Port1_vector
_interrupt void Port_1 (void)


//P1DIR |= BIT2;
// P1SEL |= BIT2;


CCR0=1000-1;
CCTL1=OUTMOD_7;
CCR1=300;
TACTL=tassel_2+MC_1_ID_3;

P1IFG &=~BIT3;

感谢您;

此致、

Naveen Kulkarni

MTECH

MSRIT、班加罗尔

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

    我收到了你的问题。 请给我一些时间来查看您的代码、我会再给您回复。

    谢谢、

    NIMA Eskandari
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它是什么类型的红外传感器、即输入信号看起来是什么样子?

    如果是(TV)远程控制接收器、则信号边沿可能会以1-2ms 的周期到达、比8ms PWM 周期快得多。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的主函数结束。 它永远不会进入无限循环、也不会进入低功耗模式。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我正在进行障碍物检测的原型设计。

    红外传感器用于检测障碍物。
    一旦检测到障碍物、红外传感器就会变高。在障碍物未被清除之前、传感器保持高电平。
    一旦障碍物被清除、它会再次变为低电平。

    当障碍物不存在时、我希望直流电机以800的 ccr1旋转、即当我的红外传感器较低时
    一旦检测到障碍物、传感器就会从低到高、并发出中断标志、程序进入 ISR。
    一旦它进入 ISR、电机应该以更低的速度旋转、我们甚至可以考虑将速度减至-ccr1并使电机停止、在我的情况下、我选择继续以低速旋转、所以我提到 ccr1为300。
    我现在面临的问题是
    一旦我清除了 IR 传感器从高电平变为低电平的障碍、程序必须离开 ISR 并进入主函数、然后在 ccr1为800时继续旋转。
    但我的程序被 ISR 占用。一旦检测到障碍物、即使障碍物被清除、它仍会在 CCr1 300的缓慢转换下继续旋转。


    我希望现在的问题说明清晰明了、
    请向我提供上述情况的解决办法。

    此致
    Naveen Kulkarni
    Msrit Banagalore。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您的 main()结束... 设置中断后没有代码。
    请添加

    while (1)

    //Enter LPM0模式
    _bis_SR_register (LPM0_bits + GIE);
    //more to do (要做的事情更多)
    //退出 LPM0后在此处插入代码


    到 main 的末尾。


    在 ISR 加法的末尾
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我根据您的指导进行了修改;
    请查看以下内容:


    #include "msp430g2553.h"
    #include "intrinsics.h"


    void main (void)

    WDTCTL = WDTPW + WDTHOLD;//看门狗计时器设置

    IF (CALBC1_1MHz =0xFF || CALDCO_1MHz =0xFF)

    while (1);//如果校准常数被擦除,
    }//陷阱 CPU!!

    BCSCTL1 = CALBC1_1MHz;//设置范围
    DCOCTL = CALDCO_1MHz;//设置 DCO 步长+调制


    P1DIR |= BIT2;
    P1SEL |= BIT2;

    // P1DIR |=~BIT3;
    //P1IN |= BIT3;
    P1IE |= BIT3; // P1.3中断被启用
    P1IES |= BIT3; // P1.3高/低边沿
    P1IFG &=~BIT3; // P1.3 IFG 被清零
    //_Bis_SR_register (GIE);
    _enable_interrupt (); //启用所有中断



    while (1)

    //Enter LPM0模式
    _bis_SR_register (LPM0_bits + GIE);
    //more to do (要做的事情更多)
    CCR0=1000-1;
    CCTL1=OUTMOD_7;
    CCR1=800;
    TACTL=tassel_2+MC_1_ID_3; //退出 LPM0后在此处插入代码




    #pragma vector=Port1_vector
    _interrupt void Port_1 (void)



    //P1DIR |= BIT2;
    // P1SEL |= BIT2;




    CCR0=1000-1;
    CCTL1=OUTMOD_7;
    CCR1=300;
    TACTL=tassel_2+MC_1_ID_3;

    P1IFG &=~BIT3;
    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);








    这使我的程序在开始时进入 LPM、并在检测到障碍物时在 ccr1 0f 800处开始旋转。
    程序行为错误。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    从状态机的角度来看、您的代码现在将执行以下操作。

    将器件设置为以1MHz 运行。
    (我不确定您尝试对 P1.2执行什么操作)
    设置 P1.3以在更改时中断
    然后进入低功耗模式、在中断发生前不执行任何操作。 (中断完成后、我们将返回此行)
    当 P1.3中断发生时、将定时器设置为 PMW、CCR1为300。
    退出 ISR 并退出低功耗模式。
    现在、我们开始在"//more to to"执行代码
    将 CCR1设置为800时的 PMW 计时器。

    这不会达到您原来的问题。 您必须在 while 环路之前将计时器设置为 PMW、并将 CCR1设置为800。
    然后在 LPM 中等待。
    中断会将计时器切换为 CCR1 300。
    退出 LPM。
    检查 P1.3上的信号何时变化。 (通过轮询或中断)
    将计时器重置为 PWM、CCR1为800。
    在 LPM 中等待 P1.3发出中断。
    重复。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否修改代码并将其发送给我?
    我已经尝试了所有方法、但没有从 ISR 中退出。

    在代码的这一部分面临问题:



    退出 LPM。
    检查 P1.3上的信号何时变化。 (通过轮询或中断)
    将计时器重置为 PWM、CCR1为800。
    在 LPM 中等待 P1.3发出中断。
    重复。


    谢谢您、
    此致、
    Naveen Kulkarni