![]() |
dsPIC từ cơ bản đến nâng cao
Chào các bác,
Em tham gia vào diễn đàn cũng đã lâu, nhờ sự nhiệt tình của các mod cũng như các thành viên mà diễn đàn của ta rất là sôi nổi. Em đã nắm bắt được cơ bản các vấn đề với pic 8 bit, em muốn nâng cao với dspic. Em chọn chú 30F2010 rất phổ biến và được khuyên dùng khi bắt đầu tìm hiểu về dspic. Bác nào có nhu cầu thì cùng tìm hiểu với em. Em cỏn rất ngu nên chắc còn nhờ các bác giúp đỡ nhiều, đặc biệt là đại ca Nam. Từ tốn, ta bắt đầu các bác nhỉ. Datasheet dsPIC30F2010: http://ww1.microchip.com/downloads/e...Doc/70118G.pdf |
Tính năng
1 Attachment(s)
Tính năng
- Bộ nhớ chương trình/bộ nhớ lệnh: 12K/4K - Dung lượng SRAM: 512 Bytes - Dung lượng EEPROM: 1024 Bytes - Ba bộ timer 16-bit - Bốn bộ Input Capture - Hai bộ Output Compare/Standard PWM - Sáu kênh chuyên dụng điều khiển motor PWM - Sáu kênh chuyển đổi A/D 10-bit - Hỗ trợ Quandrature Encoder Interface - Một giao tiếp UART - Một giao tiếp SPI - Một giao tiếp I2C I/O dsPIC2010 có 5 port I/O, các chân được tích hợp nhiều tính năng khác nhau, tùy vào mục đích sử dụng, các tính năng phù hợp được lựa chọn. Tất cả các I/O port đều có ba thanh ghi tương tác trực tiếp: - TRISx : thanh ghi hướng dữ liệu, ghi giá trị 1 là input, 0 là output. Sau khi reset, tất cả các port là input. - PORTx : thanh ghi dữ liệu port, có thể xuất giá trị sai khi chuyển từ input sang output. - LATx : thanh ghi chốt I/O, kết hợp với một chân I/O để loại trừ những vấn đề có thể xuất hiện với các lệnh read – modify – write. Việc đọc thanh ghi LAT trả về giá trị đã được giữ trong port output latch. Thay vì giá trị trên I/O pin. Hoạt động read – modify – write trên thanh ghi LAT, kết hợp với một I/O port ngăn ngừa việc có thể viết giá trị chân input sang port latch. Việc viết lên thanh ghi LAT có tác dụng giống như việc viết lên thanh ghi PORT. Sự khác nhau giữa thanh ghi PORT và LAT có thể được tổng kết như sau: • Việc viết lên thanh ghi PORT sẽ viết giá trị dữ liệu lên port latch • Việc viết lên thanh ghi LAT sẽ viết giá trị dữ liệu lên port latch • Việc đọc từ thanh ghi PORT sẽ đọc giá trị dữ liệu trên I/O pin • Việc đọc từ thanh ghi LAT sẽ đọc giá trị dữ liệu đã được dữ trên port latch |
Nói rõ hơn một chút:
- Bộ nhớ chương trình (program memory) của dsPIC30F2010 có kích thước 12 kbyte, tức là 4k lệnh (4096 ô nhớ 24-bit). Trong thế giới số, 1k = 1024. Với bộ nhớ lệnh nhỏ như vậy, chỉ cần dùng các lệnh rcall và bra để tiết kiệm bộ nhớ chương trình, thay vì dùng các lệnh call và goto. Thân, |
Bổ sung tí tẹo
- Có 3 timer 16bit, có thể ghép 2 timer để được 1 timer 32bit. - 6 Kênh PWM có thể làm rất nhiều việc khác, nhưng chính vẫn là dk động cơ. - Chân cẳng iem 2010 này hơi chuối một chút, 2 chân nạp (PGD, PGC) chân SPI, I2C lại trùng vào nhau, nên hơi khó dùng, nếu bạn treo trở dùng giao tiếp I2C thì việc nạp chương trình sẽ bị ảnh hưởng (kinh nghiệm bản thân cứ tưởng mạch nạp hỏng :), cắt 2 con trở treo lại nạp ầm ầm). - Chân UART lại trùng chân với nhiều giao tiếp SPI, I2C, nên chủ yếu con này chuyển sang dùng U1ATX, U1ARX, nên khi thiết kế cẩn thận chút. |
Trích:
|
Thắc mắc Timer
Em không biết khi dùng Timer của dsPIC với C30, khi Timer tràn thì làm sao nó nhận biết hàm xử lí tràn vì em tham khảo hàm xử lí của anh Nam viết và cũng hàm xử lí đó, nhưng nó khác tên nhau. Em muốn biết có dâu hiệu nào để biết?
Câu hỏi của em hơi ngớ ngẩn. |
Trích:
Về dấu hiệu nhận biết, bạn xem trong tập tin kịch bản liên kết tương ứng (ví dụ p30f2010.gld cho dsPIC30F2010), bạn tìm đến phần 'Primary Interrupt Vector Table', là nơi các vector ngắt được định nghĩa, sẽ thấy các tên mặc định cho các trình phục vụ ngắt tương ứng. Lấy ví dụ, ngắt Timer 1 sẽ được mô tả như sau: Code:
LONG(DEFINED(__T1Interrupt) ? ABSOLUTE(__T1Interrupt) : Câu hỏi của bạn không hề ngớ ngẩn. Thân, |
Nghĩa là mình phải đặt đúng tên hàm là "__T1Interrupt" hay chỉ cần có cụm này trong tên hàm thì C30 sẽ nhận ra và nhảy đến đó hả anh. Chắc là nó không thông minh đến vậy. Em vẫn chưa thông...:confused:
|
Những tutorial của anh Nam chỉ cần áp vào là chạy ngay, nhưng em muốn tìm hiểu kĩ cách thức hoạt động của dspic, từng thanh ghi nên phải mày mò từ đầu như vậy và em muốn học trên C30 luôn chứ không dùng ASM.
Do vậy nên có nhiều câu hỏi phát sinh. Cảm ơn anh về các Tutorial này. |
Trích:
Thân, |
Giao tiếp nối tiếp
Trích VD 4.2:
Code:
#include "p30f4012.h" Em muốn nhận luôn 123456 làm 1 hệ số k = 123456. Có hàm nào sẵn có thực hiện việc ghép nối này, hay mình phải viết riêng vậy anh Nam? |
Trích:
Chuẩn RS-232 chỉ truyền mỗi lần một ký tự, và module UART của dsPIC chỉ hỗ trợ truyền tối đa 9-bit cho mỗi ký tự. Do vậy, thông thường chúng ta phải truyền một chuỗi ký tự đến dsPIC, và thực hiện chuyển đổi thành giá trị thực. E rằng bạn sẽ phải tự viết hàm chuyển đổi. Thân, |
ADC 12bit
Em đang bị vướn phần ADC 12bit, ADC 10bit chạy trên 30F2010 rất tốt, nhưng khi chuyển sang 30F3012 lấy ADC 12bit, em đưa thẳng chân V+ 5V vào AN2, nhưng giá trị gửi lên Hyper terminal chỉ dao động quanh 950h, tức cỡ 2.91V. Em đã xem kĩ nhưng ko phát hiện sai chỗ nào cả. Đau đầu quá :( . Anh Nam giúp em với!
Code:
#include "p30f3012.h" |
ADC 12-bit trong dsPIC30F cần có Tad tối thiểu là 334 ns cho tốc độ 200 kSPS, bạn phải chỉnh lại ADCON3 để đảm bảo điều này (code hiện thời có Tad = 250 ns). Ngoài ra, nên xem phần tương ứng trong datasheet của chip về các tụ bypass và các chân ref cho module ADC 12-bit (nếu tốc độ chuyển đổi từ 100 kSPS trở xuống thì Tad tối thiểu là 668 ns).
Thân, |
Cảm ơn anh, em làm được rồi. Đúng là do Tad quá thấp, tăng lên hợp lý, chuyển đổi ào ào ngay.
|
Trích:
em thử đoạn chương trình mà bác viết trong ví dụ 4.2 nhưng không hiểu tại sao nó lại kô chạy mới bực mình chứ bác ạ. Em hiện tại đang dùng bản MPLAB 7.50 khi em dịch chương trình thì nó báo là: "Tool doesn't support selected device". Bực mình quá em không hiểu thế nào. Hay là em thiết lập ở phần C30 không đúng hả bác hay bản này nó không cho dùng thằng 30F4012 hả bác. Bác giúp em cái nhé. Thank you bác trước nhé. |
Bạn bấm gì để dịch? coi chừng bạn bấm vào phần debug đó. Chọn lại phần Tool là MPLAB SIM.
Chúc vui. |
Trích:
|
Trích:
Thân, |
Trích:
|
Trích:
http://www.picvietnam.com/forum//showthread.php?t=333 Thân, |
Sử dụng nhiều module cùng chân!
1. Em muốn sử dụng đồng thời hai hoặc nhiều module trong cùng một nhóm chân, ví dụ UART và I2C hay SPI chẳng hạn. Phải chăng thiết cấu hình từng module, xử lý dữ liệu rồi xóa cấu hình đó đi, thiết lập cấu hình module khác, xử lý dữ liệu,... Có cách nào tiện lợi hơn không anh?
2. Trong chuẩn I2C, em không tìm thấy thanh ghi nào thiết lập dspic ở chế độ master hay slave! :confused: |
Trích:
2. dsPIC khi kích hoạt module I2C thì nó sẽ làm việc luôn ở 2 chế độ master và slave, chính xác hơn là cả 2 mạch logic cho master và slave đều cùng hoạt động. Bạn đọc tài liệu 'dsPIC30F Family Reference Manual', ký hiệu tài liệu là DS70046 (phiên bản hiện tại là DS70046E), để có thêm thông tin về module I2C cũng như những ngoại vi khác. Tôi tạm dịch một phần trong mục 21.4-Enabling I2C operation của tài liệu đó: Trích:
Trích:
Thân, |
Thấy chỗ này có nhiều người coi nhất,cho em hỏi tí,thanh ghi PORT và LAT trong dsPIC hình như hơi giống nhau,thế có đặc điểm gì xuất hiện thêm thanh ghi LAT nữa,...
Đề nghị này hơi quá tí:có ai có tutor nào chi tiết giống như bác F ko ạ,mới tìm hiểu hơi không hiểu một vài thứ,như thanh ghi.cú pháp lệnh,cách đặt tên biến(dấu"__")mà mấy anh đi lẹ quá,nên e hơi đuối... |
Trích:
http://www.picvietnam.com/forum/showthread.php?t=5 Để giải quyết vấn đề đó, từ PIC18 và sau này là các dsPIC30F, PIC24, dsPIC33F, các cổng ngoại vi luôn có 2 thanh ghi liên quan là LATx và PORTx. Quy tắc đơn giản để tránh rắc rối với các lệnh có hoạt động read-modify-write: - Khi muốn xuất ra port ngoại vi thì ghi vào LATx - Khi muốn đọc từ port ngoại vi thì đọc từ PORTx Thân, |
Trong TUT về UART của anh Nam có khai báo chuổi "Xin chào !" trong vùng psv. Anh Nam cho e hoi vùng psv nay là gi vậy, em đọc datasheet của ds33F Family thì có đề cập MCU va DSP instruction, e đọc nhưng ko hiểu lắm anh có thể giải thích về chổ này ko?
|
Trích:
Trích:
http://ww1.microchip.com/downloads/e...03_README.html |
Trích:
Các trình hợp dịch và biên dịch đã có các hàm hay macro có sẵn để xác định địa chỉ trang và địa chỉ bắt đầu trong trang đó của 1 vùng nhớ cụ thể (đã được định nghĩa và gán giá trị trước đó, chẳng hạn như các chuỗi hằng). Do đó chúng ta chỉ cần đặt giá trị thích hợp (địa chỉ trang PSV của vùng dữ liệu cần truy xuất) vào thanh ghi PSVPAG, sau đó lấy địa chỉ offset của vùng dữ liệu (hằng) cần truy xuất vào một thanh ghi chỉ số nào đó chẳng hạn, và truy xuất như là nó đang nằm trong RAM dữ liệu (tất nhiên đây là các dữ liệu chỉ đọc, trong trường hợp bình thường). Thân, |
E mới tìm hiểu về pspic.các đại ca cho e hỏi vấn đề này:
E đã đọc về chức năng của các chân CN (change notification pin) của pspic trong dspic30F reference manual nhưng vẫn chưa hiểu cặn kẽ các ngắt được tạo ra ở các chân này có tác dụng để làm gì,dùng trong những trường hợp nào? Mong các đại ca chỉ giúp e . |
Trích:
Thân, |
Cảm ơn anh!
Thế như anh Nam nói thì chức năng của các chân này không có gì khác với chức năng của các chân ngắt ngoài INT0->INTx ở chế độ any change à anh.ví dụ như đếm xung encoder chẳng hạn ,ta có thể dùng các chân INTx ở chế độ any change để kích hoạt ngắt ở cả sườn lên và sườn xuống của xung vào. |
Trích:
Thân, |
cảm ơn anh!
Vậy sao dspic ko có thêm chế độ kích hoạt ngắt cho cả 2 sườn lên và sườn xuống cho các chân INTx (any change) như trong AVR nhỉ?cho đơn giản.Hay làm thế sẽ ổn định và chính xác hơn?Trước e làm AVR giờ chuyển sang DSpic cùng là để tận dụng khả năng xử lý,module QEI ,module CAN,PWM của DSPIC.Là lính mới học DSPIC,mong anh chỉ giáo. |
Trích:
Thân, |
Em xài ds33f muốn đọc ADC 5V thì chọn VCFG<2:0> sao cho ADref+ = 5v ADref-= AVss và nối chân Vref+ với 5V. Như vậy ok chưa a Nam
|
Trích:
Thân, |
Em có đọc bài đó của anh, nhưng em thắc mắc là do mình ko tạo được áp Vref 5V (em dùng chân Vref+ nguồn ngoài 5V và chân AVss mass) hay là chân ANx đọc về ko chịu nổi áp 3.6V-5V.
|
Trích:
Thân, |
Em hỏi về dspic33FJ256GP710 !
Khi em dùng dspic33FJ256GP710. Em khai báo: _FOSCSEL(FNOSC_PRI & IESO_OFF & TEMP_OFF)
thì khi chạy nó báo lỗi là: error: 'TEMP_OFF' undeclared here (not in a function) Mong các cao thủ chỉ cho em với ạ! Em cảm ơn ah! |
Trích:
Code:
** _FOSCSEL( OPT1_ON & OPT2_OFF & OPT3_PLL ) Thân, |
Múi giờ GMT. Hiện tại là 11:17 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