1. Xin chào Khách ! Ban quản trị sẽ tiến hành nâng cấp diễn đàn từ ngày 11/8/2017 Mọi truy cập có thể bị dán đoạn, mong bạn thông cảm!
    Dismiss Notice

Hướng dẫn Hướng dẫn nghịch DSPIC đêm khuya

Thảo luận trong 'Họ PIC -> dsPIC'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

Moderators: THUONGDTQB
  1. hoanglocmdc

    hoanglocmdc Kỹ sư

    Tham gia ngày:
    4/11/12
    Bài viết:
    417
    Đã được thích:
    232
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Nghề nghiệp:
    student at hanoi university of mining and geology
    #1 : Linh ta linh tinh về trình biên dịch, configure bit và F_OSC
    • Để lập trình Dspic thì mình sẽ hướng dẫn trên DSPIC33FJ12GP201 , datasheet thì lên trang chủ tự download nhé, refrence các kiểu đều có trên đó, down về tham khảo nhé.
    • Trên trang chủ cũng có sẵn mplabx IDE dùng để lập trình, compile xc16 để dịch
    • Mình đi thẳng luôn vào phần configure bit nhé:
    • Mã:
      #pragma config BWRP = WRPROTECT_OFF     // Boot Segment Write Protect (Boot Segment may be written)
      #pragma config BSS = NO_FLASH           // Boot Segment Program Flash Code Protection (No Boot program Flash segment)
      
      // FGS
      #pragma config GWRP = OFF               // General Code Segment Write Protect (User program memory is not write-protected)
      #pragma config GSS = OFF                // General Segment Code Protection (User program memory is not code-protected)
      /*chỗ này lưu ý để cấu hình thạch anh ngoài với bộ PLL*/
      // FOSCSEL
      #pragma config FNOSC = PRIPLL           // Oscillator Mode (Primary Oscillator (XT, HS, EC) w/ PLL)
      #pragma config IESO = ON                // Internal External Switch Over Mode (Start-up device with FRC, then automatically switch to user-selected oscillator source when ready)
      
      // FOSC
      #pragma config POSCMD = HS              // Primary Oscillator Source (HS Oscillator Mode)
      #pragma config OSCIOFNC = OFF           // OSC2 Pin Function (OSC2 pin has clock out function)
      #pragma config IOL1WAY = ON             // Peripheral Pin Select Configuration (Allow Only One Re-configuration)
      #pragma config FCKSM = CSDCMD           // Clock Switching and Monitor (Both Clock Switching and Fail-Safe Clock Monitor are disabled)
      
      // FWDT
      #pragma config WDTPOST = PS32768        // Watchdog Timer Postscaler (1:32,768)
      #pragma config WDTPRE = PR128           // WDT Prescaler (1:128)
      #pragma config WINDIS = OFF             // Watchdog Timer Window (Watchdog Timer in Non-Window mode)
      #pragma config FWDTEN = OFF             // Watchdog Timer Enable (Watchdog timer enabled/disabled by user software)
      
      // FPOR
      #pragma config FPWRT = PWR128           // POR Timer Value (128ms)
      #pragma config ALTI2C = OFF             // Alternate I2C  pins (I2C mapped to SDA1/SCL1 pins)
      
      // FICD
      #pragma config ICS = PGD1               // Comm Channel Select (Communicate on PGC1/EMUC1 and PGD1/EMUD1)
      #pragma config JTAGEN = OFF             // JTAG Port Enable (JTAG is Disabled)
    • Tiếp tới là phần cấu hình bộ dao động
    • theo datasheet:
    • upload_2015-4-19_3-17-2.
    • FIN = F_thạch anh
    • M = PLLDIV<8:0>
    • N1 = PLLPRE<4:0>
    • N2 = PLLPOST<1:0>
    • FCY = FOSC/2
    • mình tạo ra 1 ví dụ , chỉnh sửa từ ví dụ trong datasheet cho phù hợp với mplab cấu hình FCY = 40Mhz với tần số thạch anh vào là 20Mhz
    • Mã:
      //Setting N1 to 4 (N1 = n+2)
          CLKDIVbits.PLLPRE0 = 0;
          CLKDIVbits.PLLPRE1 = 1;
          CLKDIVbits.PLLPRE2 = 0;
          CLKDIVbits.PLLPRE3 = 0;
          CLKDIVbits.PLLPRE4 = 0;
      
          //Setting M to 32 (M = m+2)
          PLLFBDbits.PLLDIV0 = 0;
          PLLFBDbits.PLLDIV1 = 1;
          PLLFBDbits.PLLDIV2 = 1;
          PLLFBDbits.PLLDIV3 = 1;
          PLLFBDbits.PLLDIV4 = 1;
          PLLFBDbits.PLLDIV5 = 0;
          PLLFBDbits.PLLDIV6 = 0;
          PLLFBDbits.PLLDIV7 = 0;
          PLLFBDbits.PLLDIV8 = 0;
      
          //Setting N2 to 2
          CLKDIVbits.PLLPOST0 = 0;
          CLKDIVbits.PLLPOST1 = 0;
     
  2. hoanglocmdc

    hoanglocmdc Kỹ sư

    Tham gia ngày:
    4/11/12
    Bài viết:
    417
    Đã được thích:
    232
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Nghề nghiệp:
    student at hanoi university of mining and geology
    #2 tiếp phần 1 bây h bắt đầu với IO nhỉ :D nhấp nháy led cho vui :D
    • Về phần IO thì cũng chỉ quanh quanh thanh ghi tris với thanh ghi lat thôi
    • Thanh ghi tris để cấu hình chế độ vào ra cho chân IO của dspic
    • thanh ghi lat để đọc giá trị IO của dspic
    • Mã:
      /*cau hinh chan RB0 la output*/
      TRISBbits.TRISB0 = 0; //RB0 as output
    • Mã:
      /*nhap nhay led 500ms*/
      LATBbits.LATB0 = 0;
              __delay_ms(500);
              LATBbits.LATB0 = 1;
              __delay_ms(500);
    • Mô phỏng:
    • upload_2015-4-19_3-41-50.
    • Toàn bộ source code mình đính kèm ở dưới.
     

    Các file đính kèm:

    orochimaru18yeuthichdientu thích bài này.
  3. hoanglocmdc

    hoanglocmdc Kỹ sư

    Tham gia ngày:
    4/11/12
    Bài viết:
    417
    Đã được thích:
    232
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Nghề nghiệp:
    student at hanoi university of mining and geology
    #3: Nghịch tí về external interrupt
    • Về ngắt ngoài thì có 3 chân ngắt ngoài
    • bảng vector ngắt theo datasheet
    • upload_2015-4-19_3-51-58.
    • Các bước cấu hình ext0
    • cấu hình chân RB7 là input digital
    • cấu hình chế độ ngắt ngoài bằng hàm ConfigINT0()
    • Để sử dụng hàm configINT các bạn cần khai báo thư viện <ports.h> nhé
    • Mình cấu hình ngắt ngoài sử dụng hàm configINT0 với chế độ ngắt cạnh xuống, chọn quyền ưu tiên (Setting the priority of External interrupt) cho INT0, cho phép ngắt và cho phép ngắt toàn cục
    • Mã:
      ConfigINT0(FALLING_EDGE_INT & EXT_INT_PRI_5 & EXT_INT_ENABLE & GLOBAL_INT_ENABLE);
    • Cuối cùng là viết chương trình ngắt
    • gọi hàm ngắt : void _ISR_PSV _INT0Interrupt()
    • để sử dụng hàm ngắt này các bạn phải định nghĩa nó trước, các bạn thêm doạn lệnh này lên đầu
      Mã:
      #define _ISR_PSV __attribute__((__interrupt__, __auto_psv__))
    • Chương trình ngăt
      Mã:
      void _ISR_PSV _INT0Interrupt()
      {
      
          LATBbits.LATB0 = ~LATBbits.LATB0; //toggle RB0 pin
          //__delay_ms(500);     //software debounce -sort of
          IFS0bits.INT0IF = 0; //clear the flag for next interrupt
      }
    • mô phỏng như trên
    • code ở cuối.
     

    Các file đính kèm:

    orochimaru18yeuthichdientu thích bài này.
  4. hoanglocmdc

    hoanglocmdc Kỹ sư

    Tham gia ngày:
    4/11/12
    Bài viết:
    417
    Đã được thích:
    232
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Nghề nghiệp:
    student at hanoi university of mining and geology
    #4 : Làm tí timer nữa rồi đi ngủ nhỉ :D
    • Mã:
       OpenTimer1(T1_ON &      //mở timer 1
                  T1_GATE_OFF &   //tắt chế độ gate
                  T1_IDLE_STOP &  //dừng timer khi mcu vào chế độ sleep
                  T1_PS_1_256 &   //chọn Prescale 256
                  T1_SYNC_EXT_OFF &// tắt chế độ đồng bộ với  external clock
                  T1_SOURCE_INT,78125);
      Cái bọn dspic này mình đọc qua qua thấy cũng hay hay phết, có 3 bộ timer 16bit nhé
    • Timer1 thì là timer16 bit như bình thường
    • Timer2 và timer3 thì cũng là timer16 bit tuy nhiên khi cần có thể kết hợp 2 bộ timer này thành 1 bộ timer32bit (cái này các bạn test thử xem nhé, mình chưa test được :D trong refrence có ví dụ đấy)
    • Mình xét timer 1 nhé
    • có 4 chế độ timer
    • upload_2015-4-19_4-20-39.
    • Mình sẽ test thử thiết lập timer1 ở chế độ Timer interrupt (tham khảo thêm bảng vector ngắt ở trên nhé)
    • Ah quên mất , tính toán đã chứ nhỉ :D
    • Mình muốn tạo 1 ngắt timer 500ms nhỉ :D
    • ta có Value = period / (Prescale/ Fcy)
    • chọn Prescale = 256 , FCY thì như bài 1 đã ns 40Mhz nhé
    • value = 0.5 / (256/40000000) = 78125 = 0x1312D
    • Tính xong rồi, bắt đầu code thoai:
    • đầu tiên cấu hình timer bằng hàm OpenTimer1()
    • để sử dụng hàm này phải khai báo thư viện <timer.h>
    • Cấu hình timer1 :
    • OpenTimer1(T1_ON & //mở timer 1
      T1_GATE_OFF & //tắt chế độ gate
      T1_IDLE_STOP & //dừng timer khi mcu vào chế độ sleep
      T1_PS_1_256 & //chọn Prescale 256
      T1_SYNC_EXT_OFF &// tắt chế độ đồng bộ với external clock
      T1_SOURCE_INT,78125);

    • Mã:
          OpenTimer1(T1_ON &      //Timer1 ON
                  T1_GATE_OFF &   //Gated mode OFF
                  T1_IDLE_STOP &  //Stop when controller is in sleep
                  T1_PS_1_256 &   //Prescale 256
                  T1_SYNC_EXT_OFF &// Don't sync with external clock
                  T1_SOURCE_INT,valueToMatch);
    • Cấu hình ngắt timer
    • sử dụng hàm cấu hình ngắt timer ConfigIntTimer1()
    • Mã:
      ConfigIntTimer1(T1_INT_PRIOR_4 & T1_INT_ON);
      [*]
    • Gọi chương trình ngắt
    • Mã:
      void _ISR_PSV _T1Interrupt()
      {
          LATBbits.LATB0 = ~LATBbits.LATB0;
          IFS0bits.T1IF = 0; 
      }
    • Kết quả:
    • upload_2015-4-19_4-46-47.
    • Code ở cuối nhé:
    • Tới đây thì đi ngủ đây mai về quê , bạn nào rành về dspic thì bổ sung giúp đỡ mình
    • bạn nào chưa rành có thắc mắc thì hỏi nhé :D mấy hôm nữa ra hn mình giải đáp và viết tiếp
     

    Các file đính kèm:

  5. yeuthichdientu

    yeuthichdientu Thạc sỹ

    Tham gia ngày:
    3/9/13
    Bài viết:
    1,975
    Đã được thích:
    2,769
    Điểm thành tích:
    113
    Cảm ơn MOD đã chia sẻ, nhiệt tình "thâu đêm" !
     
    hoanglocmdc thích bài này.
  6. hoanglocmdc

    hoanglocmdc Kỹ sư

    Tham gia ngày:
    4/11/12
    Bài viết:
    417
    Đã được thích:
    232
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Nghề nghiệp:
    student at hanoi university of mining and geology
    Hi. Cơ bản là k ngủ được, nên viết sơ sài cho ae đọc vui ấy mà.
     
  7. orochimaru18

    orochimaru18 Học sinh phổ thông

    Tham gia ngày:
    18/1/15
    Bài viết:
    8
    Đã được thích:
    0
    Điểm thành tích:
    1
    Giới tính:
    Nam
    MOD cho em xin nick fb mới.
    Em cũng đang dùng con PIC18f4520 còn kẹt ít :'(
    Vs lại sao anh ko dùng Mplab viết nhể?
    Toàn dùng CCS vs MicroC là sao nhỉ :'(
    Em dùng Mplab đọc ko hiểu hết trởn!
     
  8. eva

    eva Kỹ sư

    Tham gia ngày:
    5/2/13
    Bài viết:
    381
    Đã được thích:
    438
    Điểm thành tích:
    63
    Giới tính:
    Nam
    Thời đại nào mà mấy ông kỹ thuật ở VN vẫn còn giảng và truyền mấy cái MPLAB, lần từng thanh ghi ... ???
    Chắc đúng chỉ là dành cho mấy cháu trung học chuyên nghiệp với sinh viên nghiên cứu cơ bản thì còn được .... hiểu qua cơ bản rồi thì phải đi tìm hướng mới, đào sâu cái khác để mà theo kịp thời gian .... trong khi thế giới người ta chuyển qua hết fast food, ứng dụng ... rồi đến flow , visual design, ngôn ngữ mô tả, tập trung vào ý tưởng thực tiễn, giải thuật ... thì vẫn còn nghiền ngẫm cái câu cú ( chủ yếu do thằng phát triển trình dịch đưa ra ) nên cứ theo phải theo chúng hoài .... Nên càng ngày điện tử của VN càng tụt hậu ( phải nói thẳng là càng ngày càng ngu đi ).
    Một ngày có đủ chủng loại công nghệ mới ... chíp mới ra đời ... nghiên cứu xong được mấy cái đó xong thì lại trở thành đồ phế liệu rồi cũng nên . :D
    Bạn thử so sánh xem MPLAB có những ưu điểm gì hơn những cái khác ??? :))
    Chắc là Prồ vượt bậc hơn hẳn chăng ? :))
     
  9. hoanglocmdc

    hoanglocmdc Kỹ sư

    Tham gia ngày:
    4/11/12
    Bài viết:
    417
    Đã được thích:
    232
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Nghề nghiệp:
    student at hanoi university of mining and geology
    Chào b. Nick fb của mình có lẽ b k cần biết.b có thể ll vs mình qua diễn đàn Mình có dùng ccs, k dubgf mikroc Ở bài này mình sử dụng mplab x là phiên bản mới nhất của mplab bạn nhé. Mình k muốn so sánh vì mỗi IDE có 1 cái hay riêng, bản thân mình thì thích tất cả, tuy nhiên tuỳ ứng dụng và sở thích mà chọn ide cho phù hợp
     
  10. hoanglocmdc

    hoanglocmdc Kỹ sư

    Tham gia ngày:
    4/11/12
    Bài viết:
    417
    Đã được thích:
    232
    Điểm thành tích:
    43
    Giới tính:
    Nam
    Nghề nghiệp:
    student at hanoi university of mining and geology
    Bạn đừng nên chỉ phán đoán 1 cách phiến diện và chủ quan như vậy. Nghe bạn ns vậy thì mình tin là b chưa từng xài mplab x Còn về chuyện cái mới mà b ns thì mình cũng k tin là kỹ sư việt k đủ khả năng để theo đuổi và nắm bắt đâu b anh.
     
    coca thích bài này.
Moderators: THUONGDTQB

Chia sẻ trang này