Phan_IT Xin giới thiệu các chương trình ví dụ về dòng vi điều khiển MSP430 của Texas

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • phan_it
    Thành viên tích cực
    • Dec 2005
    • 366

    #1

    Phan_IT Xin giới thiệu các chương trình ví dụ về dòng vi điều khiển MSP430 của Texas

    Tôi xin giới thiệu các ví dụ cơ bản để làm quen với dòng vi điều khiển MSP430, đây là dòng vi điều khiển 16bit. Các ví dụ gồm:
    - Sơ đồ nguyên lý.
    - Hình ảnh bố trí thí nghiệm.
    - Source code bằng ASM hoặc C (tùy chọn cho các bạn thích lập trình ASM MSP430 hay lập trình C MSP430).

    - Chip trong các ví dụ dùng MSP430G2231, MSPG2211 (đây là các chip chân cắm - tiện lợi để thí nghiệm).
    - Compiler dùng CCSC của Texas (free).
    - Mạch nạp dùng LaunchPad của Texas.
    Chi tiết thêmcos thể tham khảo tại Phan Information Technology
    Chúc các bạn thành công !
    0912666017
  • phan_it
    Thành viên tích cực
    • Dec 2005
    • 366

    #2
    MSP430G2231 điều khiển 1 led đơn.

    Code ASM

    .cdecls C,LIST, "msp430g2231.h"

    ;------------------------------------------------------------------------------
    .text ; Progam Start
    ;------------------------------------------------------------------------------
    RESET mov.w #0280h,SP ; Initialize stackpointer
    StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
    SetupP1 bis.b #001h,&P1DIR ; P1.0 output
    ;
    Mainloop xor.b #001h,&P1OUT ; Toggle P1.0
    Wait mov.w #050000,R15 ; Delay to R15
    L1 dec.w R15 ; Decrement R15
    jnz L1 ; Delay over?
    jmp Mainloop ; Again
    ;
    ;------------------------------------------------------------------------------
    ; Interrupt Vectors
    ;------------------------------------------------------------------------------
    .sect ".reset" ; MSP430 RESET Vector
    .short RESET ;
    .end


    Code C:
    #include <msp430g2231.h>

    void main(void)
    {
    WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
    P1DIR |= 0x01; // Set P1.0 to output direction

    for (
    {
    volatile unsigned int i;

    P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR

    i = 50000; // Delay
    do (i--);
    while (i != 0);
    }
    }
    Attached Files
    0912666017

    Comment

    • phan_it
      Thành viên tích cực
      • Dec 2005
      • 366

      #3
      MSP430 giao tiếp với 8 led đơn

      Code ASM:
      .cdecls C,LIST, "msp430g2231.h"

      ;------------------------------------------------------------------------------
      .text ; Progam Start
      ;------------------------------------------------------------------------------
      RESET mov.w #0280h,SP ; Initialize stackpointer
      StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
      SetupP1 mov.b #0FFh,&P1DIR ; P1 output
      ;
      mov.b #001h,R14 ; set value for R14
      Mainloop mov.b R14,&P1OUT ; R14 to P1
      call #Delay ; delay
      rla R14 ; shift left R14
      cmp #000h,R14 ; cmp R14 with 0
      jne Mainloop ; if R14 != 0
      mov.b #001h,R14 ; if R14=0 then R14 = 1
      jmp Mainloop ; Again
      ;------------------------------------------------------------------------------
      Delay
      mov.w #050000,R15 ; set val to R15
      Loop1 dec.w R15 ; Decrement R15
      jnz Loop1 ; jmp to Loop1 if !=0
      ret
      ;------------------------------------------------------------------------------
      ; Interrupt Vectors
      ;------------------------------------------------------------------------------
      .sect ".reset" ; MSP430 RESET Vector
      .short RESET ;
      .end


      Code C:
      #include <msp430g2231.h>

      void Delay(unsigned int nLoop);

      void main(void)
      {
      unsigned int j;
      unsigned char nB;

      WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
      P1DIR |= 0xFF; // Set P1.0 to output direction

      nB = 0x01;
      while(1)
      {
      for(j=0;j<8;j++)
      {
      P1OUT = nB;
      Delay(50000);
      if(nB==0x80)
      nB = 0x01;
      else
      nB = nB << 1;
      } //for
      } //while
      }
      //************************************************** ****************************
      void Delay(unsigned int nLoop)
      {
      while(nLoop--);
      }
      //************************************************** ****************************
      Attached Files
      0912666017

      Comment

      • phan_it
        Thành viên tích cực
        • Dec 2005
        • 366

        #4
        MSP430G2211 giao tiếp với led 7 thanh, hiện thị các số từ 0 đến 9, ví dụ này để tiến tới mục đích điều khiển 2 hoặc nhiều hơn số led 7 thanh.

        Code C:
        #include <msp430g2231.h>
        void Delay(unsigned int nLoop);
        unsigned char To7Seg(unsigned char nVal,unsigned char nPt);
        void main(void)
        {
        unsigned int j;
        WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
        P1DIR |= 0xFF; // Set P1 to output direction
        while(1)
        {
        for(j=0;j<11;j++)
        {
        P1OUT = To7Seg(j,1);
        Delay(50000);
        } //for
        } //while
        }
        //************************************************** ****************************
        void Delay(unsigned int nLoop)
        {
        while(nLoop--);
        }
        //************************************************** ****************************
        unsigned char To7Seg(unsigned char nVal,unsigned char nPt)
        {
        unsigned char nRet;

        switch(nVal)
        {
        case 0:
        nRet = 192;
        break;
        case 1:
        nRet = 249;
        break;
        case 2:
        nRet = 164;
        break;
        case 3:
        nRet = 176;
        break;
        case 4:
        nRet = 153;
        break;
        case 5:
        nRet = 146;
        break;
        case 6:
        nRet = 130;
        break;
        case 7:
        nRet = 248;
        break;
        case 8:
        nRet = 128;
        break;
        case 9:
        nRet = 144;
        break;
        case 10:
        nRet = 255;
        break;
        } //switch

        if(nPt)
        nRet = nRet & 127;

        return(nRet);
        }
        Attached Files
        0912666017

        Comment

        • phan_it
          Thành viên tích cực
          • Dec 2005
          • 366

          #5
          MSP430 với Timer A
          ví dụ này điều khiển 1 led đơn nhấp nháy theo lệnh được cài trong chương trình sử lý ngắt của Timer A.

          Code ASM:
          .cdecls C,LIST, "msp430g2231.h"
          ;------------------------------------------------------------------------------
          .text ; Program Start
          ;------------------------------------------------------------------------------
          RESET mov.w #0280h,SP ; Initialize stackpointer
          StopWDT mov.w #WDTPW+WDTHOLD,&WDTCTL ; Stop WDT
          SetupP1 bis.b #001h,&P1DIR ; P1.0 output
          SetupC0 mov.w #CCIE,&CCTL0 ; CCR0 interrupt enabled
          mov.w #50000,&CCR0 ;
          SetupTA mov.w #TASSEL_2+MC_1,&TACTL ; SMCLK, upmode
          ;
          Mainloop bis.w #CPUOFF+GIE,SR ; CPU off, interrupts enabled
          nop ; Required for debugger
          ;
          ;-------------------------------------------------------------------------------
          TA0_ISR; Toggle P1.0
          ;-------------------------------------------------------------------------------
          xor.b #001h,&P1OUT ; Toggle P1.0
          reti ;
          ;
          ;------------------------------------------------------------------------------
          ; Interrupt Vectors
          ;------------------------------------------------------------------------------
          .sect ".reset" ; MSP430 RESET Vector
          .short RESET ;
          .sect ".int09" ; Timer_A0 Vector
          .short TA0_ISR ;
          .end



          Code C:
          #include <msp430g2231.h>

          void main(void)
          {
          WDTCTL = WDTPW + WDTHOLD; // Stop WDT
          P1DIR |= 0x01; // P1.0 output
          CCTL0 = CCIE; // CCR0 interrupt enabled
          CCR0 = 50000;
          TACTL = TASSEL_2 + MC_1; // SMCLK, upmode

          _BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
          }

          // Timer A0 interrupt service routine
          #pragma vector=TIMERA0_VECTOR
          __interrupt void Timer_A (void)
          {
          P1OUT ^= 0x01; // Toggle P1.0
          }
          Attached Files
          0912666017

          Comment

          • phan_it
            Thành viên tích cực
            • Dec 2005
            • 366

            #6
            MSP430G2211 giao tiếp với 2 led 7 thanh. ví dụ này kết hợp 2 ví dụ giao tiép với 1 led 7 thanh và Timer A

            Code C:
            #include <msp430g2231.h>

            unsigned char To7Seg(unsigned char nVal,unsigned char nPt);
            void Delay(unsigned int nLoop);

            unsigned char mDigit[2];
            unsigned char mDigNo;

            void main(void)
            {
            unsigned char i;

            WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
            P2SEL = 0x00; // IO function is select
            P2DIR = 0xC0; // Port 2 output
            P2OUT = 0xC0;

            P1DIR |= 0xFF; // Port 1 output

            CCTL0 = CCIE; // CCR0 interrupt enabled
            CCR0 = 10000; // cycles to overload
            TACTL = TASSEL_2 + MC_1; // SMCLK, upmode

            _BIS_SR(GIE); // w/ interrupt

            mDigNo = 0;

            while(1)
            {
            for(i=0;i<100;i++)
            {
            mDigit[1] = To7Seg(i/10,0);
            mDigit[0] = To7Seg(i%10,0);
            Delay(50000);
            } //for
            }
            }
            //************************************************** ****************************
            // Timer A0 interrupt service routine
            #pragma vector=TIMERA0_VECTOR
            __interrupt void Timer_A (void)
            {
            switch(mDigNo)
            {
            case 0:
            P2OUT = ~0x80;
            break;
            case 1:
            P2OUT = ~0x40;
            break;
            }
            P1OUT = mDigit[mDigNo];

            mDigNo++;
            if(mDigNo >1)
            mDigNo = 0;
            }

            //************************************************** ****************************
            unsigned char To7Seg(unsigned char nVal,unsigned char nPt)
            {
            unsigned char nRet;

            switch(nVal)
            {
            case 0:
            nRet = 192;
            break;
            case 1:
            nRet = 249;
            break;
            case 2:
            nRet = 164;
            break;
            case 3:
            nRet = 176;
            break;
            case 4:
            nRet = 153;
            break;
            case 5:
            nRet = 146;
            break;
            case 6:
            nRet = 130;
            break;
            case 7:
            nRet = 248;
            break;
            case 8:
            nRet = 128;
            break;
            case 9:
            nRet = 144;
            break;
            case 10:
            nRet = 255;
            break;
            } //switch

            if(nPt)
            nRet = nRet & 127;

            return(nRet);
            }
            //************************************************** ****************************
            void Delay(unsigned int nLoop)
            {
            while(nLoop--);
            }
            //************************************************** ****************************
            Attached Files
            0912666017

            Comment

            • dinhnam123
              Thành viên tích cực
              • Oct 2009
              • 102

              #7
              rất bổ ich!thanks!
              |

              Comment

              • nambh
                Thành viên tích cực
                • Apr 2009
                • 122

                #8
                Các bác có ai hướng dẫn cho em sử dụng CCS để lập trình không? Em mày mò mãi mà không biết làm thế nào để lập trình được, em có mua một mạch nạp MSP-FET430UIF của TI, ngoài ra có một file txt mà không biết flash thế nào được?
                Press "Thank - Button"

                Comment

                • phan_it
                  Thành viên tích cực
                  • Dec 2005
                  • 366

                  #9
                  Trong trang web của tôi (Phan Information Technology) có hướng dẫn cách sử dụng CCS để lập trình C và ASM, ngoài ra có cả hướng dẫn sử dụng CCS điều khiển mạch nạp và debug LaunchPad.
                  0912666017

                  Comment

                  • nambh
                    Thành viên tích cực
                    • Apr 2009
                    • 122

                    #10
                    Cám ơn bác, em sẽ nghiên cứu ạ
                    Press "Thank - Button"

                    Comment

                    • Lenh Ho
                      Thành viên tích cực
                      • Mar 2010
                      • 378

                      #11
                      iẹnn tại trường em cũng có nhiùe bạn làm về MSP, nhưng em cũng chưa hiểu điểm mạnh của nó, có giống như các dòng vi điều khiển khác không ạ? mong các bác chỉ giáo ^^
                      Be quan. Plz contact through email:

                      Comment

                      • phamngoctan
                        Thành viên mới
                        • Apr 2009
                        • 4

                        #12
                        Điểm mạnh của MSP430 là ultra low power, tiêu thụ năng lượng rất ít so với các dòng low power khác nhờ bộ DCO tạo thời gian wake up rất nhanh (cỡ us) và ổn định.
                        Tất nhiên là điều đó chỉ thể hiện khi trong code cho MCU ngủ liên tục, chỉ thức khi làm việc

                        Comment

                        • minhtuan99bk
                          Thành viên tích cực
                          • Aug 2009
                          • 100

                          #13
                          Mình code tạo 2 xung PWM ra chân P1.2 và P1.3, dựa vào code mẫu của TI cho msp430. Mình biên dịch và đã mô phỏng thành công trên protues nhưng không hiểu sao thử trên mạch thực tế thì chỉ có mỗi chân P1.2 có xung, chân 1.3 ko hề có xung. Mình thử với các code mẫu khác và cả code trên mạng nhưng kết quả vẫn như vậy. Có cao thủ nào biết tình trạng này không?
                          Đây là code:
                          Code:
                          #include  <msp430g2553.h>
                          void main(void)
                          {
                            WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
                            P1DIR |= 0x0C;                            // P1.2 and P1.3 output
                            P1SEL |= 0x0C;                            // P1.2 and P1.3 TA1/2 otions
                            CCR0 = 655;                               // PWM Period/2
                            CCTL1 = OUTMOD_6;                         // CCR1 toggle/set
                            CCR1 = 32;                                // CCR1 PWM duty cycle
                            CCTL2 = OUTMOD_6;                         // CCR2 toggle/set
                            CCR2 = 49;                                // CCR2 PWM duty cycle
                            TACTL = TASSEL_1 + MC_1;                  // ACLK, up mode
                          
                            _BIS_SR(LPM0_bits);                       // Enter LPM0
                          }

                          Comment

                          • Hard
                            Thành viên tích cực
                            • Aug 2005
                            • 779

                            #14
                            Hi,
                            Bác phan_it rất nhiệt tình tuy nhiên cách post bài của bác thì sẽ làm cho nhiều người bị rối loạn, hoang mang và không thể hiện được điểm mạnh của họ VDK MSP430. Theo tui bác nên đi từ Datasheet của nó, sau khi đọc Datasheet của họ VDK này tui chắc rằng không ít người bỏ 89, bỏ PIC để chạy qua MSP430 vì cái độc đáo của họ chíp này.
                            Để lúc nào rãnh rãnh tui cũng làm vài bài góp cùng bác cho vui.
                            Thân ái.
                            Đường đến những ngày vinh quang không còn xa
                            Con đường chúng ta... chúng ta đã chọn.

                            Comment

                            • doremon_nvn
                              Thành viên mới
                              • Jul 2010
                              • 25

                              #15
                              AE cho mình xin phần mền ccs của con này đi. minh seach mà ko thấy.
                              Thanks

                              Comment

                              Về tác giả

                              Collapse

                              phan_it Tìm hiểu thêm về phan_it

                              Bài viết mới nhất

                              Collapse

                              Đang tải...