View Single Post
Old 19-01-2008, 03:14 PM   #5
falleaf
PIC Bang chủ
 
falleaf's Avatar
 
Tham gia ngày: May 2005
Bài gửi: 2,631
:
Send a message via Yahoo to falleaf
Học lập trình cơ bản

Trong giới hạn bài viết này, chúng ta tìm hiểu trực tiếp việc lập trình PIC32 dùng trình dịch C32 của Microchip và môi trường soạn thảo MPLAB v8.0 trở lên làm cơ bản. Những nội dung khác chúng ta sẽ khảo sát sau.


1. Tìm hiểu các hàm trong plib.h

Các "hàm" trong C32 được định nghĩa dưới dạng #define, bởi đôi lúc việc thực hiện những công việc này nó quá đơn giản, và người ta đã viết thành các định nghĩa (#define) như kiểu "macro" của C vậy. Việc đơn giản là chúng ta sẽ gọi trực tiếp các định nghĩa này như gọi một "hàm" vậy. Chúng ta sẽ tìm hiểu kỹ tại sao người ta lại viết như vậy, và quy trình của nó như thế nào một cách chi tiết hơn ở các phần bên dưới.

1.1. Chức năng I/O (ngày 23/01/2008)

Chức năng I/O các bạn xem bài tập PIC32Test.zip mà F gửi, có lẽ từ đó các bạn sẽ có thể nắm được ngay nó làm gì, như thế nào. F viết chú thích vào trong đó. (các bạn nhớ mở cả workspace, file .mcp). F đã đặt cái SFR view sẵn trên đó, các bạn kéo nó xuống tới chỗ PORTD, TRISD, LATD, ODCD để xem sự thay đổi của các thanh ghi này, vì chúng ta đang tương tác PORTD (các LEDs trên PIC32 Starter Kit cắm ở RD0, RD1, RD2)

Ngoài ra, F còn chép y nguyên lại một đoạn chương trình mẫu trong PIC32 Starter Kit User Guide, đồng thời sửa các lệnh của nó để so sánh cách viết, ngoài ra F cũng ghi chú những F cần thiết trong đó. Hy vọng có thời gian sẽ mở riêng ra một luồng về các chức năng của PIC32 riêng, còn giờ thì chỉ làm những việc lặt vặt được thôi.


1.2. Chức năng ADC

Code:
#define OpenADC10(config1, config2, config3, configport, configscan) (mPORTBSetPinsAnalogIn(configport), AD1CSSL = ~(configscan), AD1CON3 = (config3), AD1CON2 = (config2), AD1CON1 = (config1) )
Code:
#define ConfigIntADC10(config) ( mAD1ClearIntFlag(), mAD1SetIntPriority(((config) & 7)), mAD1SetIntSubPriority((((config) >> 4) & 3)), mAD1IntEnable(((config) >> 15)) )
Code:
#define EnableADC10() (AD1CON1SET = _AD1CON1_ON_MASK)
Code:
#define AcquireADC10() (AD1CON1SET = _AD1CON1_SAMP_MASK)
Code:
#define BusyADC10() (AD1CON1bits.DONE)
Xem cái đoạn code dưới đây xong, chắc chúng ta cũng hiểu cách plib.h nó làm cái gì rồi. Thực ra những công việc định nghĩa với plib.h chỉ là một việc làm thuần túy giúp chúng ta viết những đoạn code cho ngắn gọn hơn một tí, và cho nó gợi nhớ hơn một tí.
Code:
typedef union {
  struct {
    unsigned DONE:1;
    unsigned SAMP:1;
    unsigned ASAM:1;
    unsigned :1;
    unsigned CLRASAM:1;
    unsigned SSRC0:1;
    unsigned SSRC1:1;
    unsigned SSRC2:1;
    unsigned FORM0:1;
    unsigned FORM1:1;
    unsigned FORM2:1;
    unsigned :2;
    unsigned SIDL:1;
    unsigned FRZ:1;
    unsigned ON:1;
  };
  struct {
    unsigned :5;
    unsigned SSRC:3;
    unsigned FORM:3;
    unsigned :2;
    unsigned ADSIDL:1;
    unsigned :1;
    unsigned ADON:1;
  };
  struct {
    unsigned w:32;
  };
} __AD1CON1bits_t;
extern volatile __AD1CON1bits_t AD1CON1bits asm ("AD1CON1") __attribute__((section("sfrs")));
Code:
#define ConvertADC10() (AD1CON1CLR = _AD1CON1_SAMP_MASK)
Code:
#define ReadActiveBufferADC10() ( AD1CON2bits.BUFS )
Code:
#define ReadADC10(bufIndex) (*(&ADC1BUF0+((bufIndex) * 4)))
Tại sao lại có cái công thức loằng ngoằng như thế này ở ReadADC10(bufIndex)? Vậy giá trị bufIndex khi đưa vào sẽ là giá trị gì?

Code:
#define SetChanADC10(config) (AD1CHS = (config))
Code:
#define CloseADC10() ( mAD1IntEnable(0), AD1CON1CLR = _AD1CON1_ON_MASK )
Câu hỏi đặt ra là, một quy trình tương tác chức năng ADC của PIC32 sẽ được diễn ra theo thứ tự nào? Có những vấn đề gì cần quan tâm?


Chúc vui

Tài liệu tham khảo:
[1] File plib.h trong thư mục C:\Program Files\MPLAB C32\libscr\include
File Kèm Theo
File Type: zip PIC32Test.zip (124.8 KB, 184 lần tải)

thay đổi nội dung bởi: falleaf, 23-01-2008 lúc 04:03 PM.
falleaf vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn