Một chú ý về code mẫu trong các tutorial

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • namqn
    Trưởng lão PIC bang
    • Feb 2006
    • 3020

    #1

    Một chú ý về code mẫu trong các tutorial

    Gần đây tôi nhận ra một số code mẫu trong các tutorial của tôi khi biên dịch với các mức tối ưu khác nhau đã không còn hoạt động đúng. Lý do là bộ tối ưu mã của các phiên bản MPLAB C Compiler for dsPIC DSCs mới đã loại bỏ hoàn toàn một số biến và câu lệnh, khi phát hiện những biến đó không hề được thay đổi giá trị trong chương trình chính (giá trị của những biến này chỉ được thay đổi trong phần code xử lý ngắt chẳng hạn).

    Khắc phục vấn đề này rất đơn giản, bạn chỉ cần thêm từ khóa volatile trước khai báo của những biến đó (thường là những biến thuộc nhóm biến toàn cục). Ví dụ
    Code:
    volatile unsigned char flag;
    Thân,
    Biển học mênh mông, sức người có hạn.

    Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
    http://www.picvietnam.com/forum/showthread.php?t=1263
  • Argentina
    Đệ tử 1 túi
    • Oct 2007
    • 22

    #2
    thưa anh Nam. hiện nay em vừa mượn được bộ KIT Explorer 16, sử dụng PIC24FJ128GA010, em có download code mẫu dùng cho KIT từ trang chủ của Microchip, em đã sửa lại như theo gợi ý của anh, nhưng chương trình vẫn báo lỗi.

    Do mới làm quen với PIC nên em chưa hiểu phải khắc phục lỗi này ra sao, rất mong được anh giúp đỡ ạ.

    Em cảm ơn anh.
    Attached Files

    Comment

    • namqn
      Trưởng lão PIC bang
      • Feb 2006
      • 3020

      #3
      Nguyên văn bởi Argentina View Post
      thưa anh Nam. hiện nay em vừa mượn được bộ KIT Explorer 16, sử dụng PIC24FJ128GA010, em có download code mẫu dùng cho KIT từ trang chủ của Microchip, em đã sửa lại như theo gợi ý của anh, nhưng chương trình vẫn báo lỗi.

      Do mới làm quen với PIC nên em chưa hiểu phải khắc phục lỗi này ra sao, rất mong được anh giúp đỡ ạ.

      Em cảm ơn anh.
      Code của Microchip và của tôi viết cho MPLAB C30 (hiện nay được gọi là "MPLAB C Compiler for PIC24 MCUs and dsPIC DSCs") chứ không phải viết cho CCS C. Do đó, bạn phải tìm hiểu xem port code của Microchip sang CCS C ra sao cho bo mạch trên (có thể hỏi bên diễn đàn của CCS C).

      Thân,
      Biển học mênh mông, sức người có hạn.

      Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
      http://www.picvietnam.com/forum/showthread.php?t=1263

      Comment

      • PSL
        Đệ tử 1 túi
        • Apr 2006
        • 20

        #4
        Nguyên văn bởi namqn View Post
        Gần đây tôi nhận ra một số code mẫu trong các tutorial của tôi khi biên dịch với các mức tối ưu khác nhau đã không còn hoạt động đúng. Lý do là bộ tối ưu mã của các phiên bản MPLAB C Compiler for dsPIC DSCs mới đã loại bỏ hoàn toàn một số biến và câu lệnh, khi phát hiện những biến đó không hề được thay đổi giá trị trong chương trình chính (giá trị của những biến này chỉ được thay đổi trong phần code xử lý ngắt chẳng hạn).

        Khắc phục vấn đề này rất đơn giản, bạn chỉ cần thêm từ khóa volatile trước khai báo của những biến đó (thường là những biến thuộc nhóm biến toàn cục). Ví dụ
        Code:
        volatile unsigned char flag;
        Thân,
        Microchip cũng có nhắc đến vấn đề này, khuyến cáo nên dùng khai báo volatile đối với những biến dùng cho ngắt. Nguyên văn:
        "You should arrange to save global variables that may be modified in an ISR if you do
        not want the value to be exported. Global variables modified by an ISR should be
        qualified volatile."
        DS51284J, trang 108. Trong một số tài liệu khác cũng có nhắc đến.
        Các bạn nên lưu ý, không mới, nhưng quan trọng.

        Comment

        • thanh_30april
          Nhập môn đệ tử
          • Jan 2010
          • 9

          #5
          Các anh ơi cho em hỏi chút:
          /************************************************** *****************************
          ; Vidu2-1.c la chuong trinh viet bang C de chay tren mot dsPIC *
          ; Chuong trinh thuc hien viec sau: Nhap nhay LED (noi vao RD0) o tan so 1 Hz *
          ************************************************** ******************************

          ; Tac gia : Nguyen Quang Nam *

          ; Don vi : PIC Viet Nam *

          ; Ten tap tin : Vidu2-1.c *

          ; Ngay : 03/8/2006 *

          ; Phien ban : 0.01 *

          ; Nhung tap tin can thiet khac: p30F4012.gld, p30f4012.h *

          ; Cong cu duoc dung: MPLAB 7.31 *
          ; C30 2.02 SE *
          ; ASM30 2.14 *
          ; LNK30 2.14 *

          ------------------------------------------------------------------------------*/
          #include <p30F4012.h>

          _FOSC(CSW_FSCM_OFF & FRC_PLL4);
          _FWDT(WDT_OFF);
          _FBORPOR(PBOR_OFF & MCLR_EN & PWMxL_ACT_HI & PWMxH_ACT_HI);
          _FGS(CODE_PROT_OFF);

          #define LED _LATD0 //LED noi vao RD0

          //Cac prototype cho cac chuong trinh con
          void Init_PORTS(void);
          void Init_TMR1(void);

          //Chuong trinh chinh
          int main(void) {
          Init_PORTS(); //Khoi tao cac cong I/O
          Init_TMR1(); //Khoi tao Timer 1
          while (1) { //Vong lap chinh
          };
          }

          //Chuong trinh con khoi tao cac cong I/O, de noi voi LED
          void Init_PORTS(void) {
          LATD = 0; //Xoa thanh ghi chot cong D
          TRISD = 0xFFFE; //LED noi vao chan RD0, la ngo ra
          }

          //Chuong trinh con khoi tao Timer 1, tran sau moi 0,5 giay o muc xung 8 Mips
          void Init_TMR1(void) {
          TMR1 = 0; //Xoa so dem trong TMR1
          PR1 = 0xF424; //Nguong tran la 0,5 giay tuong ung voi clock = 32 MHz
          _T1IF = 0; //Xoa co ngat cua Timer 1
          T1CON = 0x8020; //Dung fcy lam clock, prescale = 1:64
          _T1IE = 1; //Cho phep ngat Timer 1
          }

          //Chuong trinh xu ly ngat Timer 1
          void _ISR _T1Interrupt(void) {
          _T1IF = 0; //Xoa co ngat
          _LATD0 ^= 1; //Lat trang thai LED
          }
          /////////////////////////////////////
          Em không hiểu vì sao bác Nam cấu hình cho CLOCK như trên mà bảo clock=32MHz.Vì
          em đọc theo datasheet với file p30f4012 thi cấu hình FRC_PLL4 tức là:7.37*4=29.48Mhz thôi chứ ạ.Mong các bác giải thích hộ em với

          Comment

          • kqha1025
            Đệ tử 3 túi
            • Oct 2008
            • 57

            #6
            Nguyên văn bởi thanh_30april View Post
            Các anh ơi cho em hỏi chút:
            /************************************************** *****************************
            ; Vidu2-1.c la chuong trinh viet bang C de chay tren mot dsPIC *
            ; Chuong trinh thuc hien viec sau: Nhap nhay LED (noi vao RD0) o tan so 1 Hz *
            ************************************************** ******************************

            ; Tac gia : Nguyen Quang Nam *

            ; Don vi : PIC Viet Nam *

            ; Ten tap tin : Vidu2-1.c *

            ; Ngay : 03/8/2006 *

            ; Phien ban : 0.01 *

            ; Nhung tap tin can thiet khac: p30F4012.gld, p30f4012.h *

            ; Cong cu duoc dung: MPLAB 7.31 *
            ; C30 2.02 SE *
            ; ASM30 2.14 *
            ; LNK30 2.14 *

            ------------------------------------------------------------------------------*/
            #include <p30F4012.h>

            _FOSC(CSW_FSCM_OFF & FRC_PLL4);
            _FWDT(WDT_OFF);
            _FBORPOR(PBOR_OFF & MCLR_EN & PWMxL_ACT_HI & PWMxH_ACT_HI);
            _FGS(CODE_PROT_OFF);

            #define LED _LATD0 //LED noi vao RD0

            //Cac prototype cho cac chuong trinh con
            void Init_PORTS(void);
            void Init_TMR1(void);

            //Chuong trinh chinh
            int main(void) {
            Init_PORTS(); //Khoi tao cac cong I/O
            Init_TMR1(); //Khoi tao Timer 1
            while (1) { //Vong lap chinh
            };
            }

            //Chuong trinh con khoi tao cac cong I/O, de noi voi LED
            void Init_PORTS(void) {
            LATD = 0; //Xoa thanh ghi chot cong D
            TRISD = 0xFFFE; //LED noi vao chan RD0, la ngo ra
            }

            //Chuong trinh con khoi tao Timer 1, tran sau moi 0,5 giay o muc xung 8 Mips
            void Init_TMR1(void) {
            TMR1 = 0; //Xoa so dem trong TMR1
            PR1 = 0xF424; //Nguong tran la 0,5 giay tuong ung voi clock = 32 MHz
            _T1IF = 0; //Xoa co ngat cua Timer 1
            T1CON = 0x8020; //Dung fcy lam clock, prescale = 1:64
            _T1IE = 1; //Cho phep ngat Timer 1
            }

            //Chuong trinh xu ly ngat Timer 1
            void _ISR _T1Interrupt(void) {
            _T1IF = 0; //Xoa co ngat
            _LATD0 ^= 1; //Lat trang thai LED
            }
            /////////////////////////////////////
            Em không hiểu vì sao bác Nam cấu hình cho CLOCK như trên mà bảo clock=32MHz.Vì
            em đọc theo datasheet với file p30f4012 thi cấu hình FRC_PLL4 tức là:7.37*4=29.48Mhz thôi chứ ạ.Mong các bác giải thích hộ em với
            Với loại Dspic cũ thì thạch anh nội là 7.37 Mhz còn với các em mới thì là 8Mhz thì phải, bạn xem lại datasheet của dspic mới nhất xem xem.

            Comment

            • thanh_30april
              Nhập môn đệ tử
              • Jan 2010
              • 9

              #7
              Em xem datasheet bản mới mà anh,em download trên microchip cập nhật 12/05/2010.
              Mà nếu theo anh nói thì nếu cấu hình PLL16 thì Fosc=8*16Mhz,từ đó ta tính ra Fcy =64Mips ah?chắc không phải anh ạ.Mong các anh giải thích giùm

              Comment

              • Zipper
                Nhập môn đệ tử
                • Nov 2011
                • 3

                #8
                chứ không phải viết cho CCS C. Do đó, bạn phải tìm hiểu xem port code của Microchip sang CCS C ra sao cho bo mạch trên
                WOW Gold RS Gold Tera Gold

                Comment

                • ltluc253
                  Nhập môn đệ tử
                  • Aug 2011
                  • 6

                  #9
                  hix, mình cũng đang gặp phải vấn đề thay đổi biến toàn cục trong ngắt mà không biết xử lý code thế nào.Đoạn code sau mình viết để test trên protues. nhưng biến ADCvalues của mình vẫn không thay đổi sau khi có ngắt ADC xảy ra.

                  #include <p33FJ16MC304.h>


                  _FOSCSEL(FNOSC_PRIPLL&IESO_OFF); //dung dao dong ngoai co bo PLL
                  _FOSC(FCKSM_CSDCMD&OSCIOFNC_OFF&POSCMD_XT); //chon che do XT
                  _FWDT(FWDTEN_OFF); //tat watchdog
                  _FGS( GSS_HIGH & GCP_ON ); //code protection


                  volatile int ADCvalues=0xFF00;

                  void Init_osc(void)
                  {
                  PLLFBD = 78; // M = 78
                  CLKDIV = CLKDIV&0xFF00; //PLLPOST=0 & PLLPRE = 0 , N1=2, N2=2
                  while (_COSC !=0b011); //dung bo PLL tao Fosc=40MHz, cho cho dao dong on dinh
                  while (_LOCK !=1); //cho PLL bat dau khoa pha
                  }

                  void Init_ADC(void)
                  {
                  AD1PCFGL = 0xFFFE; //chon AN0 lam ngo vao analog
                  _SSRC = 7; //ADC cham dut lay mau va kich hoat chuyen doi
                  AD1CON2 = 0;
                  AD1CHS0 = 0;
                  AD1CSSL = 0; //ko quet ngo vao
                  AD1CON3 = 0x1F01; //dung 31TAD cho lay mau
                  //dung TAD=2Tcy
                  _AD1IF = 0;
                  _AD1IE = 1;
                  _ASAM = 1; //tu dong lay mau.
                  }

                  void __attribute__((__interrupt__,auto_psv))_ADC1Interr upt(void)
                  {
                  ADCvalues = ADCBUF0;
                  PORTC = ADCvalues;
                  }

                  int main()
                  {
                  TRISB = 0x0000;
                  TRISC = 0x0000;
                  Init_osc();
                  Init_ADC();
                  _ADON = 1;
                  while(1)
                  {
                  PORTB = ADCvalues;
                  }

                  }


                  Mong mọi người giúp đỡ với, thanks.

                  Comment

                  Working...