PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   dsPIC - Bộ điều khiển tín hiệu số 16-bit (http://www.picvietnam.com/forum/forumdisplay.php?f=29)
-   -   Căn bản về dsPIC33 (http://www.picvietnam.com/forum/showthread.php?t=2134)

falleaf 16-03-2008 01:44 AM

Căn bản về dsPIC33
 
Bài 1: Bộ dao động của dsPIC33

1. Giới thiệu:

- dsPIC33 có 4 nguồn dao động (xem hình)
- Bộ PLL
- Bộ DOZE chạy ở chế độ tiết kiệm điện
- Bộ giám sát lỗi dao động FSCM (Fail Safe Clock Monitor)


Một lưu ý rằng, chu kỳ máy của dsPIC33 không giống với PIC. Dao động vào của PIC sử dụng 4 dao động để thực hiện 1 lệnh, trong khi đó bộ dao động vào của dsPIC33 thông qua bộ chia (nhân tần số) PLL, sau đó dùng 2 chu kỳ để thực hiện 1 lệnh.

Thông thường PIC cho phép dùng thạch anh 20MHz và chạy ở 5MIPS, trong khi đó dsPIC33 cho phép dao động FOSC tới 80MHz và chạy ở tối đa 40MIPS.



2. Cấu hình:

Việc cấu hình cho dsPIC33 tuân thủ các nguyên tắc sau:

Tần số mã lệnh:



FCY tương đương trực tiếp với MIPS (Million Instructions Per Second). Nghĩa là nếu FCY = 40MHz thì tương đương dsPIC33 chạy ở 40MIPS. Đây là tần số cho phép tối đa của dsPIC33.

Tần số dao động:



Tần số này đạt giá trị lớn nhất là 80MHz, dù cấu hình PLL hay sử dụng nguồn dao động kiểu gì đi nữa, các bạn cũng không được phép vượt quá tần số này.

Việc cấu hình PLL được cụ thể cho từng dòng dsPIC khác nhau, ở đây chúng ta lấy thí dụ dòng MC - Motor Control:


Nguồn dao động vào có thể là thạch anh hoặc bộ dao động (thường các bạn gọi là thạch anh 4 chân) hoặc là lấy nguồn dao động được tạo ra từ con chip khác. Ta gọi là nguồn dao động vào, tần số nguồn dao động vào được ký hiệu là . Bộ PLL là phần ở giữa của hình. PLL được cấu hình bởi các thanh ghi PLLPRE, PLLPOSTPLLDIV như trên hình.

Tần số dao động có thể được viết lại cụ thể như sau:



VCO là Voltage Control Output, ta không cần quan tâm tới thành phân này.

Hình trên mô tả cho chúng ta thấy, giả sử chúng ta muốn tạo tần số dao động FOSC là 80MHz (tần số tối đa) với thạch anh sử dụng là 10MHz, thì công việc của chúng ta là phải tính toán và cân đối các hệ số M, N1, N2. Khi đó chỉ việc thay thế nó và đặt vào các giá trị của PLLDIV, PLLPRE và PLLPOST.

Nhưng vấn đề của chúng ta, đó là việc giới hạn bởi các thông số ngõ ra và ngõ vào tại từng vị trí. Cụ thể là bao nhiêu thì các bạn nhìn vào hình đã thấy rõ.

Nếu dùng thạch anh hoặc dao động ngoại, các bạn không được phép sử dụng tần số nằm ngoài khoảng 1.6MHz đến 16MHz. Qua bộ chia PLLPRE, tần số không được vượt quá 0.8MHz đến 8MHz. Ở trước bộ chia PLLPOST không được nằm ngoài khoảng 100MHz đến 200MHz.

Oh, tới đây thì mọi việc đơn giản rồi. Nếu các bạn muốn dao động FOSC là x MHz, các bạn chỉ cần nhẩm tính N2, vì nó chỉ có thể là 2, 4, 8 sao cho giá trị trước khi qua bộ chia PLLPOST nằm trong khoảng 100MHz đến 200Mhz. Vậy là các bạn có một hệ số N2.

Bộ chia với hệ số M rất rộng, nằm từ 2 đến 513, nó tương đối linh động cho các bạn thực hiện các bộ chia. N1 cũng vậy, nó nằm từ 2 đến 33. Vậy chúng ta sẽ chọn N1 sao cho tần số dao động từ thạch anh vào sau PLLPRE nằm trong khoảng 0.8MHz tới 8MHz thế là ổn. Cuối cùng thì chúng ta chọn M.

Các bạn hãy ghi nhớ hình này vì nó rất quan trọng cho việc lựa chọn thạch anh và cấu hình PLL.


3. Vấn đề khi cấu hình:

Một điểm mà chúng ta cần phải chú ý thật kỹ mà Microchip khuyến cáo đó là tần số thạch anh hoặc nguồn dao động bất kỳ trước khi vào bộ chia PLL phải nằm trong khoảng 4MHz đến 8MHz. Nếu như nằm ngoài khoảng này, các bạn phải thực hiện theo các bước sau:
  1. Không dùng bộ chia PLL hoặc dùng dao động nội ngay khi khởi tạo.
  2. Sau khi khởi tạo xong thì cho phép thay đổi nguồn dao động, tính toán các hệ số PLL hoặc chọn cấu hình nguồn dao động
  3. Đổi sang nguồn dao đồng mình muốn sử dụng với bộ chia PLL phù hợp

Vd cụ thể đó là nếu các bạn dùng nguồn dao động là thạch anh 3MHz chứ không phải thạch anh 4MHz, các bạn phải tuân thủ các bước khởi tạo này để cấu hình dao động cho dsPIC33.


4. Lưu ý thường dùng:

Dao động XT: thạch anh 3-10MHz
Dao động HS: thạch anh 10 - 40MHz
Dao động EC: bộ dao động (thạch anh 4 chân hoặc lấy từ nguồn chip khác) từ 0.8 - 64MHz.

Khi có thời gian F sẽ cung cấp cho các bạn các cấu hình mẫu để các bạn chọn lựa cho các ứng dụng của mình. Tạm thời với bài viết cơ bản này, có lẽ các bạn đã nắm được cách cấu hình dao động cho chip của mình, và biết cách lựa chọn thạch anh phù hợp.

Chúc vui


Tài liệu tham khảo:
[1] Section 07. Oscillator - dsPIC33F FRM
[2] Datasheet dsPIC33F Motor Control Family

falleaf 21-03-2008 04:46 PM

Bài 2: Delay

Khi lập trình bằng C30, hoặc các trình dịch từ gcc, chúng ta chú ý rằng gcc không cung cấp hàm delay( ). Do vậy, chúng ta phải tự viết các hàm này.

Sau đây là một thí dụ, các bạn hãy thử phân tích thí dụ này để hiểu được cách viết một hàm delay như thế nào, tất nhiên các bạn hoàn toàn có thể sử dụng luôn hàm này.

Lưu ý khi sử dụng, hãy tính toán một cách kỹ lưỡng các giá trị đặt cho cấu hình của mình.


File delay.h:
Code:

// Thay đổi giá trị FCY để phù hợp với cấu hình của chip, tính bằng MIPS
#define FCY  16000000                                        //16 MIPS

void Delay( unsigned int delay_count );
void Delay_Us( unsigned int delayUs_count );

// Những cấu hình này thường dùng để khởi tạo LCD, nên để ở đây
#define Delay200uS_count  (FCY * 0.0002) / 1080
#define Delay_1mS_Cnt    (FCY * 0.001) / 2950
#define Delay_2mS_Cnt    (FCY * 0.002) / 2950
#define Delay_5mS_Cnt    (FCY * 0.005) / 2950
#define Delay_15mS_Cnt    (FCY * 0.015) / 2950
#define Delay_1S_Cnt      (FCY * 1) / 2950


File delay.c:
Code:

#include "delay.h"

unsigned int temp_count;

void Delay( unsigned int delay_count )
{
        temp_count = delay_count +1;
        asm volatile("outer: dec _temp_count");       
        asm volatile("cp0 _temp_count");
        asm volatile("bra z, done");
        asm volatile("do #3200, inner" );       
        asm volatile("nop");
        asm volatile("inner: nop");
        asm volatile("bra outer");
        asm volatile("done:");
}
       

void Delay_Us( unsigned int delayUs_count )
{
        temp_count = delayUs_count +1;
        asm volatile("outer1: dec _temp_count");       
        asm volatile("cp0 _temp_count");
        asm volatile("bra z, done1");
        asm volatile("do #1500, inner1" );       
        asm volatile("nop");
        asm volatile("inner1: nop");
        asm volatile("bra outer1");
        asm volatile("done1:");
}


falleaf 03-04-2008 01:22 AM

Bài 3: ADC 10/12-bit

Hoạt động ADC của các chip MCHP đều được mô tả như hình sau:


Quá trình lấy mấu ADC được thực hiện thông qua 2 quá trình: Sample (Lấy mẫu) và Conversion (Biến đổi). Quá trình này được mô tả đơn giản bằng việc dsPIC sẽ đóng khóa K để điện áp bên ngoài tích đủ vào một con tụ, sau đó mở khoá K để phân cách với mạch ngoài, và bắt đầu quá trình biến đổi từ Analog thành Digital.

Quá trình biến đổi được mô tả như hình dưới đây:



Vấn đề này quá đơn giản, vậy chúng ta cần tìm hiểu gì?

Chúng ta cần tìm hiểu:
  1. Làm thế nào để cấu hình hoạt động cho Module ADC để nó hoạt động theo ý ta muốn?
  2. Khi nào thì bắt đầu quá trình Sample (lấy mẫu), khi nào thì bắt đầu quá trình Conversion (biến đổi). Có những cách nào để tác động vào quá trình này?
  3. Sau khi chuyển đổi xong, làm thế nào ta lấy được kết quả và bỏ vào một thanh ghi bất kỳ mà ta muốn?

Thực tế là chúng ta muốn thế, nhắm mắt lại và kệ xừ mọi thứ, cái quan trọng là khi kết quả nằm trong một biến nào đó là xong. Người lập trình C lúc nào cũng mong muốn điều này, bởi nếu không thì họ đã lập trình với ASM30 mất rồi. Chúng ta sẽ tìm hiểu ở đây theo kiểu tư duy của người lập trình bằng ngôn ngữ cấp cao, nhưng sẽ hiểu đủ sâu để có thể làm việc với ASM30.

F đặt ra những câu hỏi theo thứ tự tư duy như bên dưới đây:

1. Thời gian Sample (Lấy mẫu) và Conversion (Biến đổi) là bao nhiêu?

Đơn giản cực, đôi khi các bạn không để ý, nhưng nó có ngay trong datasheet. F lấy thí dụ datasheet của dòng dsPIC33FJxxxMCxxx (DS70287A-page 319)


Vậy ở đây xuất hiện thêm một số khái niệm mà sau này để đơn giản, F viết là TAD và Tcy. Mối quan hệ giữa chúng? Làm sao để đặt được? Đây là câu hỏi tiếp theo và chúng ta sẽ giải quyết ngay dưới đây.


(còn tiếp, vì F chưa có thời gian viết xong)

Chúc vui

meishun 14-04-2008 11:08 AM

Xin các anh hướng dẫn thêm về cách thiết kế mạch cho dsPIC33: điện thế ngõ vào cho pic33fj, giao tiếp ngoại vi như thế nào cho an toàn? Nếu ta đưa diện thế 5V vào chân input thì có sao ko (vì PIC33F chỉ hoạt động ở 3V-3V6 thôi). Ngoài ra, nạp cho PIC33 như thế nào? em thấy sơ đồ chân có nhiều chân PGD và PGC. Ta cho đường ICSP đến cặp chân nào cũng được phải ko?

falleaf 18-04-2008 02:37 PM

Trích:

Nguyên văn bởi meishun (Post 15544)
Xin các anh hướng dẫn thêm về cách thiết kế mạch cho dsPIC33: điện thế ngõ vào cho pic33fj, giao tiếp ngoại vi như thế nào cho an toàn? Nếu ta đưa diện thế 5V vào chân input thì có sao ko (vì PIC33F chỉ hoạt động ở 3V-3V6 thôi). Ngoài ra, nạp cho PIC33 như thế nào? em thấy sơ đồ chân có nhiều chân PGD và PGC. Ta cho đường ICSP đến cặp chân nào cũng được phải ko?

Các bạn hãy tham khảo tài liệu Explorer 16 User Guide, ở phần cuối của tài liệu có mạch nguyên lý của mạch phát triển Explorer 16. Trong đó, các phần nguồn, phần mạch nạp, các phần ngoại vi liên quan cũng có thể xem thêm các PIC Tail dành cho Exp 16.

Tài liệu tham khảo tại đây:
http://ww1.microchip.com/downloads/e...e%2051589a.pdf (từ trang 37)

Chúc vui

duc thang 11-05-2008 02:29 PM

Bạn nào có link về mô tả cụ thể các lệnh của dsP33F (intruction set decription) giới thiệu mình với. Dataheeet ghi tóm tắt quá, nhiều lệnh mình đọc không hiểu kỹ.

namqn 12-05-2008 02:23 AM

Trích:

Nguyên văn bởi duc thang (Post 16122)
Bạn nào có link về mô tả cụ thể các lệnh của dsP33F (intruction set decription) giới thiệu mình với. Dataheeet ghi tóm tắt quá, nhiều lệnh mình đọc không hiểu kỹ.

Bạn đọc tài liệu sau (dsPIC30F/33F Programmer's Reference Manual):
http://ww1.microchip.com/downloads/e...Doc/70157C.pdf

Tài liệu này được tôi đề cập đến trong các tutorial về dsPIC30F (tutorial 2 chẳng hạn).

Thân,

hopeman 16-06-2008 12:15 PM

con 33FJ256GP710 khac 33FJ256GP710 the nao?
 
em đang làm mạch với con 33FJ256GP710 nhưng khi cắm mạch nạp vào nó lại nhận là 33FJ256MC710 ? nạp thì nó vẫn nạp nhưng không biết là có đúng ko? em muốn hỏi bang chủ là như thế có gì lỗi ko? và dòng MC và GP khác nhau thế nào ko?

hopeman 16-06-2008 12:31 PM

cấu hình cho con 33FJ256PG710
 
mình đang dùng thạch anh 10M. mình cũng đã đọc data sheet nhưng mà do là mới chuyển qua dùng MPLab C30 nên mình cũng ko biết cách thiết lập cấu hình như thế nào nữa (thấy dùng CCS sướng thôi rồi lun) . có bạn nào có thể cho mình 1 mẫu thiết lập cấu hình cho con 33FJ256GP710 này để nó chạy ở 40Mips ko nhỉ? xin chân thành cảm ơn trước . mà trên diễn đàn của mình cũng ưu ai code cho các em 30F quá nhỉ, tội nghiệp mấy em 33F

namqn 16-06-2008 06:31 PM

Trích:

Nguyên văn bởi hopeman (Post 16845)
mình đang dùng thạch anh 10M. mình cũng đã đọc data sheet nhưng mà do là mới chuyển qua dùng MPLab C30 nên mình cũng ko biết cách thiết lập cấu hình như thế nào nữa (thấy dùng CCS sướng thôi rồi lun) . có bạn nào có thể cho mình 1 mẫu thiết lập cấu hình cho con 33FJ256GP710 này để nó chạy ở 40Mips ko nhỉ? xin chân thành cảm ơn trước . mà trên diễn đàn của mình cũng ưu ai code cho các em 30F quá nhỉ, tội nghiệp mấy em 33F

Các thiết lập cấu hình mẫu có trong tập tin header tương ứng của chip (vào thư mục con "support\dsPIC33F\h" của thư mục cài đặt MPLAB C30, mở tập tin "p33FJ256GP710.h", tìm đoạn chú thích "Macros for setting device configuration registers"). Code của dsPIC30F hoàn toàn tương thích với dsPIC33F, bạn tham khảo các link dưới đây, và hãy rút lại phát biểu trên:
http://techtrain.microchip.com/webse..._p1_111605.pdf
http://techtrain.microchip.com/webse..._p2_111605.pdf

Thân,

meishun 19-06-2008 08:45 PM

Trích:

Nguyên văn bởi hopeman (Post 16844)
em đang làm mạch với con 33FJ256GP710 nhưng khi cắm mạch nạp vào nó lại nhận là 33FJ256MC710 ? nạp thì nó vẫn nạp nhưng không biết là có đúng ko? em muốn hỏi bang chủ là như thế có gì lỗi ko? và dòng MC và GP khác nhau thế nào ko?

trương hợp mạch nạp nhận sai chip thì tôi chưa từng gặp nên ko biết. Nhưng ép mạch nạp nạp con chip mà phần mềm ko hỗ trợ cho mạch nó thì tôi có làm thử. Nạp chạy tốt (vdụ mạch JDM va winpic800 v3.61 với PIC18F4685)
dsPIC33FJxxMCxx là dòng dsPIC Motor Control.
dsPIC33FJxxGPxx là dòng dsPIC General Purposes.
Bạn có thể dùng phần mềm MAPS của Microchip để so sánh các chip.

piano lover 04-08-2008 04:35 PM

Có huynh nào biết con IC nào có thể chuyển đổi điện áp từ chuẩn 3.3 v lên chuẩn TTL 5 v ko? và tần số chuyển tối thiểu 40MHz để tương thích với con 33F.

namqn 04-08-2008 05:10 PM

Trích:

Nguyên văn bởi piano lover (Post 17939)
Có huynh nào biết con IC nào có thể chuyển đổi điện áp từ chuẩn 3.3 v lên chuẩn TTL 5 v ko? và tần số chuyển tối thiểu 40MHz để tương thích với con 33F.

Tôi vẫn dùng 74LVC4245:
http://www.nxp.com/acrobat_download/...LVC4245A_6.pdf

Thân,

piano lover 05-08-2008 01:08 PM

Anh Nam, em thấy con này khá giống con 74HC245, liệu có thể thay thế con 74LVC4245 bằng con 74HC245 ko?

namqn 05-08-2008 05:44 PM

Trích:

Nguyên văn bởi piano lover (Post 17957)
Anh Nam, em thấy con này khá giống con 74HC245, liệu có thể thay thế con 74LVC4245 bằng con 74HC245 ko?

Vi mạch 74LVC4245 được đặc biệt thiết kế để giao tiếp giữa các hệ thống khác mức điện áp, và chỉ là bộ đệm hai chiều về mặt chức năng. Tuy nhiên, bạn không thể dùng 74HC245 thay cho vi mạch này, vì đơn giản 74HC245 chỉ có 1 rail nguồn, trong khi 74LVC4245 có 2 rail nguồn riêng biệt.

Thân,


Múi giờ GMT. Hiện tại là 09:18 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam