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.

[参考译文] CCS/MSP430G2553:MSP430 Launchpad Port1矢量和端口2矢量中断同时发生。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/861216/ccs-msp430g2553-msp430-launchpad-port1-vector-and-port-2-vector-interrupt-at-same-time

器件型号:MSP430G2553

工具/软件:Code Composer Studio

你(们)好 我需要为我的演讲制作一个项目我的老师要求我们使用7段显示器和4个 LED 指示器进行0-9计数器。 7段显示屏显示数字、4 LED 显示为二进制数。 我们需要使用3个按钮来调节数字的上下、并使用一个按钮来关闭所有 LED。 我和我的朋友写了一个代码,可以满足他的要求,但是我们不能同时使用端口1和端口2矢量,因为我们只能使用2个按钮,我们不能使用第三个按钮。 如果您可以向我们展示如何同时使用端口1和端口2矢量中断、那么这将是非常好的。 我的 MSP430是一个内含 g2553的 launchpad。

代码:

#include  

int main (空)

    WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器

    P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6;//七段显示 bagladigimiz portlari 输出 yaptik

    P2DIR |= BIT0+BIT1 +BIT2 + BIT3;//二进制 olarak gosterecegimiz ledlicin 输入 yaptik ancak bu devreye daha sonra baglayacagiz (kodunu daha sonra yazacagiz)

    P1OUT &=~(BIT0+BIT1 +BIT2 + BIT3+BIT4+BIT5+BIT6);//baslangicta ledlerimizi kapadik

    P2OUT &=~(BIT0+BIT1 + BIT2 + BIT3);



    P1DIR &=~BIT7;//端口1 Deki BIT0dan BIT6 ya kadar olan Pinleri 七段显示 icin kullandik geriye Kalan BIT7 yi ONOFF tsu icin 输入 yaptik

    P2DIR &=~(BIT4+BIT4);// bu iki bit i ise rakamlarimizi arttirmak

    //alttaki kissimda ise butonlarimizi 上拉 olarak ayarladik

    P1REN |= BIT7;

    P2REN |= BIT4+BIT5;

    P1OUT |= BIT7;

    P2OUT |= BIT4+BIT5;

    //islemci hizini 1MHz yaptik

    DCOCTL= CALDCO_1MHz;

    BCSCTL1 = CALBC1_1MHz;

    // alttaki kimida butonlarimiz icin gerekli interrupt registerlarini atadik

    P1IE |= BIT7;

    P2IE |= BIT4+BIT5;

    P1IFG &=~BIT7;

    P2IFG &=~(BIT4+BIT4);

    P1IES |= BIT7;

    P2IES |= BIT4+BIT5;

    _BIS_SR (GIE);

    返回0;



#pragma vector = Port1_vector

_interrupt void ONOFF (void)

    int display[11]={0、0x3F、0x06、0x5B、0x4F、0x66、0x6D、0x7D、0x07、0x7F、0x6f};//internetten yarlanarak 七段显示 icin 十六进制 kodlari yazaye 显示 adik

    int n=0;// n integerini belirledik boylece her n yi arttirdigimizda display icinde sonraki sayiya gelecek ve seven segment display de gozlemleecegiz

       if (((P1IN&BIT7)!= BIT7) //端口1 Deki butonu kapatmak icin ayaladik

       {

           N=4;

       P1OUT |= DISPLAY[n];

       P1IFG &=~BIT7;

       }

#pragma vector = port2_vector

_interrupt void AYAR (void)



    int display[11]={0、0x3F、0x06、0x5B、0x4F、0x66、0x6D、0x7D、0x07、0x7F、0x6f};

    int n=0;

    int LED[11]={0x00、0x00、0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09};

    while (1)

    {

        if (((P2IN&BIT4)!= BIT4)&&((P2IN&BIT4)= BIT4)// port2 deki bit4e denk gelen butonu sayiyi arttirmak icin kurduk

        {

            if (n=10)// n degerimiz 10 a eit olursa(亚尼萨伊奥拉克9 u gercerte)

            {

                N=0;

                P2IFG &=~BIT4;

            }




            P1OUT &=~显示[n];// burada yaptigimiz islem once suanki n degerini sondur sonraki n degerine GEC o o degere denk gelen ledleri yak

            P2OUT &=~LED[n];

            N++;

            P1OUT |= DISPLAY[n];

            P2OUT |= LED[n];

            P2IFG &=~BIT4;

            如果(n=1)

            {

                P2OUT &=~(BIT0+BIT1 + BIT2 + BIT3);

            }



            if (n=1) // bunu koymayinca 0 da bazi ledlerin yerleri karisiyordu ONU debuggladik

            {

                P1OUT &=~BIT6;

                P1OUT |= BIT1;

            }

            if (n=2)// bu kodda ise 1 de 1 tane led fazladan yaniyordu ONU sondurduk

            {

                P1OUT &=~BIT6;

            }




            _DELAY_CYCLES (250000);



        }

        if ((((P2IN-BIT5)!= BIT5)&&((P2IN&BIT4)= BIT4)// yukaridaki islemlerin aynisini yaptik Tek FARK burda rakamlimiz azaliyor

        {

            如果(n<=1)

            {

                N=11;

                P2IFG &=~BIT4;

            }

            P1OUT &=~DISPLAY[n];

            P2OUT &=~LED[n];

            N-;



            P1OUT |= DISPLAY[n];

            P2OUT |= LED[n];

            P2IFG &=~BIT4;

            如果(n=1)

            {

                P2OUT &=~(BIT0+BIT1 + BIT2 + BIT3);

            }

            如果(n=10)

            {

                P1OUT &=~ BIT4;

            }



            如果(n=1)

            {

                P1OUT &=~ BIT6;

                P1OUT |= BIT1;

            }

            如果(n=2)

            {

                P1OUT &=~ BIT6;

            }

            _DELAY_CYCLES (250000);

            }

        如果(((P2IN&BIT4)!= BIT5)&((P2IN&BIT4)!= BIT4))

        {

            P1OUT &=~DISPLAY[n];

            P2OUT &=~LED[n];

            P2IFG &=~BIT4;

            P2IFG &=~BIT4;

            _DELAY_CYCLES (750000);

        }

        }





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

    您好!

    我将提请器件专家注意此主题。 请注意、由于当地假日、响应可能会延迟。

    谢谢

    Ki

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

    > while (1)

    这不应出现在 ISR 中、因为中断(GIE)在 ISR 中被禁用。 此循环中没有"break"或"return"语句、因此一旦触发 port2 ISR、它将永远不会退出、因此永远不会调用 Port1 ISR。

    简单的补救方法是删除此 while 语句。 这样做之后、您可能(或可能不)遇到其他与 ISR 永久运行相关的依赖关系。

    您应该将 按钮按压视为"事件";ISR 处理该事件并返回、然后您的程序直到下一个事件才会执行任何操作。

    最终您将需要去抖。 症状是您将按一次按钮、看起来像是多次按。 G2ET Launchpad 按钮的抖动不会太大、因此暂时专注于逻辑。

    [编辑: 更正了拼写错误]

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

    这是我的新代码、我删除了 while 部分并进行了一些更改、因为旧版本的代码不接受端口1和端口2矢量按钮中断。 我现在可以同时使用2个端口、但我无法更改显示屏 n 和 LED n、因为显示屏和 LED 状态根本没有更改。 感谢您的回答。  

    #include  

    int main (空)

      WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器

      P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6;//七段显示 bagladigimiz portlari 输出 yaptik

      P2DIR |= BIT0+BIT1 + BIT2 + BIT3;//二进制 olarak gosterecegimiz ledliceri in 输入 yaptik

      P1OUT &=~(BIT0+BIT1 +BIT2 + BIT3+BIT4+BIT5+BIT6);//baslangicta ledlerimizi kapadik

      P2OUT &=~(BIT0+BIT1 + BIT2 + BIT3);

      P1DIR &=~BIT7;//端口1 Deki BIT0dan BIT6 ya kadar olan Pinleri 七段显示 icin kullandik geriye Kalan BIT7 yi ONOFF tsu icin 输入 yaptik

      P2DIR &=~(BIT4+BIT5);// bu iki bit i ise rakamlarimizi arttirip azaltmak icin kullacagimiz butonlar icin input yaptik

      //alttaki kissimda ise butonlarimizi 上拉 olarak ayarladik

      P1REN |= BIT7;

      P2REN |= BIT4+BIT5;

      P1OUT |= BIT7;

      P2OUT |= BIT4+BIT5;

      //islemci hizini 1MHz yaptik

      DCOCTL= CALDCO_1MHz;

      BCSCTL1 = CALBC1_1MHz;

      // alttaki kimida butonlarimiz icin gerekli interrupt registerlarini atadik

      P1IE |= BIT7;

      P2IE |= BIT4+BIT5;

      P1IFG &=~BIT7;

      P2IFG &=~(BIT4+BIT4);

      P1IES |= BIT7;

      P2IES |= BIT4+BIT5;

      _BIS_SR (GIE);

      返回0;

    #pragma vector = Port1_vector

    _interrupt void ONOFF (void)

      int display[11]={0、0x3F、0x06、0x5B、0x4F、0x66、0x6D、0x7D、0x07、0x7F、0x6f};//internetten yarlanarak 七段显示 icin 十六进制 kodlari yazaye 显示 adik

      int n=0;// n integerini belirledik boylece her n yi arttirdigimizda veya azlattigimizda display icinde sonraki veya onceki sayiya gecek vive seven seven segment display de gozlemleecegiz

      int led[11]={0x00、0x00、0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09};//二进制 ledlerimiz icin ayarlamalar

      N=8;

      _DELAY_CYCLES (250000);

      if (P1IFG&BIT4)

      {

        P2OUT^=LED[n];

        P1OUT^=显示[n];

        _DELAY_CYCLES (250000);

      }

        P1IFG=0;

    #pragma vector = port2_vector // rakamlari arttirip azaltmak icin 2 butonumuz port2 de

    _interrupt void AYAR (void)

      int display[11]={0、0x3F、0x06、0x5B、0x4F、0x66、0x6D、0x7D、0x07、0x7F、0x6f};//internetten yarlanarak 七段显示 icin 十六进制 kodlari yazaye 显示 adik

      int n=0;// n integerini belirledik boylece her n yi arttirdigimizda veya azlattigimizda display icinde sonraki veya onceki sayiya gecek vive seven seven segment display de gozlemleecegiz

      int led[11]={0x00、0x00、0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08、0x09};//二进制 ledlerimiz icin ayarlamalar

      IF (P2IFG&BIT4)

       {

        P1OUT &=~显示[n];// burada yaptigimiz islem once suanki n degerini sondur sonraki n degerine GEC ve o degere denk gelen ledleri yak

        P2OUT &=~LED[n];//二进制 icin o Anki degeri sondur sonraki n degerine GEC ve o degere denk gelen ledleri yak

        N=n+1;

        P1OUT |= DISPLAY[n];

        P2OUT |= LED[n];

        P2IFG = 0;

       }

      IF (P2IFG&BIT4)

       {

         P2OUT^= BIT1;

         P1OUT^= BIT2;

         _DELAY_CYCLES (250000);

       }

         P2IFG=0;

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

    > int n=0;// n integerini belirledik boylece her n yi arttirdigimizda veya azlattigimizda display icinde sonraki veya onceki sayiya gecek ve even seven segment display de gozlemleecegiz

    这将出现在您的每个 ISR 中。 这会创建两个不同的变量、每个 ISR 都是局部变量(也是临时变量)、当每个 ISR 返回时、这些变量"消失"。

    我怀疑您实际上需要一个两个 ISR 都可以使用的"全局"变量、该变量在按钮按压之间保留其值。

    为此、请在任何函数之外声明(一次)它(通常在文件顶部附近是一个好地方)。

    您还应该将其声明为"volatile",即"volatile int n=0;"--您现在不需要此文件,但您可能稍后需要此文件,具体取决于您的程序是如何增长的。

    --------

    >   P2IFG = 0;

       >}

    >  IF (P2IFG&BIT5)

    这个序列看起来有点奇怪--如果 P2.4显示一个 IFG,代码将在它检查 P2.5之前清除标志,所以你永远不会同时看到这两个标记。 也许这是有意的、但乍一看、这似乎是一个错误。

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

    您好!

    我们已经没有收到您的消息超过一周,因此我假设您能够解决您的问题。 如果情况并非如此,请单击“这无法解决我的问题”按钮,并使用更多信息回复此主题。 如果此主题锁定、请单击"提出相关问题"按钮、然后在新主题中描述您的问题的当前状态以及您可能需要帮助我们帮助解决您的问题的任何其他详细信息。