PDA

View Full Version : Căn bản về dsPIC33


falleaf
16-03-2008, 01:44 AM
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)

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/nguondaodong33.png

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.

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/F_CY33.png


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:

F_{CY} = \frac{F_{OSC}}{2}

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:

F_{OSC} = \frac{M}{N1*N2}

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:

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/pll33.png

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à F_{IN}. Bộ PLL là phần ở giữa của hình. PLL được cấu hình bởi các thanh ghi PLLPRE, PLLPOST và PLLDIV như trên hình.

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

F_{OSC} = \frac{M}{N1*N2} = \frac{PLLDIV+2}{(PLLPRE+2)*2(PLLPOST+1)}

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:

Không dùng bộ chia PLL hoặc dùng dao động nội ngay khi khởi tạo.
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
Đổ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 (http://ww1.microchip.com/downloads/en/DeviceDoc/70186A.pdf)
[2] Datasheet dsPIC33F Motor Control Family (http://ww1.microchip.com/downloads/en/DeviceDoc/70287A.pdf)

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:

// 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:
#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:

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/ADCSampleSequence.png

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:

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/ADCTransferFunction.png


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:

Làm thế nào để cấu hình hoạt động cho Module ADC để nó hoạt động theo ý ta muốn?
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?
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)

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/ADC10ConversionTime.png

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/ADC12ConversionTime.png


Vậy ở đây xuất hiện thêm một số khái niệm T_{AD} và T_{CY} 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
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/en/DeviceDoc/Explorer%2016%20User%20Guide%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
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/en/DeviceDoc/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
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
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
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/webseminars/documents/dspic33FArch_p1_111605.pdf
http://techtrain.microchip.com/webseminars/documents/dsPIC33FArch_p2_111605.pdf

Thân,

meishun
19-06-2008, 08:45 PM
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
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/datasheets/74LVC4245A_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
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,

laiquangtuyen
29-03-2009, 11:09 PM
Luồng này đang hay chỗ giới thiệu bài giảng về DSPIC33, các bác hỏi lung tung cuối cùng đứt đoạn giữa chừng không ai chỉ nữa rồi! Tiếp tục đi, còn về phần DMA tui muốn tìm hiểu nhưng hok có ai chỉ nữa!

NTVinh
20-05-2009, 10:23 AM
DSP khac DSC cho nao?
Cac cao thu cho minh hoi: Digital Signal Processor (DSP) khac voi Digital Signal Controller (DSC) nhu the nao?

robotden
01-06-2009, 06:10 PM
anh namqn cho em hỏi chút xíu, dspic33 và dspic30 khác nhau chỗ nào vậy anh.
con nào mạnh về dsp hơn ạ
thank a

nhamdtk4
01-06-2009, 06:16 PM
Các bác ơi, cho em hỏi: Sao ko thấy ai dùng CCS viết CT cho dsPIC vậy.

hopeman
02-06-2009, 11:14 AM
Các bác ơi, cho em hỏi: Sao ko thấy ai dùng CCS viết CT cho dsPIC vậy.

bởi vì CCS hỗ trợ dsPIC hơi chuối
bởi vì CCS ko phải là phần mềm miễn phí mà phải trả tiền bản quyền còn mpLab và C30 cho sinh viên hoàn toàn miễn phí
bởi vì trên PicVN ko ai dạy hướng dẫn viết ct cho dsPic bằng CCS cả :D

robotden
02-06-2009, 04:36 PM
anh namqn cho em hỏi chút xíu, dspic33 và dspic30 khác nhau chỗ nào vậy anh.
con nào mạnh về dsp hơn ạ
thank a

namqn
02-06-2009, 07:47 PM
anh namqn cho em hỏi chút xíu, dspic33 và dspic30 khác nhau chỗ nào vậy anh.
con nào mạnh về dsp hơn ạ
thank a
Các webinar của Microchip giới thiệu về kiến trúc của dsPIC33F thực chất sử dụng dsPIC30F làm nền tảng so sánh, do đó bạn sẽ nắm được sự khác biệt của chúng khi đọc các webinar này. Link của chúng dưới đây:

http://techtrain.microchip.com/webseminars/ArchivedDetail.aspx?Active=98
http://techtrain.microchip.com/webseminars/ArchivedDetail.aspx?Active=99

Nhờ vào nhiều cải tiến trong kiến trúc (DMA, 40 MIPS so với 30 MIPS, ...), dsPIC33F có lẽ sẽ thực hiện các phép toán DSP nhanh hơn so với các dsPIC30F.

Thân,

tungnh
02-06-2009, 11:45 PM
Thêm nữa dòng dsPic33F tiết kiệm nặng lượng hơn nhiều so với dòng dsPic30F nếu chạy với tất độ như nhau.

robotden
04-06-2009, 01:50 AM
thank các bác nhìu

robotden
05-06-2009, 09:09 AM
các bác có biết chỗ bán dspic33f256mc710 k?
em đang cần?
thank

hopeman
05-06-2009, 10:13 AM
nếu mua vài con để nghiên cứu,Em có thể qua bên PNLab www.pnlabvn.com , còn mua nhiều thì liên lạc với bên R&P

robotden
10-06-2009, 11:09 AM
tài liệu lập trình dspic 33. xin chỉ giáo

robotden
16-06-2009, 11:42 PM
bác namqn ơi cho em hỏi cái. em cấu hình cho dsPIC33Fj256GP710 la 40 MIPS, vậy trong khi mô phỏng bằng MPLABSIM thì phần Processor Freq đặt là 40Mhz hay là 80Mhz
thank

namqn
16-06-2009, 11:53 PM
bác namqn ơi cho em hỏi cái. em cấu hình cho dsPIC33Fj256GP710 la 40 MIPS, vậy trong khi mô phỏng bằng MPLABSIM thì phần Processor Freq đặt là 40Mhz hay là 80Mhz
thank
Bạn đặt Processor Frequency là 80 MHz.

Thân,

robotden
17-06-2009, 04:17 PM
em hiểu rùi. dsPIC33 thì Fcy=Fosc/2, cái Processcor Frequency đó là Fosc.
Thank a nam nhiều

robotden
26-06-2009, 08:02 AM
trời , sao lâu quá mà không có ai vào diễn đàn này vậy,

namqn
26-06-2009, 10:30 AM
trời , sao lâu quá mà không có ai vào diễn đàn này vậy,
Chào bạn,

Tôi không biết là có câu hỏi này dành cho tôi. Hơn nữa, hình của bạn mờ quá nên tôi không theo dõi được gì cả.

Thân,

aden
27-06-2009, 08:58 AM
Chào bạn,

Tôi không biết là có câu hỏi này dành cho tôi. Hơn nữa, hình của bạn mờ quá nên tôi không theo dõi được gì cả.

Thân,

dạ,đại loại ý em là em làm phần cứng cho con pic33fj256gp710, giữa các chân nguồn và đất của nó em có thêm tụ 104, chân Vcore cũng có 1 tụ hóa, khối nguồn 3.3v cũng có tụ lọc, em dùng XTAL8Mhz,tụ cho thạch anh là 22pF
như vậy mạch có đủ chạy ổn đi
thank a

thanhgand
25-08-2009, 05:29 PM
cho em hỏi câu này mọi người ơi.sao em không thấy cấu hình chân I2C.em đã tìm trong cả hai bảng selectable input sources và output selection for remappable pin.Có phải nó được cấu hình như SPI không.nếu như vậy chọn chế độ master/slave thế nào.

JohnnyNguyen
27-08-2009, 11:24 PM
cho em hỏi cái.khi điều chế sóng sin băng PWM trong dspic33 cách cập nhật duty cycle cho PWM vào thanh ghi PxDCy để xuất ra xung thì dùng công thức nào vậy.

namqn
29-08-2009, 02:16 PM
cho em hỏi cái.khi điều chế sóng sin băng PWM trong dspic33 cách cập nhật duty cycle cho PWM vào thanh ghi PxDCy để xuất ra xung thì dùng công thức nào vậy.
Từ bảng 14-2 trong section "14 - Motor Control PWM" (DS70187B) của "dsPIC33F Family Reference Manual", có thể suy ra công thức tính duty cycle (cho edge-aligned PWM):

duty cycle = (PxDCy)/(2*PxTPER + 2)

Công thức trên cũng dùng được trong trường hợp có dùng prescaler, vì giá trị prescale bị triệt tiêu khi lập tỷ số.

Thân,

JohnnyNguyen
30-08-2009, 03:02 PM
em cũng hiểu công thức đó.nhưng trong 1 ví dụ có viêt như sau:
#include <p33fj12mc202.h>
#include <pwm.h>
#include <pwm12.h>
#define Ts 1249
#define hs 0.5
_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
_FPOR(PWMPIN_ON&HPOL_ON&LPOL_ON);//cac chan ra dieu khien boi PORT luc reset,deu co the cao
unsigned char i=0;
unsigned char j=0;
unsigned int const sin_table[40]={0,98,195,291,386,478,567,653,734,811,883,950,101 0,1065,1113,1154,1188,1214,1234,1245,1249,
1245,1234,1214,1188,1154,1113,1065,1010,950,883,81 1,734,653,567,478,386,291,195,98};
void Init_PWM(void);
int main(void)
{ PLLFBD = 41;
_PLLPOST = 0;
_PLLPRE = 0;
while (_COSC !=0b011);//dung bo PLL tao Fosc=80MHz,cho cho dao dong on dinh
while (_LOCK !=1);//cho PLL bat dau khoa pha
TRISB=0X0000;
LATB=0X0000;
Init_PWM();
while(1);
}
void Init_PWM(void)
{
P1TCONbits.PTMOD = 0b10;//continuous up/down cout mode
P1TCONbits.PTCKPS = 0b01;//prescale 4Tcy
P1TCONbits.PTOPS = 0b0000;//postscale 1:1
P1TPER = Ts;//Fpwn = 4kHz
PWM1CON1bits.PMOD1=0;//complementary mode
PWM1CON1bits.PMOD2=0;
PWM1CON1bits.PEN2H=1;//enable for PWM output
PWM1CON1bits.PEN1H=1;
PWM1CON1bits.PEN2L=1;
PWM1CON1bits.PEN1L=1;
PWM1CON2bits.IUE=0;
PWM2CON2bits.UDIS=0;//update from duty cycle and period buffer registers are enabled
P1DTCON1bits.DTAPS=0b00;//Dead time prescale 1:1
P1DTCON1bits.DTA = 40;//deadtime = 1um
//P1DTCON1bits.DTBPS=0b00;
//P1DTCON1bits.DTB = 0;
P1DTCON2bits.DTS2A=0;//Unit A selected for PWM active transitions
P1DTCON2bits.DTS1A=0;
P1DTCON2bits.DTS1I=0;//Unit B selected for PWM inactive transitions
P1DTCON2bits.DTS2I=0;
P1OVDCONbits.POVD2H=1;//PWM I/O pin controlled by PWM generator
P1OVDCONbits.POVD1H=1;
P1OVDCONbits.POVD2L=1;
P1OVDCONbits.POVD1L=1;
P1DC1=0;
P1DC2=0;
_PWM1IF=0;
_PWM1IE=1;
P1TCONbits.PTEN=1;
}
void __attribute__((interrupt,auto_psv)) _MPWM1Interrupt(void)
{
_PWM1IF=0;
if (i==0)
{ P1DC1 = (unsigned int)(Ts - sin_table[j])*hs;
P1DC2 = (unsigned int)(Ts + sin_table[j])*hs;
j++;
if (j==40) {j=0;i=1;};
}
else
{ P1DC1 = (unsigned int)(Ts + sin_table[j])*hs;
P1DC2 = (unsigned int)(Ts - sin_table[j])*hs;
j++;
if (j==40) {j=0;i=0;};
}
}
em thắc mắc cái công thức tính PDC ở đây.hệ số hs=0,5 tính ra trc như thế nào ạ

namqn
30-08-2009, 04:58 PM
em cũng hiểu công thức đó.nhưng trong 1 ví dụ có viêt như sau:
#include <p33fj12mc202.h>
#include <pwm.h>
#include <pwm12.h>
#define Ts 1249
#define hs 0.5
_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
_FPOR(PWMPIN_ON&HPOL_ON&LPOL_ON);//cac chan ra dieu khien boi PORT luc reset,deu co the cao
unsigned char i=0;
unsigned char j=0;
unsigned int const sin_table[40]={0,98,195,291,386,478,567,653,734,811,883,950,101 0,1065,1113,1154,1188,1214,1234,1245,1249,
1245,1234,1214,1188,1154,1113,1065,1010,950,883,81 1,734,653,567,478,386,291,195,98};
void Init_PWM(void);
int main(void)
{ PLLFBD = 41;
_PLLPOST = 0;
_PLLPRE = 0;
while (_COSC !=0b011);//dung bo PLL tao Fosc=80MHz,cho cho dao dong on dinh
while (_LOCK !=1);//cho PLL bat dau khoa pha
TRISB=0X0000;
LATB=0X0000;
Init_PWM();
while(1);
}
void Init_PWM(void)
{
P1TCONbits.PTMOD = 0b10;//continuous up/down cout mode
P1TCONbits.PTCKPS = 0b01;//prescale 4Tcy
P1TCONbits.PTOPS = 0b0000;//postscale 1:1
P1TPER = Ts;//Fpwn = 4kHz
PWM1CON1bits.PMOD1=0;//complementary mode
PWM1CON1bits.PMOD2=0;
PWM1CON1bits.PEN2H=1;//enable for PWM output
PWM1CON1bits.PEN1H=1;
PWM1CON1bits.PEN2L=1;
PWM1CON1bits.PEN1L=1;
PWM1CON2bits.IUE=0;
PWM2CON2bits.UDIS=0;//update from duty cycle and period buffer registers are enabled
P1DTCON1bits.DTAPS=0b00;//Dead time prescale 1:1
P1DTCON1bits.DTA = 40;//deadtime = 1um
//P1DTCON1bits.DTBPS=0b00;
//P1DTCON1bits.DTB = 0;
P1DTCON2bits.DTS2A=0;//Unit A selected for PWM active transitions
P1DTCON2bits.DTS1A=0;
P1DTCON2bits.DTS1I=0;//Unit B selected for PWM inactive transitions
P1DTCON2bits.DTS2I=0;
P1OVDCONbits.POVD2H=1;//PWM I/O pin controlled by PWM generator
P1OVDCONbits.POVD1H=1;
P1OVDCONbits.POVD2L=1;
P1OVDCONbits.POVD1L=1;
P1DC1=0;
P1DC2=0;
_PWM1IF=0;
_PWM1IE=1;
P1TCONbits.PTEN=1;
}
void __attribute__((interrupt,auto_psv)) _MPWM1Interrupt(void)
{
_PWM1IF=0;
if (i==0)
{ P1DC1 = (unsigned int)(Ts - sin_table[j])*hs;
P1DC2 = (unsigned int)(Ts + sin_table[j])*hs;
j++;
if (j==40) {j=0;i=1;};
}
else
{ P1DC1 = (unsigned int)(Ts + sin_table[j])*hs;
P1DC2 = (unsigned int)(Ts - sin_table[j])*hs;
j++;
if (j==40) {j=0;i=0;};
}
}
em thắc mắc cái công thức tính PDC ở đây.hệ số hs=0,5 tính ra trc như thế nào ạ
Công thức mà tôi đã nêu dùng để liên hệ giá trị duty cycle với giá trị của hai thanh ghi PxDCy và PxTPER. Còn vấn đề bạn đang thắc mắc ở đây lại là thuật toán điều khiển (bạn chọn quy luật điều chỉnh duty cycle để đạt ý đồ điều khiển).

Do đó, bạn nên hỏi tác giả của ví dụ đó về hệ số hs.

Thân,

JohnnyNguyen
30-08-2009, 05:58 PM
đây là chương trình điều chế sóng sin.em xin nói qua về chương trình như sau:
sin_table[40] là bảng tạo sóng sin ở nửa chu kỳ.em đã hiểu hệ số 0,5 ở đây là để xét trong nửa chu kỳ.nửa chu kỳ đầu duty cycle dc cập nhật tại PDC1,nửa chu kỳ sau tại PDC2.
nếu bảng sóng sin ở trên đc viết cho cả chu kỳ, thì công thức là

P1DC1 = (unsigned int)(Ts + sin_table[j])
(vơi sin_table[j] là điện áp lấy mẫu,Ts là giá trị PTPER)
em thắc mắc ở đây là làm thế nào để có công thức như vậy ạ.

spin
01-09-2009, 10:00 AM
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 ơi cho hỏi một tí, mình cũng đang dùng con này nhưng chưa biết cách nạp cho nó ra sao, cụ tỉ chân cắm thế nào, bạn có thể cho xin mạch nguyên lý để nạp 1 chương trình đơn giản không.. cảm ơn ..

robotden
04-09-2009, 04:13 PM
nạp chuẩn ICSP đó bạn. MCLR(pin13)/VDD/VSS/PGD1(pin27)/PGC1(pin26)
chúc vui!

thanhgand
15-09-2009, 11:55 AM
Có ai cấu hình đồng thời hai bộ QEI trong 33fj64mc802 chưa.các bác cho em hỏi em cấu hình sai ở chỗ nào mà 2 con encoder không thể hoạt động đông thời .cụ thể:
mạch cưng của em như sau: A1: rb5 ;b1:rb6; a2:rb8; b2:rb9
Assign QEA1 To Pin RP5 -- noi chan A cua encoder 1 voi chan rp5
//***************************
RPINR14bits.QEA1R = 5;

//***************************
// Assign QEB1 To Pin RP6 -- noi chan B cua encoder 1 voi chan rp6
//***************************
RPINR14bits.QEB1R = 6;

//***************************
// Assign QEA2 To Pin RP8 -- noi chan A cua encoder 2 voi chan rp8

//***************************
RPINR16bits.QEA2R = 8;

//***************************
// Assign QEB2 To Pin RP9 -- noi chan B cua encoder 2 voi chan rp9
//***************************
RPINR16bits.QEB2R = 9;
// cau hinh ban dau cho cac encoder:

/* QEI1 */
/*---------------------------------------------------------------------------*/
/*
OpenQEI(QEI_MODE_x4_MATCH & QEI_INPUTS_NOSWAP & QEI_IDLE_STOP
& QEI_NORMAL_IO & QEI_INDEX_RESET_DISABLE,
QEI_QE_CLK_DIVIDE_1_128 & QEI_QE_OUT_ENABLE & POS_CNT_ERR_INT_DISABLE);
*/

QEI1CONbits.QEIM = 7; // QEI_MODE_x4_MATCH
QEI1CONbits.SWPAB = 0; // QEI_INPUTS_SWAP
QEI1CONbits.QEISIDL = 1; // QEI_IDLE_STOP
QEI1CONbits.POSRES = 0; // QEI_INDEX_RESET_DISABLE
QEI1CONbits.PCDOUT = 0; // QEI_NORMAL_IO
QEI1CONbits.POSRES = 0; // POS_CNT_ERR_INT_DISABLE

DFLT1CONbits.QECK = 6; // QEI_QE_CLK_DIVIDE_1_128
DFLT1CONbits.QEOUT = 1; // QEI_QE_OUT_ENABLE

MAX1CNT = 7999;
POS1CNT = 0;

/*................................................. ......................QEI */

/*---------------------------------------------------------------------------*/
/* QEI2 */
/*---------------------------------------------------------------------------*/
/*
OpenQEI(QEI_MODE_x4_MATCH & QEI_INPUTS_NOSWAP & QEI_IDLE_STOP
& QEI_NORMAL_IO & QEI_INDEX_RESET_DISABLE,
QEI_QE_CLK_DIVIDE_1_128 & QEI_QE_OUT_ENABLE & POS_CNT_ERR_INT_DISABLE);
*/

QEI2CONbits.QEIM = 7; // QEI_MODE_x4_MATCH
QEI2CONbits.SWPAB = 0; // QEI_INPUTS_SWAP
QEI2CONbits.QEISIDL = 1; // QEI_IDLE_STOP
QEI2CONbits.POSRES = 0; // QEI_INDEX_RESET_DISABLE
QEI2CONbits.PCDOUT = 0; // QEI_NORMAL_IO
QEI2CONbits.POSRES = 0; // POS_CNT_ERR_INT_DISABLE

DFLT2CONbits.QECK = 6; // QEI_QE_CLK_DIVIDE_1_128
DFLT2CONbits.QEOUT = 1; // QEI_QE_OUT_ENABLE

MAX2CNT = 7999;
POS2CNT = 0;

em cấu hình như trên nhưng chi có encoder 1 hoạt động.(các encoder ,và chân chíp em đã test cẩn thận).khi em đảo encoder1 và 2 cho nhau thì con 2 lại hoạt động.
em nghĩ cấu hình hai chân rb8,rb9 của em có vẫn đề,nhưng em đọc data sheet chưa gỡ gì được.

harakiri
22-10-2009, 05:15 PM
Em chưa hiểu lắm về DMA RAM, mà tìm tài liêu thì mơ hồ quá. Nếu ai có khái niêm này thì có thể chia sẻ giùm em. Thanks

ngotuyen
23-10-2009, 12:22 PM
Em đang dùng dsPIC33FJ256GP510 để phát âm thanh, dùng speex_8K.h và libspeex_8K.a
và phải có file âm thanh trong bộ nhớ chương trình.
Em chưa biết file âm thanh đó như thế nào, dạng file và đưa nó vào bộ nhớ chương trình như thế nào.
Và cách sử dụng các file speex_8K.h và libspeex_8K.a như thế nào để phát âm thanh được theo PWM (phải khai báo như thế nào và sử dụng các hàm như thế nào).
Mong các cao thủ giúp đỡ.

harakiri
11-11-2009, 02:38 AM
Trong datasheet của dsPIC33FJxxGP trong phần chân Digital viết
-Output pins can drive from 3.0V to 3.6V
-All digital input pins are 5V tolerant
Em hiểu là nếu là input thì khi dùng các chân này là chân digital ta có thể cung cấp tới mức volt là 5V để có mức logic 1. Liệu có đúng không ạ?

namqn
11-11-2009, 08:41 AM
Trong datasheet của dsPIC33FJxxGP trong phần chân Digital viết
-Output pins can drive from 3.0V to 3.6V
-All digital input pins are 5V tolerant
Em hiểu là nếu là input thì khi dùng các chân này là chân digital ta có thể cung cấp tới mức volt là 5V để có mức logic 1. Liệu có đúng không ạ?
5 V tolerant có nghĩa là chịu đựng được tới 5 V mà không bị hỏng. Ngưỡng logic của ngõ vào phụ thuộc vào VDD (vì đây dsPIC33F là vi mạch dùng công nghệ CMOS).

Thân,

harakiri
11-11-2009, 10:36 AM
Như vậy,nếu như em nối một chân digital nào đó với mức Volt là 5V thì chip vẫn chịu được, tuy nhiên, mức logic trong trường hơp này sẽ không còn đúng nữa, và chip sẽ không nhận được logic là 1?

namqn
11-11-2009, 10:45 AM
Như vậy,nếu như em nối một chân digital nào đó với mức Volt là 5V thì chip vẫn chịu được, tuy nhiên, mức logic trong trường hơp này sẽ không còn đúng nữa, và chip sẽ không nhận được logic là 1?
Nếu bạn nối một chân digital (có đặc tính 5 V tolerant) vào một ngõ ra logic có nguồn 5 V thì mức logic '1' không có vấn đề, nhưng mức logic '0' có thể có vấn đề.

Bạn đã học môn học "Kỹ thuật số" chưa?

Thân,

rhinoceros
24-11-2009, 12:00 AM
các huynh cho đệ thỉnh giáo chút về UART.
tình hình là đệ đọc datasheet của thằng dsPIC33FJ256GP510 có mấy bit đệ không hiểu. các huynh chỉ giáo giùm nhé . xin đa tạ trước
Thanh ghi UxMODE
IREN: IrDA® Encoder and Decoder Enable bit . IrDA là cái gì vậy,trong datasheet không nói về cái này.em không hiểu . nếu set bit này lên 1 thì hiện tượng gì xảy ra ?
LPBACK: UARTx Loopback Mode Select bit . bit chọn chế độ lặp lại nghĩa là sao. trong đây thì cái gì sẽ lặp lại ? và lặp lại như thế nào ?
ABAUD: Auto-Baud Enable bit tự động chọn tốc độ truyền nhận , em muốn đặt tốc độ truyền là 9600bps thì nó có tự hiểu không ?
URXINV: Receive Polarity Inversion bit theo em hiểu thì "đảo giá trị nhận được" tức là nó nhận được là LSB -> MSB . thì đảo lại là MSB -> LSB không biết có đúng không ?
ở thanh ghi UxSTA
UTXISEL<1:0>: Transmission Interrupt Mode Selection bits chọn chế độ ngắt truyền .em tưởng cứ truyền xong 1 byte thì ngắt chứ ?
UTXBRK: Transmit Break bit không hiểu !!!
UTXEN: Transmit Enable bit bật kênh truyền . em tưởng khi mà bật bit UARTEN thì cả Rx và Tx đều phải được bật chứ .
ADDEN: Address Character Detect bit không hiểu


thêm chút nữa. đệ không biết tốc độ truyền thì được tính thế nào . giả sử giờ đệ có thạch anh 7.3728MHz , truyền với tốc độ 9600bps thì giá trị thanh ghi UxBRG là bao nhiêu ?

xin cảm ơn.

tahi
25-11-2009, 04:42 PM
Cấu hình chạy với baudrate 19200 đây

unsigned int UxMODEvalue,UxSTAvalue,ubrg;
UxMODEvalue = UART_EN&UART_IDLE_CON&UART_IrDA_DISABLE&UART_MODE_FLOW& UART_UEN_00&UART_DIS_WAKE&UART_DIS_LOOPBACK&UART_DIS_ABAUD& UART_UXRX_IDLE_ONE&UART_BRGH_SIXTEEN&UART_NO_PAR_8BIT&UART_1STOPBIT;

UxSTAvalue=UART_INT_TX&UART_IrDA_POL_INV_ZERO&UART_SYNC_BREAK_DISABLED&UART_TX_ENABLE& UART_TX_BUF_NOT_FUL&UART_INT_RX_CHAR&UART_ADR_DETECT_DIS&UART_RX_OVERRUN_CLEAR;

ubrg = 0x81;
//UART1 configuration
OpenUART1(UxMODEvalue,UxSTAvalue,ubrg);
//UART1 interrupts
ConfigIntUART1 (UART_RX_INT_DIS&UART_TX_INT_DIS); //disable interrupts


Với UART chắc chỉ quan tâm đến baud rate, parity, data bit
Ngắt hay ko ngắt là tùy bạn cấu hình và tùy vào ứng dụng của bạn. Nếu bạn chỉ dùng mỗi UART thì chẳng cần ngắt, cứ dùng hàm này

char BusyUART1(void)
{
return(!U1STAbits.TRMT);
}

Muốn tính tốc độ thì dựa vào phần
UART BAUD RATE GENERATOR trong section 17 với dspic33F (hoặc để ý chữ refer to section bao nhiêu đó, ở dưới cấu hình các thanh ghi liên quan)

heavenlylove
27-02-2010, 11:32 PM
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:

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/ADCSampleSequence.png

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:

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/ADCTransferFunction.png


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:

Làm thế nào để cấu hình hoạt động cho Module ADC để nó hoạt động theo ý ta muốn?
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?
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)

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/ADC10ConversionTime.png

http://i32.photobucket.com/albums/d28/picvietnam/dsPIC33/ADC12ConversionTime.png


Vậy ở đây xuất hiện thêm một số khái niệm T_{AD} và T_{CY} 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

Anh viết tiếp đi anh. Anh có thể nói kỹ hơn về chuyển đổi tín hiệu am thanh sàng số được không?

minhthaitn
23-09-2010, 06:04 PM
xin lỗi câu hỏi của em ngoài luồng 1 chút ạ, em không nhìn thấy mấy công thức toán học ở bài đầu tiên, nó báo phải cài mimetex.cgi, e dùng firefox rồi, xin các anh hướng dẫn e với ạ,thanks

musashi17
08-11-2010, 02:42 PM
Anh F đang viết mọi người hỏi sao không ra topic khác ạ. Anh F viết tiếp đi anh. Cảm ơn anh về bài giảng của anh.

manhdungmta
04-12-2010, 07:25 PM
anh Nam cho em hỏi đoạn code sau có gì sai mà không thấy chạy.
em dung C30 cua mplap
////////////////////////////////////////

#include "p33FJ256MC710.h"
_FOSCSEL(FNOSC_PRIPLL & IESO_OFF & TEMP_OFF);
_FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT);
_FWDT(FWDTEN_OFF);
_FPOR(PWMPIN_ON);
_FGS(GCP_OFF);

int i,m;

void init_TMR2();

void init_port()
{
TRISA = 0x0000;
TRISC = 0xFFFF;
LATA = 0x0000;
}

void init_TMR2() /*______ ham khoi tao timer va ngat______*/
{
TMR2 = 0; //Xoa so dem trong TMR2
PR2 = 2; //Dat nguong ngat
_T2IF = 0; //Xoa co ngat cua Timer 2
_T2IE = 1; //Cho phep ngat Timer 2
T2CON = 0x8002; //dung TCK dem
}

void _ISR _T2Interrupt() /*______ ham ngat______*/
{
_T2IF = 0; //Xoa co ngat
LATA++;
}

int main()
{
_PLLDIV=38; // M=40
_PLLPRE=0; // N1=2
_PLLPOST=0; // N2=2
init_port();
init_TMR2();
while(1)
{}
}

ak47
04-12-2010, 07:51 PM
anh Nam cho em hỏi đoạn code sau có gì sai mà không thấy chạy.
em dung C30 cua mplap
////////////////////////////////////////

#include "p33FJ256MC710.h"
_FOSCSEL(FNOSC_PRIPLL & IESO_OFF & TEMP_OFF);
_FOSC(FCKSM_CSDCMD & OSCIOFNC_OFF & POSCMD_XT);
_FWDT(FWDTEN_OFF);
_FPOR(PWMPIN_ON);
_FGS(GCP_OFF);

int i,m;

void init_TMR2();

void init_port()
{
TRISA = 0x0000;
TRISC = 0xFFFF;
LATA = 0x0000;
}

void init_TMR2() /*______ ham khoi tao timer va ngat______*/
{
TMR2 = 0; //Xoa so dem trong TMR2
PR2 = 2; //Dat nguong ngat
_T2IF = 0; //Xoa co ngat cua Timer 2
_T2IE = 1; //Cho phep ngat Timer 2
T2CON = 0x8002; //dung TCK dem
}

void _ISR _T2Interrupt() /*______ ham ngat______*/
{
_T2IF = 0; //Xoa co ngat
LATA++;
}

int main()
{
_PLLDIV=38; // M=40
_PLLPRE=0; // N1=2
_PLLPOST=0; // N2=2
init_port();
init_TMR2();
while(1)
{}
}

Chào!
Chương trình của cậu có một số lỗi như sau:
-Khai báo cấu hình sai:TEMP_OFF không được định nghĩa trong file .h của dspic33FJ256MC710.(test chương trình đơn giản không cần khai báo nhiều thế đâu!)
-Hàm ngắt Timer2 có nhiều cách khai báo nhưng mà nên để ý tới cái psv.Nên xác định rõ psv hay auto_psv để bỏ hẳn cái warning đáng ghét đi (không cũng không sao!)
-Mình không mang mạch theo nên không debug cho cậu được.Cậu thử xem thế nào nhé

manhdungmta
05-12-2010, 07:13 PM
cảm ơn anh!
em thấy trong file dspic33FJ256MC710.h đã định nghĩa TEMP_OFF rồi chứ ạ.
mà em bỏ đi hay thêm vào cái đó cũng không sao cả, nó vẫn không chạy.
trước đó em có viết ct ngắt timer dùng dao động nội thì chạy tốt
chương chình này chỉ khác là em dùng dao động bên ngoài qua TCK
nên em nghĩ hai ct chỉ khác nhau ở điểm: đối với dao động nội cần khai báo T2CON = 0x8000 còn với dao động qua TCK thì khai báo T2CON = 0x8002.
không biết chỉ thế là đủ chưa, mong anh giúp đỡ.

manhdungmta
11-12-2010, 12:26 AM
ai có thể chỉ cho mình được không?????
hay chắc là do phần cứng nhỉ.????

thanh000
12-12-2010, 08:56 PM
anh F ơi, viết tiếp đi anh, đang hay mà lâu rồi ko thấy gì nữa vậy ???

nckh
01-08-2011, 05:08 PM
có mem nào có tài liệu dsPIC33F Family Reference Manual mà có phần về dspic33FJ12MC201/202 chỉ e với. trên http://www.microchip.com có dsPIC33F FRM nhưng mà thiếu mất Part II ( phần danh cho con dspic33FJ12MC201/202 ) ??

thanh_30april
11-10-2011, 10:32 PM
Tiếp đi các anh ơi,em cũng đang tìm hiểu

kubom10x
17-04-2012, 01:34 PM
Thiệt tình là bực mình dễ sợ :( hik...
Bài viết đang rất hay và dễ hiễu...Thế mà các bác vào hỏi ngoài luồn làm hỏng hết :(
Những người mới tìm hiểu như chúng em rất cần những bài viết như thế này :(

tenznam
21-04-2012, 01:22 PM
mình tìm sơ đồ mạch nạp cho dspic33f 1nhưng tìm hoài không thấy. mọi người nếu có ai biết thì xin chia se cho mình với. cảm ơn

tuanlovetien
11-11-2013, 07:06 PM
bác cho em hỏi trong dispic33f32mc204 không đề cập hệ số chia tầng pll thì thạch anh dùng 80mhz nếu muốn 40mips hả bác

tuanlovetien
13-11-2013, 07:40 PM
có ai giúp em với đi

thuhuong
05-03-2014, 02:31 AM
Chào các bạn! Tôi đang nghiên cứu về ứng dụng PWM trên dspic33fj06gs202.
tôi tìm datasheet thì nó giới thiệu chung về họ dspic33fj06/16gs02/04. vì vậy không rõ ràng lắm là con dspic33fj06gs202 có mấy bộ PWM.
Khi tôi lập trình bằng MPLAB IDE 8.92 khai báo với module PWM, khi dịch ra luôn báo lỗi:

error: 'PWMCON3bits' undeclared (first use in this function) (Each undeclared identifier is reported only once for each function it appears in.)
'IOCON3bits' undeclared (first use in this function)
'PDC3' undeclared (first use in this function)
'SDC3' undeclared (first use in this function)

Namqn, falleaf và các bạn có thể giúp tôi giải quyết lỗi này? Xin cảm ơn!

code phần khai báo PWM như sau:

void initPWM(void)
{
PTCON2bits.PCLKDIV =0;
PTCONbits.EIPU = 1;
PTPER = 18859;
PHASE2 = 9430;


PWMCON1bits.CAM = 0;
PWMCON2bits.CAM = 0;
PWMCON1bits.IUE = 1;
PWMCON2bits.IUE = 1;
PWMCON1bits.DTC = 0;
PWMCON2bits.DTC = 0;
PWMCON1bits.MDCS = 0;
PWMCON2bits.MDCS = 0;
PWMCON1bits.ITB = 0;
PWMCON2bits.ITB = 0;

IOCON1bits.PENH = 1;
IOCON1bits.PENL = 1;
IOCON2bits.PENH = 1;
IOCON2bits.PENL = 1;

IOCON1bits.POLH = 0;
IOCON1bits.POLL = 0;
IOCON2bits.POLH = 0;
IOCON2bits.POLL = 0;

IOCON1bits.PMOD = 0;
IOCON2bits.PMOD = 0;


DTR1 = 95;
ALTDTR1 = 95;
DTR2 = 95;
ALTDTR2 = 95;

PDC1 = 0;
PDC2 = 0;

TRGCON1bits.TRGDIV = 0;
TRGCON1bits.TRGSTRT = 0;

TRGCON2bits.TRGDIV = 0;
TRGCON2bits.TRGSTRT = 0;


TRIG1 = 1000;
TRIG2 = 1000;

PWMCON3bits.ITB = 0;
PWMCON3bits.IUE = 1;

IOCON3bits.PENH = 0;
IOCON3bits.PENL = 0;

IOCON3bits.PMOD = 3;
IOCON3bits.OVRDAT = 0;
IOCON3bits.OVRENH = 1;
IOCON3bits.OVRENL = 1;

PDC3 = 0;
SDC3 = 0;

PTCONbits.PTEN =1;

}

gaparaytqn
17-09-2015, 11:32 PM
thật sự thì rất bực mấy bác vào phá... hỏi thì vào luồng khác được không, luông này đang tìm hiểu về cơ bản về dspic cho những người mới học.. bài viết đang hay mà k được tiếp tục , những người mới như em phải làm sao :(

supperchon
18-07-2021, 07:24 AM
viagra cialis levitra comparacion precios (https://www.grupopenascal.com/2020/11/16/viagra-cialis-levitra-comparacion-precios)
comprar generico de viagra en farmacia (https://www.grupopenascal.com/2020/11/16/comprar-generico-de-viagra-en-farmacia)
comprar cialis 5 mg (https://www.grupopenascal.com/2020/11/16/comprar-cialis-5-mg)
foro de cialis generico (https://www.grupopenascal.com/2020/11/16/foro-de-cialis-generico)
cenforce musclecoop.com (https://www.grupopenascal.com/2020/11/16/cenforce-musclecoop-com)
comprar viagra en telde (https://www.grupopenascal.com/2020/11/16/comprar-viagra-en-telde)
precio de levitra 10 mg (https://www.grupopenascal.com/2020/11/16/precio-de-levitra-10-mg)
precios de viagra en colombia (https://www.grupopenascal.com/2020/11/16/precios-de-viagra-en-colombia)
mejor precio venta cialis original (https://www.grupopenascal.com/2020/11/16/mejor-precio-venta-cialis-original)
ventas de genericos de cialis (https://www.grupopenascal.com/2020/11/16/ventas-de-genericos-de-cialis)
genericos de cialis en espana (https://www.grupopenascal.com/2020/11/16/genericos-de-cialis-en-espana)
se puede comprar viagra o derivados sin receta (https://www.grupopenascal.com/2020/11/16/se-puede-comprar-viagra-o-derivados-sin-receta)
precio cialis farmacia san pablo (https://www.grupopenascal.com/2020/11/16/precio-cialis-farmacia-san-pablo)
aduanas cialis generico (https://www.grupopenascal.com/2020/11/16/aduanas-cialis-generico)
se puede comprar viagra en andorra sin receta (https://www.grupopenascal.com/2020/11/16/se-puede-comprar-viagra-en-andorra-sin-receta)
saludsexual es com comprar female viagra spain html (https://www.grupopenascal.com/2020/11/16/saludsexual-es-com-comprar-female-viagra-spain-html)
viagra generica online espana barata (https://www.grupopenascal.com/2020/11/16/viagra-generica-online-espana-barata)
precio de viagra en farmacias similares mexico (https://www.grupopenascal.com/2020/11/16/precio-de-viagra-en-farmacias-similares-mexico)
similares al viagra en espana (https://www.grupopenascal.com/2020/11/16/similares-al-viagra-en-espana)
levitra generico vademecum (https://www.grupopenascal.com/2020/11/16/levitra-generico-vademecum)
levitra nombre generico (https://www.grupopenascal.com/2020/11/16/levitra-nombre-generico)
comprar viagra en negro en barcelona (https://www.grupopenascal.com/2020/11/16/comprar-viagra-en-negro-en-barcelona)
cuanto vale viagra en espana (https://www.grupopenascal.com/2020/11/16/cuanto-vale-viagra-en-espana)
puedo comprar una pastilla de viagra en la farmacia (https://www.grupopenascal.com/2020/11/16/puedo-comprar-una-pastilla-de-viagra-en-la-farmacia)
cialis 10 mg precio chile (https://www.grupopenascal.com/2020/11/16/cialis-10-mg-precio-chile)
comprar tadalafilo geenrico en farmacia (https://www.grupopenascal.com/2020/11/16/comprar-tadalafilo-geenrico-en-farmacia)
comprar viagra y levitra (https://www.grupopenascal.com/2020/11/16/comprar-viagra-y-levitra)
generico cialis de 5 mg se puede comprar sin receta (https://www.grupopenascal.com/2020/11/16/generico-cialis-de-5-mg-se-puede-comprar-sin-receta)
como conseguir cialis en espana (https://www.grupopenascal.com/2020/11/16/como-conseguir-cialis-en-espana)
donde comprar cialis generico en mexico (https://www.grupopenascal.com/2020/11/16/donde-comprar-cialis-generico-en-mexico)
precio farmacia cialis 5 mg (https://www.grupopenascal.com/2020/11/16/precio-farmacia-cialis-5-mg)
cialis precio de venta en farmacias (https://www.grupopenascal.com/2020/11/16/cialis-precio-de-venta-en-farmacias)
buy cenforce pills (https://www.grupopenascal.com/2020/11/16/buy-cenforce-pills)
existe el generico de cialis en farmacia fisica (https://www.grupopenascal.com/2020/11/16/existe-el-generico-de-cialis-en-farmacia-fisica)
viagra cialis levitra precio (https://www.grupopenascal.com/2020/11/16/viagra-cialis-levitra-precio)

supperchon
23-07-2021, 07:06 AM
precio viagra generico estenosis uretral recuperacion (https://fisioterapiapatriciapena.com/las-consecuencias-de-una-prostatectomia-puedo-recuperarme/)
noticias medicas recientes fractura cabeza del radio (http://fisioterapiapatriciapena.com/portfolio/drenaje-linfatico-manual/)
como curar la episiotomia comprar tadalafilo (https://fisioterapiapatriciapena.com/cialis-sin-receta)
clases de pilates en granada muneca abierta tiempo de recuperacion (http://fisioterapiapatriciapena.com/blog/page/12/?tag=poner-fin-a-mis-problemas-de-espalda)
kamagra jelly condilo codo (http://fisioterapiapatriciapena.com/estiramiento-lumbalgia-y-ciatica-clinica-fisioterapia-granada/)
fisioterapeutas granada fractura de cabeza de radio (http://fisioterapiapatriciapena.com/recuperacion-postquirurgica-de-fractura-de-la-cabeza-del-radio-con-implantacion-de-tornillo/)
rotura codo estiramientos lumbalgia (http://fisioterapiapatriciapena.com/tag/osteopata-granada/)
lumbalgia como sentarse comprar viagra online contrareembolso (http://fisioterapiapatriciapena.com/a-donde-acudir-cuando-has-tenido-un-accidente-de-trafico/)
oferta limpieza facial vendo viagra (https://fisioterapiapatriciapena.com/sildenafil-100mg-generico)
lumbalgia y ciatica bolas chinas como usarlas (http://fisioterapiapatriciapena.com/recuperacion-de-fractura-de-codo-con-protesis/)