Các lệnh trong lập trình MSP430

Discussion in 'Lớp C7' started by nhok 9x, Sep 9, 2012.

  1. ctcngh

    ctcngh Thành Viên PIF

    Theo mình để dịch trái bit thì mình có thể nhân 2.
    P1OUT+=P1OUT;
    Dịch phải thì có thể chia 2
    P1OUT/=2;
     
  2. Manhdd

    Manhdd Cố Vấn CLB Staff Member

    Cách này tuy đúng nhưng không nên dùng. Vì tập lệnh MCU (Lệnh Assembly) thường có sẵn các lệnh dịch bit, còn cách lệnh toán thì cùng lắm chỉ hỗ trợ đến cộng/trừ . Do vậy, chuyển lệnh dịch bit sang các lệnh nhân/chia làm lãng phí tài nguyên (Bộ nhớ+Thời gian xử lý) của hệ thống :)
     
    phuong le, honghiep and kisseshacker like this.
  3. phuong le

    phuong le Thành Viên PIF

    ủa sao em copy i chang mà cái mạch e nó đơ như cây cơ ???
     
  4. IceSandwich

    IceSandwich Thành Viên PIF

    Bạn đã tắt WatchDog Timer chưa vậy? Nếu không tắt thì sẽ không chạy được đâu.

    Code:
    // Stop watchdog timer to prevent time out reset
        WDTCTL = WDTPW + WDTHOLD;
    :D
     
    Rebirth likes this.
  5. phuong le

    phuong le Thành Viên PIF

    ò hjhj :D chạy đc òi ủa mà cái lệnh trên có ý nghĩa như thế nào a?
    Code:
    void main(void)
    {
     
      P1DIR |= BIT0;
      P1DIR |= BIT6;
      WDTCTL = WDTPW + WDTHOLD;
      for (;;)
      {
        volatile unsigned int i;
        P1OUT ^= BIT0|BIT6;
     
        i = 50000;
        do (i--);
        while (i != 0);
      }
    }
    nếu e để nó trong code trên thì hai đền nhấp nháy có độ dừng, còn nếu ko có thì nhấp nháy liên tục???:-(
     
  6. dòng
    Code:
    WDTCTL = WDTPW + WDTHOLD;
    dùng để tắt WatchDog Timer nếu để nó còn hoạt động thì cứ sau một thời gian khi mà WatchDog Timer ràn thì nó sẽ tự động reset lại vdk nên code của em viết không có dòng đó thì sẽ bị reset liên tục. nên sẽ xin ra hiện tượng nháy liên tục.
     
    vuong_pn and phuong le like this.
  7. mafiaWolf

    mafiaWolf Chủ tịch Hội phụ nữ PIF

    Nhìn code là thấy dân pro rồi :(.. CLB ta sắp có nhân tài mới :la:
     
  8. phuong le

    phuong le Thành Viên PIF

    úi giời ạ :3cool_adore: copy cái này liếc cái kia mới ra cái code trên á :5cool_sweat:
     
  9. phuong le

    phuong le Thành Viên PIF

    à dậy chu kì nháy của nó mặc định là nhiêu a?
    Code:
    #include  <msp430g2553.h>
     
    void main(void)
    {
        WDTCTL = WDTPW + WDTHOLD;
      P1DIR |= BIT0;
      P1DIR |= BIT6;
     
      for (;;)
      {
      {
        volatile unsigned int i;
        P1OUT ^= BIT0|BIT6;
     
        i = 50000;
        do (i--);
        while (i != 0);
      }
      _delay_cycles(10000000);
      }
    }
    e thêm cai delay này vô thì 10s nháy lần, còn nếu không có lệnh delay thì mặc định là 1s hả a:botay:
     
  10. cxduc92

    cxduc92 Thành Viên PIF

    phuong le: mình nói thế này cho bạn dễ hiểu .Tất cả các lệnh muốn thực hiện thì cần phải có 1 thời gian tương ứng.Trong máy thì gọi nó là chu kì máy-Machine cycle(MC)

    Trong con msp 430g2553 1 chu kì máy là 1us (10^-6 s) .Mỗi lệnh mình giả sử là mất 1us để thực hiện(thực tế thì không phải lệnh nào cũng 1us).Như vậy 3 dòng lệnh :
    {
    i=50000;
    do(i--);
    while(i!=0);
    }
    thật ra chỉ là delay 50000MC= 50000 x 1u= 50 ms = 0.05 s (coi như bỏ qua 2 us của 2 dòng đầu)
    Còn lệnh _delay_cycles(10 000 000) là 1 lệnh delay đc định nghĩa sẵn của g2553 .Ý nghĩa của _delay_cycles(n) là delay n MC.Lệnh của bạn có nghĩa là delay 10 000 000 MC= 10s.Vậy là cứ mỗi 10s nó đảo trạng thái
    p/s: theo ý mình thì bạn chỉ cần sửa 1 chỗ là điều khiển đc tất cả các chu kì nhấp nháy này thôi
    vd: bạn muốn nó cứ 1s nháy 1 lần=> n= 1/ (10^-6)=1 000 000.Như vậy
    ...
    while(1)//for(;;)
    {
    P1OUT^=BIT1|BIT6;
    _delay_cycles(1 000 000);
    }
    Thế là xong:1cool_byebye:
     
    phuong le and 2death like this.
  11. nhok 9x

    nhok 9x Trứng gà

    à, cho mình hỏi chút: cái lệnh nhảy đến nhãn cho trước trong đây là gì vậy? Vd trong 8051 là sjmp....
     
  12. mafiaWolf

    mafiaWolf Chủ tịch Hội phụ nữ PIF

    phải dùng lệnh máy thôi...go to.. mà hình như không ai xài nhiều :D
     
  13. Manhdd

    Manhdd Cố Vấn CLB Staff Member

    "Never use goto statement" : các lập trình viên ở ngôn ngữ cấp cao thường nhắc nhau như vậy =))
    Ở khía cạnh ngôn ngữ máy, ASM, CPU cần các tập lệnh JMP để thực hiện rẽ nhánh và lặp. Tuy nhiên, với các ngôn ngữ có tính "người" hơn (C, C++, Java, ...) thì việc sử dụng GOTO làm mất tính cấu trúc của chương trình, khiến chương trình rất khó đọc và sửa chữa. Nhiều ngôn ngữ thậm chí không có lệnh GOTO. Các lệnh điều khiển rẽ nhánh và lặp trong c: if, switch-case, for, while, ... đều có thể thay thế GOTO và giúp chương trình có cấu trúc hơn :D
     
  14. doancongthang

    doancongthang Thành Viên PIF

    cho hỏi làm thế nào để config 2 timer, Timer A0 xùng xuất PWM qua chân p1.6.
    Timer A1 đếm lên trong vòng 25ms.
    anh em chỉ giáo.
    void ConfigTimer(void)
    {
    CCTL0=CCIE; //CCR0 interrupt enabled
    TA0CTL = TASSEL_2 + MC_1; // SMCLK, up mode
    }
    void ConfigPWM(void)
    {
    CCR0=1000; // PWM Period=50HZ
    CCTL1 = OUTMOD_7; // CCR1 reset/set
    CCR1=0; // PWM duty cycle
    }
    ///////////////////////////////////////////////////////////////////////
    void Configdemxung (void)
    {
    TA1CCTL0 = CCIE; // CCR0 interrupt enabled
    TA1CCR0 = 25000;
    TA1CTL = TASSEL_2 + MC_1; // SMCLK, upmode

    }
    và ngắt như thế này thì trong có hợp lí không
    #pragma vector=TIMER1_A0_VECTOR
    __interrupt void Timer1_A0 (void)
    {Speed = pulse - pre_pulse; //so xung trong 25ms
    pre_pulse = pulse;
    Speed = (Speed*40*60)/400;
    }
    Timer A1 ngắt trong vòng 25ms
    #pragma vector=TIMER0_A0_VECTOR
    __interrupt void Timer0_A0 (void)
    {
    //CCR1=CCR1+1; // Increace Duty Cycle
    //if(CCR1==1001) CCR1=0; // If Duty Cycle =100%, reset it
    CCR1 = Output;

    }
    Timer a0 xuất pwm theo chu kì là CCR1
     
  15. honghiep

    honghiep Cố Vấn CLB Staff Member

    Nhìn có vẻ là hợp lí. Nhưng nếu muốn xuất PWM cần config cho chân P1.6 nữa
     
  16. thuyvy3110

    thuyvy3110 Trứng gà

    Cho em hỏi, đoạn code mẫu trong bài giảng C8, TA0CTL=TASSEL_2+MC_2+ID_3+TAIE; TACCR0=31250; //ngắt CCR0 khi đếm tới giá trị 31250 tương ứng với 0.25s so với giá trị đầu 0 của timer. Làm sao mà từ 0.25s tính ra 31250 ạ? em cũng đã làm tính công thức tới lui nhưng mà rối quá :botay:
     
  17. gochit

    gochit Cố Vấn CLB

    ID_3 là chọn chia clock cho 8, cho nên thời gian sẽ tính bằng 31250 *1/(1M/8)=0.25s :D
     
Loading...

Share This Page