0

私はこの分野のマイクロコントローラーに不慣れで、私の新しいプロジェクトについて迅速なサポートが必要です。

MSP430F5131を使用しています。プロジェクトについて少し説明します。私の主な目標は、12.8MHz の外部発振器を使用して毎秒 1 パルスを生成することです。私はすでにそのプロジェクト用に印刷された PCB を持っています。つまり、前の設計者が何をしたかを理解し、それを自分の CCS プログラムに実装して、マイクロ コントローラーをプログラムする必要がありました。私はまだこのマイクロコントローラーの世界全体に慣れていないので、もっと知りたいと思っていますが、時間は短いです。

プロジェクトについてもう少し理解できるように、PCB の電気配線を添付しました。

電気配線の簡単な説明: 外部トグル スイッチ (コネクタ J6 "Internal/External Selection" から) は、外部 1pps (外部 GPS から) または内部 1pps (msp430 による) を切り替えます。内部モードを選択した場合 (入力 P2.2)、「1」(またはアクティブ ロー モードであるアクティブ ロー モードの場合は「0」) が PJ.3 (出力) から U4 に送信され、1 パルスあたり 1 パルスが送信されます。 2 番目は、P2.4 出力からコネクタ J8 および J9 (同じパルスの異なるコネクタ) に出力されます。

外部トグル スイッチ (J3 コネクタのピン 1、2) またはディスクリート (J3 コネクタのピン 3) を使用して、信号を ON/BAD/OFF に切り替えることができます。スイッチをオンモードに切り替えると、「1」(アクティブローモードであるアクティブローモードの場合は「0」)がP1.6を介してU5(およびゲート)に送信され、パルスが有効になり、「1」も送信されます' PJ.0 を介して U6 に接続し、パルスを TTL から RS422 (差動) に変換します。ディスクリート切替オプションは、外部トグルスイッチと同様にパルス(ON/OFF)を切り替えます。これは PULSE 1 を指します。PULSE 2 にも同じことを実装する必要があります。

RST/NMI/SBWTDIO と TEST/SBWTCK が何のために配線されているかはまだわかりませんが、これらはプログラムを msp にダウンロードするためのものですか? PJ.2 ピン (FUNCTIONALITY DISABLE) についてもわかりません。

読むべきことがたくさんあることはわかっていますが、このプロジェクトについては本当に時間がなく、すべてを勉強する時間があまりありません。コードを読んで、関数をコードに実装するのを手伝っていただければ幸いです。

私がこれを行ったかどうかを知りたいコードは次のとおりです。

#include <msp430.h>
#include <intrinsics.h>




volatile unsigned int timerCount = 0; //defines the millisecond counter
volatile unsigned int normalPulse1=0; //defines another flag to indicates when 1 second has passed for normal pulse1
volatile unsigned int badPulse1=0;//defines another flag to indicates when 1 second has passed for bad pulse1
volatile unsigned int normalPulse2=0; //defines another flag to indicates when 1 second has passed for normal pulse2
volatile unsigned int badPulse2=0;//defines another flag to indicates when 1 second has passed for bad pulse2

int main(void) {


    WDTCTL = WDTPW | WDTHOLD;                   // Stop watchdog timer
    P2OUT &= ~(BIT4);                           //preload 1pps to '0'


    // set I/O pins directions
    P1DIR |=BIT6+BIT7;                      //set p1.x to 11000000
    P2DIR |=BIT4;                          // Set P2.4 to output direction
    PJDIR |=BIT0+BIT1+BIT3;                // set pj.x output 0000 1011
    P2SEL |= BIT4;                         //select the option of using TD0.0 in pin 2.4
    P2IES |= BIT4;                         // high -> low is selected with IES.x = 1.
    P2IFG &= ~(BIT4);                      // To prevent an immediate interrupt, clear the flag for
                                          // P1.3 before enabling the interrupt.
    P2IE |= BIT4;                          // Enable interrupts for P2.4

    // Configure XT1 (external oscillator)
    PJSEL |= BIT4+BIT5;                     // port select for xt1
    UCSCTL6 &= ~(XT1OFF);                   //xt1 is on
    UCSCTL3 = 0;                            // FLL REFERENCE CLOCK REFERENCE = XT1

    // configure TD0.0 to output of 1 pulse per second
    TD0CTL0 |=MC_1+ID_3+TDSSEL_0+TDIE+CNTL_0+TDCLR;                //defining timer d TD0.0 (P2.4)
    TD0CCR0=1600-1;                          // setting TAR count up value 1600 (12.8MHz / 8 = 1.6MHz , 1.6MHz / 1600 = 1000 Hz) when 1000 is passed means 1 second has passed as well
    TD0CCTL0 |= CCIE;                        //ENABLES CCIFG INTERUPT ON CCR0


    __enable_interrupt();


    for(;;){                      // main loop (looping forever)



        //   EXTERNAL / INTERNAL SELECTION BY SW4

        if ((P2IN & BIT2)==0){         //  INTERNAL MODE
            PJOUT |=BIT3;              // sends '1' from pj.3 output to the multiplexer U4 (uses the internal 1pps)

            //PULSE 1 : DESCRETE ON/OFF AND SWITCH ON/BAD/OFF

                     if ((P2IN & BIT0)==0 || (P1IN & BIT0)==0) {        //NORMAL SIGNAL OF 1PPS checks if descrete source is on or 1pps sw pulse 1 is on
                         P1OUT |= BIT6;                                     //ENABLES PULSE BY THE 'AND' GATE
                         PJOUT |= BIT0;                                 //ENABLES TTL TO RS232 CONVERTER (FOR DIFF OUTPUT)
                          if(normalPulse1==1){                       //checks if normalPulse1 is on from the ISR
                            normalPulse1 =0;                           // sets normalPulse1 to 0 again so the ISR will generate the pulse 
                            P2OUT ^=BIT4;                            //generates 1pps out of p2.4
                         }

                     }

                     else {
                         P1OUT |= ~(BIT6);                              //DISABLES PULSE BY SENDING A '0' TO THE AND GATE
                     }

                     if ((P1IN & BIT2)==0)  {                           //PULSE 1 BAD SIGNAL checks if the 1pps sw bad pulse is on
                          P1OUT |= BIT6;                                    //ENABLES PULSE BY THE 'AND' GATE
                          PJOUT |= BIT0;                                    //ENABLES TTL TO RS232 CONVERTER (FOR DIFF OUTPUT)
                            if(badPulse1==1){                             //checks if badPulse1 is on from the ISR
                              badPulse1=0;                                // sets badPulse1 to 0 again so the ISR will generate the pulse
                              P2OUT ^=BIT4;                            //generates 1pps out of p2.4

                            }
                     }

                     //PULSE 2 : DESCRETE ON/OFF AND SWITCH ON/BAD/OFF


                     if ((P2IN & BIT1)==0 || (P1IN & BIT0)==0){         //NORMAL SIGNAL OF 1PPS checks if descrete source is on or 1pps sw pulse 2 is on
                         P1OUT |= BIT7;                                     //ENABLES PULSE BY THE 'AND' GATE
                         PJOUT |= BIT1;                                 //ENABLES TTL TO RS232 CONVERTER (FOR DIFF OUTPUT)
                            if(normalPulse2==1){
                                normalPulse2=0;                             // sets normalPulse2 to 0 again so the ISR will generate the pulse
                                P2OUT ^=BIT4;                            //generates 1pps out of p2.4

                            }


                     }



                     else {
                         P1OUT |= ~(BIT7);                                  //DISABLES PULSE BY SENDING A '0' TO THE AND GATE
                     }

                     if ((P1IN & BIT3)==0){                             //PULSE 2 BAD SIGNAL 
                          P1OUT |= BIT6;                                    //ENABLES PULSE BY THE 'AND' GATE
                          PJOUT |= BIT0;                                    //ENABLES TTL TO RS232 CONVERTER (FOR DIFF OUTPUT)
                            if(badPulse2==1){
                                badPulse2=0;                                // sets badPulse2 to 0 again so the ISR will generate the pulse
                                P2OUT ^=BIT4;                            //generates 1pps out of p2.4
                            }
                     }


                     }

        else {                                                              //EXTERNAL MODE
            PJOUT |= ~(BIT3);            //sends '0' from pj.3 output to the multimplexer U4 (uses the external 1pps)
            P1OUT |= BIT6;                  // ENABLES PULSE 1
            P1OUT |= BIT7;              //ENABLES PULSE 2
            PJOUT |= BIT0;              //ENABLES RS422 DIFF OUTPUT FOR PULSE 1
            PJOUT |= BIT1;              // ENABLES RS422 DIFF OUTPUT FOR PULSE 2
                }
        }
}

    return 0;

                    //ISR FOR TIMERD0.0 - NORMAL PULSE 1 AND 2

                    #pragma vector = TIMER0_D0_VECTOR               //GENERATES 1PPS EVERY 1s for normal pulse
                   __interrupt void TIMER0_D0 (void){
                       if (++timerCount > 500) {                        // checks if the incrementation of timerCount reaches 500 (means 1 second has passed)
                                           timerCount = 0;             // resets the millisecond counter to 0
                                           normalPulse1 = 1;             //once it reaches 1000 (1 second) normalPulse1 will be 1 
                                           normalPulse2=1;              //once it reaches 1000 (1 second) normalPulse2 will be 1 
                                           }
                                           P2IFG &= ~(BIT4);           // clears the flAG
                     }


                    //ISR FOR TIMERD0.0 - BAD PULSE 1 AND 2

                    #pragma vector = TIMER0_D0_VECTOR               //GENERATES 1pulse EVERY 2s (0.5Hz) for bad pulse
                   __interrupt void TIMER0_D0 (void){
                       if (++timerCount > 1000) {                           // checks if the incrementation of timerCount reaches 1000 (means 2 second has passed)
                                            timerCount = 0;             // resets the millisecond counter to 0
                                            badPulse1=1;                    // once it reaches 2000( 2 seconds) the badPulse1 will be 1.
                                            badPulse2=1;                    // once it reaches 2000( 2 seconds) the badPulse2 will be 1.
                                           }
                                           P2IFG &= ~(BIT4);           // clears the flAG
4

0 に答える 0