Thắc mắc về dsPic 30f

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • pqthai89
    Thành viên mới
    • Oct 2009
    • 1

    #1

    Thắc mắc về dsPic 30f

    Mình muốn tạo thời gian trễ dùng timer1 trong pic 30f4011 dùng mplab c30.

    Đoạn code mình viết như sau:

    #include <p30f4011.h>

    _FOSC(CSW_FSCM_OFF & FRC_PLL4); //Clock = 32 MHz
    _FWDT(WDT_OFF);
    _FBORPOR(MCLR_EN & PBOR_OFF & PWMxL_ACT_HI & PWMxH_ACT_HI);
    _FGS(CODE_PROT_OFF);

    void init_port(){
    TRISB = 0x00;
    //PORTB = 0xF0;
    }

    void init_timer1(){
    PR1 = 0xff;
    TMR1 = 0;
    T1CONbits.TCKPS = 1;
    T1CONbits.TON = 1;
    }

    int main(){
    init_port();
    init_timer1();
    while(1){

    _LATB1 = 1;
    while (!T1CONbits.TSIDL);
    T1CONbits.TSIDL = 0;

    _LATB1 = 0;
    while (!T1CONbits.TSIDL);
    T1CONbits.TSIDL = 0;
    }
    }

    Khi nạp vào pic thì không chạy được như ý: thay vì đèn ở pinb1 chớp tắt liên tục thì nó lại luôn sáng. Mình không hiểu tại sao. Mong các bạn chỉ giúp.
  • chestnut
    Thành viên tích cực
    • Jun 2008
    • 400

    #2
    Nguyên văn bởi pqthai89 Xem bài viết
    Mình muốn tạo thời gian trễ dùng timer1 trong pic 30f4011 dùng mplab c30.

    Đoạn code mình viết như sau:

    #include <p30f4011.h>

    _FOSC(CSW_FSCM_OFF & FRC_PLL4); //Clock = 32 MHz
    _FWDT(WDT_OFF);
    _FBORPOR(MCLR_EN & PBOR_OFF & PWMxL_ACT_HI & PWMxH_ACT_HI);
    _FGS(CODE_PROT_OFF);

    void init_port(){
    TRISB = 0x00;
    //PORTB = 0xF0;
    }

    void init_timer1(){
    PR1 = 0xff;
    TMR1 = 0;
    T1CONbits.TCKPS = 1;
    T1CONbits.TON = 1;
    }

    int main(){
    init_port();
    init_timer1();
    while(1){

    _LATB1 = 1;
    while (!T1CONbits.TSIDL);
    T1CONbits.TSIDL = 0;

    _LATB1 = 0;
    while (!T1CONbits.TSIDL);
    T1CONbits.TSIDL = 0;
    }
    }

    Khi nạp vào pic thì không chạy được như ý: thay vì đèn ở pinb1 chớp tắt liên tục thì nó lại luôn sáng. Mình không hiểu tại sao. Mong các bạn chỉ giúp.
    Cấu hình Timer quá sơ sài, chưa đủ. Tham khảo của mình viết :

    void timer1_init()
    {
    TMR1 = 0;
    PR1 = PR_FOR_FSAMPLE;
    T1CONbits.TGATE = 0;
    T1CONbits.TCKPS = 2;//scaler = 64
    T1CONbits.TCS = 0;//internal clock
    T1CONbits.TON = 1;

    _T1IF = 0;//xoa co ngat
    _T1IE = 1;//Cho phep ngat xay ra
    _T1IP = TIMER1_INTERRUPT_PRIORITY;
    }
    Last edited by chestnut; 21-07-2010, 12:03.
    The goal of power electronics is control the flow of energy from an electrical source to an electrical load with high efficiency, high availability, high reliability, light weight and low cost.

    Comment

    • ubuntu7
      Thành viên chính thức
      • Oct 2008
      • 75

      #3
      Hi,
      Bạn cho mình hỏi sao lại như vầy: while (!T1CONbits.TSIDL); cái bit tsidl là bit cho phép timer chạy trong chế độ idle mode chứ có liên quan j đến việc tràn timer đâu nhỉ? Theo mình bạn nên thay bằng while (!_T1IF);
      |

      Comment

      Về tác giả

      Collapse

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

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

      Collapse

      Đang tải...