( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

39
# 11 ( BKIT Hardwareclub > Document - Study > PIC [DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC Tên tài khoản Ghi nhớ? Mật khẩu Trang chủ Đăng ký Hỏi/Ðáp Danh sách thành viên Lịch Bài gửi hôm nay Tìm Kiếm Trang 2/2 < 1 2 LinkBack Ðiều Chỉnh Xếp Bài 04-02-2013, 05:19 AM bs135 Administrator Tham gia ngày: Sep Bài gửi: 336 Thanks: 151 Thanked 363 Times i Bài 10 : Giao tiếp nối tiếp SPI Bài 10 : Giao tiếp nối tiếp SPI 7.1 Giới thiệu về SPI SPI (Serial Peripheral Interface) là một dạng giao thức truyền nối tiếp được dùng để giao tiếp với các thiết bị ngoại vi(EEPROM,SDcard…) v các vi điều khiển khác. 7.2 Chế độ SPI trong vi điều khiển PIC Giao tiếp SPI được hiện thực qua 4 chân của vi điều khiển: SDI( Serial Data In ): Tín hiệu nối tiếp được đưa vào vi điều khiển SDO( Serial Data Out): Tín hiệu nối tiếp từ vi điều khiển đi ra CLK(Clock): xung clock tạo ra bới master SS(Slave Select): tích cực mức thấp, dùng để chọn slave để truyền dữ liệu Hình 7-1 Sơ đồ khối của SPI 7.2.1 Các thanh ghi điều khiển SPI [DOC] Hướng dn thc hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va... 1 trong 39 5/26/2013 4:19 PM

Transcript of ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Page 1: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

#11 (

BKIT Hardwareclub > Document - Study > PIC

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PICTên tài khoản Ghi nhớ?

Mật khẩu

Trang chủ Đăng ký Hỏi/Ðáp Danh sách thành viên Lịch Bài gửi hôm nay Tìm Kiếm

Trang 2/2 < 1 2

LinkBack Ðiều Chỉnh Xếp Bài

04-02-2013, 05:19 AM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 10 : Giao tiếp nối tiếp SPI

Bài 10 : Giao tiếp nối tiếp SPI

7.1 Giới thiệu về SPI

SPI (Serial Peripheral Interface) là một dạng giao thức truyền nối tiếp được dùng để giao tiếp với các thiết bị ngoại vi(EEPROM,SDcard…) vàcác vi điều khiển khác.

7.2 Chế độ SPI trong vi điều khiển PIC

Giao tiếp SPI được hiện thực qua 4 chân của vi điều khiển:SDI( Serial Data In ): Tín hiệu nối tiếp được đưa vào vi điều khiểnSDO( Serial Data Out): Tín hiệu nối tiếp từ vi điều khiển đi raCLK(Clock): xung clock tạo ra bới masterSS(Slave Select): tích cực mức thấp, dùng để chọn slave để truyền dữ liệu

Hình 7-1 Sơ đồ khối của SPI

7.2.1 Các thanh ghi điều khiển SPI

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

1 trong 39 5/26/2013 4:19 PM

Page 2: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Chế độ SPI được điều khiển bằng 4 thanh ghi sau

• MSSP Control Register 1 (SSPCON1)• MSSP Status Register (SSPSTAT)• Serial Receive/Transmit Buffer Register(SSPBUF)• MSSP Shift Register(SSPSR) – thanh ghi này không được truy xuất bởi người dùng

Hai thanh ghi SSPCON1 và SSPSTAT là hai thanh ghi điều khiển, còn than ghi SSPSR là thanh ghi dùng để dịch dữ liệu ra/vào viđiều khiển, SSPBUF là thanh ghi dùng để đọc dữ liệu từ ngoài vào hoặc ghi dữ liệu để truyền ra ngoài. Ở chế độ nhận, 2 thanhSSPBUF và SSPSR là 1 bộ buffer đôi, khi dữ liệu từ ngoài truyền vào được lưu đầy đủ trong SSPSR(8 bits) thì dữ liệu này đượctruyền tới thanh ghi SSPBUF để người dùng lấy ra. Còn ở chế độ truyền thì khi dữ liệu được ghi vào thanh ghi SSPBUF thì cùnglúc dữ liệu đó cũng được ghi vào thanh ghi SSPSR để dịch ra ngoài.

2.7.2.1 Thanh ghi SSPSTAT

Bit 7:

SMP Sample bitSPI Master mode1 = dữ liệu vào sẽ được lấy ở cuối chu kỳ xung clock0 = dữ liệu vào sẽ được lấy ở giữa chu kỳ cung clockSPI Slave modeSMP phải được gán bằng 0

Bit 6:

CKE SPI Clock Select bit

Bit 0:

BF BuFffer Full Status bit(dành cho quá trình nhận)1 = quá trình nhận hoàn thành, SSPBUF đầy0 = quá trình nhận đang thực hiện, SSPBUF trống

2.7.2.1 Thanh ghi SSPCON1

Bit 7:

WCOL Write Collision Detect bit(chỉ dùng ở chế độ truyền tín hiệu)1 = thanh ghi SSPBUF được ghi đè dữ liệu trong khi dữ liệu cũ truyền chưa hết0 = không có đụng độ

Bit 6:

SSPOV Receive Overflow Indicator bit(dùng ở chế độ nhân tín hiệu)1 = có dữ liệu mới nhận về ghi đè lên thanh ghi SSPBUF trong khi dữ liệu trướcđó chưa được đọc.0 = dữ liệu không bị ghi đè

Bit 5:

SSPEN Synchronous Serial Port Enable bit1 = bật chế độ SPI và các chân SDI, SDO, SCK, SS được cấu hình tương ứng.0 = tắt chế độ SPI

Bit 4:

CKP Clock Polarity Select bit1 = thiết lập trạng thái rảnh khi xung clock ở mức cao0 = thiết lập trạng thái rảnh khi xung clock ở mức thấp

Bit 3-0:

SSPM3:SSPM0 Synchronous Serial Port Mode Select bit0101 = chế độ slave, clock = chân SCK, tắt chức năng của chân SS0100 = chế độ slave, clock = chân SCK, bật chức năng của chân SS0011 = chế độ master, clock = tần số của timer 2 /20010 = chế độ master, clock = Fosc / 64

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

2 trong 39 5/26/2013 4:19 PM

Page 3: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

#12 (permalink)

0001 = chế độ master, clock = Fosc / 160000 = chế độ master, clock = Fosc / 4

7.2.2 Cấu hình SPI

Để cấu hình chế độ SPI cho vi điều khiển PIC ta sử dụng các bit SSPCON1<5:0> và SSPSTAT<7:6>, khi cấu hình các bit nàySPI của PIC sẽ được cấu hình ở chế độ master hoặc slave, cung clock cho SPI, và thiết lập việc nhận dữ liệu xảy ra ở cạnh lênhoặc xuống của xung clock. Thanh ghi SSPSR có chức năng dịch dữ liệu ra và vào vi điều khiển và luôn là bit trọng số cao trước.Ở trong chế độ truyền, thanh ghi SSPBUF sẽ chờ cho đến khi thanh ghi SSPSR sẵn sàng nhận dữ liệu rồi mới ghi dữ liệu lênthanh ghi SSPSR, nếu có hành động ghi dữ liệu vào thanh ghi SSPBUF trong lúc dữ liệu truyền chưa xong thì hành động đó đượcbỏ qua và bit WCOL được bật lên báo hiệu có xảy ra đụng đô. Ở trong chế độ nhận, sau khi SSPSR nhận đủ 8 bit dữ liệu sẽ đượcchuyển đến thanh ghi SSPBUF và bit BF được bật lên để báo hiệu, nếu dữ liệu trước đó được lưu trong thanh ghi SSPBUF chưađược đọc mà lại có thêm dữ liệu mới thì dữ liệu mới sẽ ghi đè lên dữ liệu cũ và bit SSPOV được bật lên.

Hình 7-2 Kết nối SPI master/slave

Hàm cấu hình chế độ SPI master cho vi điều khiển PIC

Code:

void init_spi_master(void){SSPSTATbits.CKE = 1; // when CKP = 0,CKE = 0

transmit data on fallingclock,CKE = 1 transmit data on rising clock

// when CKP = 1,CKE = 1 transmit data on rising

clock,CKE = 1 transmit dataon falling clockSSPCON1bits.CKP = 1; // CKP=0 data first,second is

clock; CKP=1 clock SSPCON1bits.SSPEN = 1; // enable SPI masterSSPCON1bits.SSPM0 = 0; //SSPCON1bits.SSPM1 = 0; //SSPCON1bits.SSPM2 = 0; //SSPCON1bits.SSPM3 = 0; // preacaler 1:4

}

__________________BS

The Following 3 Users Say Thank You to bs135 For This Useful Post:

InterMilan (04-02-2013), mhl167 (17-04-2013), xuanhung06 (05-02-2013)

05-02-2013, 04:56 AM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 11 : Điều khiển led 7 đoạn và mâ trặn bằng SPI

Bài 11 : Điều khiển led 7 đoạn và mâ trặn bằng SPI

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

3 trong 39 5/26/2013 4:19 PM

Page 4: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

8.1 Kết nối phần cứng

Hình 8-1 Sơ đồ kết nối led 7 và led ma trận

Ở bài này chúng ta sẽ sử dụng mạch rời số1, mạch bao gồm 8 led 7 đoạn và 1 led ma trận được sử dụng giao tiếp với vi điềukhiển thông qua giao thức SPI. Trong mạch này vi điều khiển PIC đóng vai trò là master và các IC TPIC595, 74HC595 đóngvai trò là slave với chức năng dịch bit, ngoài chức năng dịch bit IC TPIC595 còn có tác dụng đệm và đảo tín hiệu đầu vào, ICnày được sử dụng để phù hợp với nguyên lý hoạt động của led 7 đoạn và led ma trận.Cách thức hoạt động của mạch là vi điều khiển sẽ dịch dữ liệu cần xuất ra ngoài đến các con IC dịch, và khi nào dịch đủ dữliệu cần xuất ra ngoài vi điều khiển sẽ khóa dữ liệu lại bằng cách tạo một xung từ thấp lên cao trên chân LATCH của các ICdịch này, lúc này các IC dịch sẽ lấy dữ liệu được cất trong bộ đệm trong quá trình dịch dữ liệu của vi điều khiển và xuất rangoài.

8.2 Xây dựng chương trình

Ngoài hàm cấu hình chế độ SPI cho PIC nhu ở bài trên, chúng ta cần hiện thực thêm hàm tạo tín hiệu LATCH, hàm quét led 7đoạn và led ma trận, hàm xóa led 7 đoạn và led ma trận. Ngoài ra chúng ta cũng cần bổ sung thêm các hàm tiện ích trongviệc xuất led 7 đoạn và led ma trận, chi tiết các bạn có thể tham khảo trong thư viện source code.

8.2.1 Hàm tạo tín hiệu LATCH

Code:

void latch_spi(void){

unsigned char j;LATCH = 0; // create a rising clock to push data int o output registerfor (j = 0; j <10;j++);LATCH = 1;for (j = 0; j< 10; j++);

}

8.2.2 Hàm xuất led 7 đoạn và led ma trận

Với cùng giải thuật quét led như ở bài trên chỉ khác là trong chương trình ngắt của timer ta gọi hàm xuất trực tiếpdữ liệu ra các port của vi điều khiển thì ra gọi hàm dịch dữ liệu từ vi điều khiển ra các IC ngoại vi.Chi tiết hàmdịch như sau:

Code:

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

4 trong 39 5/26/2013 4:19 PM

Page 5: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

#13 (permalink)

void scan_led7_matrix(void){

SSPBUF = 0x00; // select column for led matrixwhile (!SSPSTATbits.BF);SSPBUF = 0x00; // green matrix's datawhile (!SSPSTATbits.BF);SSPBUF = 0x00; // red matrix's datawhile (!SSPSTATbits.BF);SSPBUF = column[index]; // select column for led 7 s egmentwhile (!SSPSTATbits.BF);SSPBUF = code[buffer[index]]; // led7's datawhile (!SSPSTATbits.BF);latch_spi();index = (index+1) % 8;

}

8.2.3 Hàm xóa dữ liệu trên led 7 đoạn và led ma trận

Code:

void clear_spi(void){

unsigned char i;for (i =0; i< 5; i++){

SSPBUF = 0xff;while (!SSPSTATbits.BF);

}latch_spi();

}

__________________BS

The Following User Says Thank You to bs135 For This Useful Post:

xuanbach05 (06-02-2013)

05-02-2013, 05:03 AM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 12 : Quét 2 led ma trận bằng SPI

Bài 12 : Quét 2 led ma trận bằng SPI

9.1 Kết nối phần cứng

Hình 9 1 Sơ đồ kết nối 2 led ma trận

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

5 trong 39 5/26/2013 4:19 PM

Page 6: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Ở trong bài này chúng ta sử dụng mạch rời có 2 led ma trận. Trong sơ đồ này đường dữ liệu(16 bits) được truyền theo giaothức SPI, dịch từng bit dữ liệu ra cho con IC TPIC595; còn đường để chọn hàng của led ma trận(8 bits) được kết nối trực tiếpvới PORTD của vi điều khiển PIC,nên cơ chế truyền ở đây là truyền theo kiểu song song.

9.2 Xây dựng chương trình

Tương tự đối với những bài quét led trên, chỉ khác ở đây chúng ta kết hợp cả phương pháp truyền song song và phương pháptruyền nối tiếp SPI.Với mạch rời được thiết kế 2 led ma trận sẽ tạo thêm điều kiện để thực hiện những hiệu ứng chạy chữ đadạng đẹp mắt, như những bảng quang báo hay thấy ở thực tế.

Code:

void scan_2_led_matrix(void){

PORTD = 0;SSPBUF = green_buffer[index]; // high byte green col orwhile (!SSPSTATbits.BF);SSPBUF = green_buffer[MAX + index]; // low byte gree n colorwhile (!SSPSTATbits.BF);SSPBUF = red_buffer[index]; // low byte red colorwhile (!SSPSTATbits.BF);SSPBUF = red_buffer[MAX + index]; // high byte red c olorwhile (!SSPSTATbits.BF);latch_spi();

PORTD = 1 << index;index = (index+1) % 8;

}

Trong thư viện source code, chúng tôi co demo mẫu hiệu ứng chữ chạy với hai màu xanh và đỏ, các bạn có thể tham khảotrong tài liệu đính kèm.

9.3 Code mẫu

Download tại đây

__________________BS

The Following User Says Thank You to bs135 For This Useful Post:

xuanbach05 (06-02-2013)

09-02-2013, 04:25 AM

bs135 Administrator

Bài 13 : Giao tiếp nối tiếp I2C và DS1307

Bài 13 : Giao tiếp nối tiếp I2C và DS1307

Mục đích:

Tìm hiểu chuẩn giao tiếp I2C và module I2C của PIC18F.Tìm hiểu IC thời gian thực DS1307.

Yêu cầu:

Viết chương trình hiển thị thông tin ngày giờ lên LCD.

10.1 Giới thiệu I2C

I2C là 1 chuẩn truyền nối tiếp theo mô hình Master – Slave. Một Master có thể giao tiếp với nhiều Slave. Muốn giao tiếp với slave nào, master phải gửi đúng đchỉ để tích cực slave đó rồi mới được phép ghi hoặc đọc dữ liệu từ slave.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

6 trong 39 5/26/2013 4:19 PM

Page 7: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Hình 10.1 : I2C interface

Bus I2C gồm 2 dây tín hiệu SCL (Serial Clock Line) và SDA (Serial Data Line) đều được kéo lên nguồn. Dữ liệu được truyền từng bit ở SDA theo từng clock củaSCL.

Hình 10.2 : I2C Protocol

Hình 11.2 là giao thức I2C. Trước khi truyền dữ liệu, ta cần khởi động I2C bằng cách kéo lần lượt SDA và SCL xuống mức thấp. Sau đó 8 bit dữ liệu sẽ được ra tự theo từng cạnh xuống ở chân SCL. Clock thứ 9 sẽ dành cho bit ACK. Bit ACK này có thể là do master gửi xuống hoặc do slave gửi về. Khi kết thúc giao tiếp ta phải stop nó bằng cách kéo 2 chân SCL và SDA lên mức cao.

10.2 I2C trong PIC18F4520

Module I2C trong PIC18F4520 hỗ trợ mode master và cả slave (7bit địa chỉ và 10bit địa chỉ). Trong tài liệu này chúng tôi chỉ giới thiệu chính mode master củaPIC18F4520 để giao tiếp với IC real time clock DS1307. File i2c.h định nghĩa 1 số hằng số và 4 hàm cơ bản của giao tiếp I2C.

Code:

#ifndef __I2C_H#define __I2C_H

/* PIC18 I2C peripheral library header */

/* SSPCON1 REGISTER */#define SSPENB 0x20 // Enable serial I2C port #define SLAVE_7 6 // I2C Slave 7bit mode#define SLAVE_10 7 // I2C Slave 10bit mode#define MASTER 8 // I2C Master mode

/*I2C interface*/void i2c_init(unsigned char sync_mode,unsigned char slew, unsigned char baudrate ); //void i2c_start(); //start conditionvoid i2c_stop(); //stop conditionvoid i2c_write_byte(unsigned char abyte);unsigned char i2c_read_byte(unsigned char ACK);#endif

10.2.1 Hàm i2c_init

Đầu tiên ta phải thiết lập chiều input cho 2 chân SCL và SDA bằng cách thiết lập 2 bit tương ứng trong thanh ghi TRISC là 1.PIC18F4520 sẽ đóng vai trò là master giữ clock, nội dung trong thanh ghi SSPADD sẽ được dùng cho bộ sinh clock. Tần số cho giao tiếp I2C sẽ đượctính theo công thức sau đây

Code:

f = Fosc/4*(SSPADD + 1)

Ta sẽ chọn tần số cho SCL là 100kHz và phải nạp vào thanh ghi này giá trị 49 (0x31) cho thạnh anh 20MHz.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

7 trong 39 5/26/2013 4:19 PM

Page 8: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Tiếp theo đó là chọn mode master cho PIC18F4520, thiết lập SSPM3:SSPM0 = 1000 và enable bit SSPEN trong thanh ghi SSPCON1.Code:

void i2c_init(unsigned char sync_mode,unsigned char baudrate ){SSPSTAT &= 0x3F; // power on state SSPCON1 = 0x00; // power on stateSSPCON2 = 0x00; // power on state SSPCON1 |= sync_mode; // select serial mode DDRCbits.RC3 = 1; //Set SCL to input DDRCbits.RC4 = 1; //Set SDA to input

SSPADD = baudrate;SSPCON1 |= SSPENB;//enable I2C}

10.2.2 Hàm i2c_start

Để khởi động I2C (Start condition) ta chỉ cần set bit Start Enable, SEN (SSPCON2<0>) và chờ cho đến khi quá trình này kết thúc. Quá trình khởi độngI2C gồm nhiều gian đoạn, kết thúc mỗi giai đoạn sẽ có các cờ báo hiệu.

Hình 10.3 : Khởi động I2C

Ban đầu 2 chân SDA và SCL ở mức cao. Khi SEN = 1, bộ sinh baudrate bắt đầu đếm và khi hết time out, chân SDA kéo xuống mức thấp, bit S(SSPSTAT<3>) bật lên 1 báo hiệu giai đoạn 1 của quá trình khởi động I2C kết thúc. Sau đó bộ sinh baudrate được load lại và bắt đầu đếm. Khi hếttime out, chân SCL sẽ được kéo xuống thấp, kết thúc quá trình khởi động I2C. Lúc này bit SEN được xóa bằng phần cứng và bit SSPIF được bật lên 1.Khi hiện thực code nếu viết kĩ ta có thể chờ từng giai đoạn, tuy nhiên module I2C được tích hợp sẵn trong PIC nên xác suất lỗi cũng rất thấp. Ta có thểlàm đơn giản hơn bằng cách set bit SEN lên và chờ cho đến khi SSPIF bật lên 1. Ta cần phải xóa SSPIF cho lần kiểm tra tiếp theo vì bit này không đượctự động xóa bằng phần cứng.

Code:

void i2c_wait(){

while(PIR1bits.SSPIF != 1){}; //wait SSPIF setPIR1bits.SSPIF = 0; //clear SSPIF

}void i2c_start(){

SSPCON2bits.SEN = 1; //set start enable biti2c_wait(); //wait SSPIF set

}

10.2.3 Hàm i2c_stop

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

8 trong 39 5/26/2013 4:19 PM

Page 9: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Hình 10.4 : Stop I2C

Quá trình kết thúc I2C được bắt đầu bằng cách set bit PEN (SSPCON2<2>). Cũng giống như quá trình khởi động, quá trình kết thúc gồm 2 giai đoạnchính và ở mỗi giai đoạn đều có bit báo hiệu nhưng ta có thể lập trình đơn giản bằng cách set bit PEN và chờ cho đến khi SSPIF được set lên 1.

Code:

void i2c_stop(){

SSPCON2bits.PEN = 1; //set stop enable biti2c_wait(); //wait SSPIF is set

}

10.2.4 Hàm i2c_write_byte

Việc gửi 1 byte dữ liệu từ master xuống slave được bắt đầu khi có lệnh gán vào thanh ghi SSPBUF. Ngay lúc này cờ BF (Buffer Full) sẽ bật lên 1. Quátrình gửi dữ liệu bắt đầu theo từng xung clock ở chân SCL.Sau 8 clock, 8 bit dữ liệu trong thanh ghi SSPBUF được shift hết và cờ BF bật xuống 0. Master sẽ thả chân SDA để slave có thể gửi tín hiệu ACK vềmaster. Nếu nhận được ACK, bit ACKSTAT sẽ được xóa, ngược lại bit này sẽ được bật lên 1. Giá trị ACK được lưu trong bit ACKDT.Quá trình gửi ACK từ slave lên master được thực hiện trong clock thứ 9 của SCL và sau đó bit SSPIF được set lên 1.Người lập trình có thể check qua các cờ BF, ACKSTAT và sau cùng là SSPIF để kiểm tra lỗi. Đoạn code dưới đây chỉ kiểm tra có nhận được ACK haykhông chứ chưa kiểm tra ACK đúng hay sai.

Code:

void i2c_write_byte(unsigned char abyte){

SSPBUF = abyte;//wait BF is setwhile(SSPSTATbits.BF != 0){}//wait ACK received, ACKSTAT is set

while(SSPCON2bits.ACKSTAT != 0){}i2c_wait();

}

Tuy nhiên trong 1 vài ứng dụng đơn giản ta có thể viết như sau:Code:

void i2c_write_byte(unsigned char abyte){

SSPBUF = abyte; //byte to sendi2c_wait(); //wait SSPIF is set

}

10.2.5 Hàm i2c_read_byte

Hàm này dùng để đọc 1 byte dữ liệu từ slave và. Khi bit RCEN (SSPCON2<3>) được set lên 1, dữ liệu từ slave bắt đầu gửi vào thanh ghi SSPBUF. Sau8 clock dữ liệu sẽ được shift đủ vào thanh ghi SSPBUF và cờ BF sẽ được bật lên 1. Đồng thời cờ SSPIF cũng được set và RCEN được clear bằng phầncứng.Khi đọc xong, cờ SSPIF sẽ được xóa, ta cần set ACKEN lên 1 (SSPCON2<4>) để gửi ACK về cho slave. Bit ACK là 0 hay 1 được quy định trong bitACKDT (SSPCON2<5>). Khi gửi xong ACK ở clock thứ 9, cờ SSPIF sẽ được bật lên lại.

Code:

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

9 trong 39 5/26/2013 4:19 PM

Page 10: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

unsigned char i2c_read_byte(unsigned char ack){

SSPCON2bits.RCEN = 1; //enable receivei2c_wait(); //wait SSPIF is set

SSPCON2bits.ACKDT = ack; //set ACK valuei2c_wait(); //wait SSPIF is set

SSPCON2bits.ACKEN = 1; //enable ACK feedbackreturn SSPBUF;

}

10.3 Real Time Clock DS1307

DS1307 là IC thời gian thực (Real time clock) đếm giờ, phút, giây, tháng, ngày của tháng, ngày của tuần, năm kể cả năm nhuận (đến năm 2100).56 byte Ram để lưu trữ dữ liệu, nhưng dữ liệu không bị mất khi tắt nguồn.Sử dụng 2 dây tín hiệu để truyền dữ liệu theo giao thức I2C.Có thể lập trình được để xuất tín hiệu xung vuông.Tự động phát hiện ra nguồn cung cấp bị lỗi (ngắt nguồn) và chuyển qua mạch bảo vệ sử dùng nguồn pin dự trữ.

10.3.1 Nguyên lý hoạt động

DS1307 hoạt động như một slaver trên bus dữ liệu nối tiếp. Để truy xuất nội dung ta phải thiết lập một điều kiện Start và cung cấp mã nhận dạng củaIC (Device Identification Code) theo sau bởi thanh ghi địa chỉ. Các thanh ghi theo sau được truy xuất tuần tự cho đến khi gặp tín hiệu Stop.Khi VCC = 1.25Vbat thì DS1307 sẽ kết thúc việc truy xuất và reset lại bộ đếm địa chỉ. Các Input sẽ không được nhận ra tại thời điểm này để ngănngừa một số lượng lớn dữ liệu được ghi tới DS1307 từ hệ thống bên ngoài. Khi VCC < Vbat thì ic này sẽ chuyển sang mode sử dụng pin dự trữ. Khinguồn chính được bật lên thì IC này sẽ chuyển từ dùng nguồn pin sang dùng nguồn chính. Hình sau mô tả những phần chính của DS1307.

Hình 10.5 : Sơ đồ khối DS1307

10.3.2 Các tín hiệu Input và Output

VCC, GND : Nguồn DC được cung cấp cho IC qua những chân này. Khi gắn vào nguồn 5V thì IC này có thể đọc ghi bình thường. Nhưng khi nguồn giảmxuống còn 3V thì việc đọc ghi sẽ không được phép. Tuy nhiên, các chức năng của timer vẫn tiếp tục với nguồn cung cấp thấp. Khi Vcc giảm xuống dướiVBAT thì RAM và timekeeper được chuyển qua sử dụng nguồn cung cấp tại VBAT.VBAT : Cung cấp nguồn dữ trữ 3V. Để hoạt động ở chế độ sử dụng nguồn Vbat thì 2.0V < Vbat < 3.5V. Khi VCC gần bằng 1.25VBAT thì chúng ta sẽ

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

10 trong 39 5/26/2013 4:19 PM

Page 11: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

không được phép truy xuất vào RTC (Real time clock) và Ram bên trong của IC.

SCL (Serial Clock Input) : SCL được dùng để đồng bộ dữ liệu trên đường truyền nối tiếp.

SDA (Serial Data Input/Output) : SDA là chân I/O. SDA là chân Open drain nên cần có điện trở kéo lên ở bên ngoài.

SQW/OUT (Square Wave/Output Driver) : Khi được bật lên, thì bit SQWE set lên 1, và chân này sẽ output ra 1 trong 4 tần số sóng vuông là 1hz, 4khz,8khz, 32khz. Chân này cũng là chân Open drain nên cũng yêu cầu có điện trở kéo lên nguồn ở bên ngoài. SQW/OUT sẽ hoạt động khi có nguồn cungcấp vào cho dù đó là nguồn VCC hay là VBAT.

X1, X2 : Kết nối với thạch anh 32.768Khz. Mạch tạo xung bên trong được thiết kế để hoạt động với thạch anh và tụ CL = 12.5 pF.

10.3.3 RTC và sơ đồ địa chỉ Ram

Sơ đồ địa chỉ của RTC và các thanh ghi Ram của DS1307 như ở hình dưới. Các thanh ghi RTC được định địa chỉ từ 00h đến 07h. Các thanh ghi Ramđược định địa chỉ tiếp theo sau đó và từ 08h đến 3fh. Trong khi truy suất nhiều byte và khi con trỏ địa chỉ chỉ tới ô 3fh, vị trí cuối của vùng nhớ Ram,thì nó sẽ quay lại địa chỉ 00h để truy xuất tiếp.

Hình 10.6 : RTC và sơ đồ RAM

10.3.4 Thông tin thời gian và lịch

Thông tin thời gian và lịch được chứa trong trong các thanh ghi tương ứng. Các thanh ghi RTC như ở hình trên. Thời gian và lịch được set hoặc khởi tạobằng cách ghi ra các byte thanh khi tương ứng. Nội dung của các thanh ghi thời gian và lịch được định dạng theo kiểu BCD. Bit 7 của thanh ghi 0 làclock halt bit (CH). Khi bít này được set lên 1 thì mạch dao động sẽ bị ẩn không được sử dụng nữa, khi clear xuống 0 thì mạch dao động sẽ được kíchhoạt trở lại.

DS1307 có thể chạy ở chế độ 12h hay 24h. Bít thứ 6 của thanh ghi hours được định nghĩa để set xem sử dụng IC này ở chế độ nào. Khi bit này bằng 1thì chế độ 12h được chọn. Trong chế độ 12h thì bit 5 chỉ AM/PM (PM khi bit này là 1). Trong chế độ 24h, thì bít 5 là bít thứ 2 của 10hour (20:23).

Hình 10.7 : Định dạng dữ liệu

10.3.5 Ghi dữ liệu vào DS1307

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

11 trong 39 5/26/2013 4:19 PM

Page 12: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Hình 10.8 : Ghi dữ liệu vào DS1307Đây là quá trình truyền dữ liệu từ master xuống slave. Khi master gửi xong 1 byte, slave sẽ gửi lại bit ACK. Quá trình giao tiếp như sau:

Master gửi tín hiệu Start.Master gửi địa chỉ của DS1307 (1101 000) và bit R/W, trong trường hợp này là 0. Byte đầu tiên mà master gửi xuống sau khi start là D0.Master gửi địa chỉ pointer dữ liệu cần ghi, chẳng hạn là 0x00 (register pointer, word address)Master gửi các byte data cần ghi.Master gửi tín hiện stop.

Code hiện thực cho quá trình này như sauCode:

void rtc_write(unsigned char *buff){

i2c_start();i2c_write_byte(0xD0); //Address + Write biti2c_write_byte(0x00); //Pointeri2c_write_byte (*(buff+0)); //Secondi2c_write_byte (*(buff+1)); //Minutei2c_write_byte (*(buff+2)); //Houri2c_write_byte (*(buff+3)); //Dayi2c_write_byte (*(buff+4)); //Datei2c_write_byte (*(buff+5)); //Monthi2c_write_byte (*(buff+6)); //Yeari2c_stop();

}

buff là 1 mảng có 7 phần tử, tương ứng với các giá trị giây, phút, giờ, thứ, ngày, tháng và năm.

10.3.6 Đọc dữ liệu từ DS1307

Hình 10.9 : Đọc dữ liệu từ DS1307Đây là quá trình truyền dữ liệu từ slave lên master. Như đã trình bày ở phần trước, khi gửi nhận từng byte, sẽ có bit ACK đi kèm ngoại trừ byte cuốicùng trước khi stop.Để có thể đọc chính xác giá trị mong muốn, thông thường ta phải ghi vào thanh ghi địa con trỏ dữ liệu (register pointer). Quá trình này chính là trìnhtruyền dữ liệu từ master xuống slave nên R/W bit sẽ là 0. Sau khi ghi dữ liệu và register pointer xong, quá trình đọc dữ liệu mới bắt đầu, và bit R/W sẽlà 1.Từng bước đọc dữ liệu từ DS1307 như sau:

Master gửi tín hiệu start.Master gửi địa chỉ DS1307 + R/W = 0 : 0xD0.Master gửi byte ghi vào register pointer : 0x00.Master gửi tín hiệu startMaster gửi địa chỉ DS1307 + R/W = 1 : 0xD1.Master đọc các byte dữ liệu và gửi bit ACK. Byte cuối cùng trước khi stop, master gửi bit NACK.Master gửi tín hiện stop.

Code hiện thực cho quá trình này như sauCode:

void rtc_read(unsigned char * buff){

//send address to slave and reset pointeri2c_start();i2c_write_byte(0xD0); //Address + Write biti2c_write_byte(0x00); //Pointer

i2c_start(); //Restarti2c_write_byte(0xD0); //Address + Read bit*(buff+0)=i2c_read_byte(ACK); // Second*(buff+1)= i2c_read_byte(ACK); // Minute*(buff+2)= i2c_read_byte(ACK); // Hour*(buff+3)= i2c_read_byte(ACK); // Day

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

12 trong 39 5/26/2013 4:19 PM

Page 13: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

#15 (permalink)

*(buff+4)= i2c_read_byte(ACK); // Date*(buff+5)= i2c_read_byte(ACK); // Month*(buff+6)= i2c_read_byte(ACK); // Year

i2c_stop();}

10.4 Xây dựng chương trình

Ở đây sẽ giới thiệu cấu trúc chương trình hiển thị thông tin ngày tháng năm, giờ phút giây của DS1307 lên LCD. Chương trình gồm 3 module 9 là I2C, RTC và

Hình 10.10 : Cấu trúc chương trìnhChi tiết chương trình được hiện thực trong thư mục Bai11_I2C. Để chạy được chương trình bạn cần bật 2 switch của RTC (SW4) lên ON, bật nguồn của LCD (SWvà tắt led ở PortB (SW1).

Hình 10.11 : Chương trình DS1307 trên BKIT PIC

10.5 Code mẫu

Download tại đây

__________________BS

10-02-2013, 10:48 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

13 trong 39 5/26/2013 4:19 PM

Page 14: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Bài 14 : Analog to Digital Converter ADC

Bài 14 : Analog to Digital Converter ADC

Mục đích:

Tìm hiểu module ADC của PIC18F.

Yêu cầu:

Viết chương trình hiển thị giá trị ADC ở chân AN0 lên LCD.

11.1 Giới thiệu

Vi điều khiển chỉ có thể xử lý được tín hiệu số rời rạc (digital signal), chúng không thể xử lý được các tín hiệu tương tự (analogsignal). Bộ chuyển đổi tín hiệu tương tự sang số (analog to digital converter) hay còn gọi là ADC, sẽ chuyển điện áp tương tự(analog voltage hay analog signal) sang dạng số rời rạc (digital number). Vi xử lý sẽ biểu diễn tín hiệu điện áp tương tự thành 1số nguyên (non-fractional number) và sẽ xử lý trên số nguyên này.

Hình 11.1: Analog to Digital ConverterTheo ví dụ ở trên, điện áp 2.343volt sẽ được chuyển đổi thành số nguyên 87. Người lập trình có thể dùng số 87 này để biểu diễncho giá trị điện áp ngõ vào 2.343 volt. Việc vi điều khiển xử lý trên số 87 sẽ đạt hiệu quả cao hơn, vì nó là 1 số nguyên.

11.2 Nguyên lý chuyển đổi ADC

Hình 11.2 : Chuyển đổi ADCQuá trình chuyển đổi ADC gồm 3 giai đoạn:

Giai đoạn 1 : Nạp điện cho tụ ở chân ADC (Holding Capacitor). Giai đoạn này tốn 1 khoảng thời gian được gọi là Acquisitiontime (TACQ). Trong vi điều khiển PIC, thời gian này có thể được cấu hình bằng tay hoặc tự động. Khi chọn cấu hình bằngtay, người lập trình phải tự tính toán thời gian delay để có thể nạp đầy tụ trước khi ban hành lệnh chuyển đổi. Khi chọn cấuhình tự động, vi điều khiển sẽ đảm bảo là sau khi ban hành lệnh chuyển đổi 1 khoảng TACQ, quá trình chuyển đổi mới bắtđầu. Thời gian này là 1 hằng số và tùy thuộc vào vi điều khiển. Chúng ta cần đọc kĩ datasheet của nó để xác định cho đúng.Giai đoạn 2 : Ngắt kết nối với tụ Holding Capacitor bằng 1 lệnh SLEEP. Quá trình này được thực hiện tự động bởi vi điềukhiển, người lập trình không cần phải quan tâm. Thời gian chuyển đổi phụ thuộc vào độ phân giải của giá trị ADC (8bit,10bit hay 13 bit) và clock cấp cho module ADC. Khi lập trình, chúng ta thường không quan tâm đến thời gian này vì khichuyển đổi xong, vi điều khiển sẽ set cờ báo hiệu. Người lập trình chỉ cần polling xét cờ này hoặc sử dụng ngắt để lấy giá trịchuyển đổi.Giai đoạn 3 : Xả tụ Holding Capacitor. Giai đoạn này chỉ chiếm 1 khoảng thời gian nhỏ và nó được thực hiện tự động bởi viđiều khiển. Giai đoạn này xảy ra sau khi cờ báo hiệu chuyển đổi hoàn tất.

Để có thể bắt đầu tiếp việc chuyển đổi lần thứ 2, vi điều khiển sẽ cần phải chờ thêm 1 khoảng thời gian xả tụ và acquisitiontime. Nếu không chờ đúng thời gian này, quá trình chuyển đổi bắt đầu sớm hơn, kết quả thu được có thể không còn chínhxác nữa.

11.3 ADC trong PIC18F

Đối với dòng chip PIC 40/44 chân có 13 kênh ADC, dòng 28 chân thì có 10 kênh ADC. Module ADC sẽ chuyển đổi tín hiệu tươngtự thành tín hiệu số 10 bit. Module ADC trong PIC có 5 thanh ghi:

ADRESH : Thanh ghi kết quả, chứa phần bit cao.ADRESL: Thanh ghi kết quả, chứa phần bit thấp.ADCON0, ADCON1, ADCON2 : Các thanh ghi điều khiển.

Thanh ghi ADCON0

Hình 11.3 : Thanh ghi ADCON0

Bit 7-6 : Không sử dụng.Bit 5-2 CHS3-CHS0 : Lựa chọn kênh Analog.

0000 : Kênh 0 (AN0)0001 : Kênh 1 (AN1)0010 : Kênh 2 (AN2)1101 : Kênh 11 (AN11)1100 : Kênh 12 (AN12)1101,1110,1111 : Không sử dụng.

Bit 1 GO/DONE : Bit trạng thái của quá trình chuyển đổi khi ADON = 1.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

14 trong 39 5/26/2013 4:19 PM

Page 15: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

1 : Đang chuyển đổi A/D.0 : Chuyển đổi hoàn tất.

Bit 0 ADON : A/D On bit

1 : Cho phép chuyển đổi.0 : Tắt chức năng chuyển đổi.

Thanh ghi ADCON1

Hình 11.4 : Thanh ghi ADCON1Bit 7 – 6 : Không sử dụng.Bit 5 : VCFG1 Voltage Reference Configuration bit (bit cấu hình điện áp tham khảo VREF-)

1 : Điện áp tham khảo VREF- là điện áp ở chân AN20 : Điện áp thao khảo VREF- = VSS

Bit 4 : VCFG0 Voltage Reference Configuration bit (bit cấn hình điện áp tham khảo VREF+)

1 : Điện áp tham khảo VREF+ là điện áp ở chân AN30 : Điện áp tham khảo VREF+ là VDD

Bit 3-0 A/D Port Configuration Control bits : Cấu hình chân là Analog hay Digital

Thanh ghi ADCON2

Hình 11.5 : Thanh ghi ADCON2Bit 7 ADFM : Định dạng kết quả trong 2 thanh ghi ADRESH và ADRESL

1 : Canh phải

0 : Canh trái

Bit 6 : Không sử dụngBit 5-3 : A/D Acquisition Time Select bit : Bit chọn thời gian nạp cho tụ Holding Capacitor.

111 : 20 TAD 110 : 16 TAD 101 : 12 TAD 100 : 8 TAD011 : 6 TAD 010 : 4 TAD 001 : 2 TAD 000 : 0 TAD

TAD là thời gian để chuyển đổi 1 bit ADC, phụ thuộc vào clock được lựa chọn bên dưới. Thời gian để nạp cho tụ Holding Capacitorcố định là 2.4us, sau khi chọn clock cho module ADC, ta sẽ phải tính toán để chọn hệ số nhân với TAD

Lưu ý trong trường hợp 000, đây là chế độ lập trình bằng tay cho thời gian Acquisition Time, người lập trình phải tự tạo 1 khoảngthời gian delay cho quá trình nạp tụ Holding Capacitor.Bit 2-0 : A/D Conversion Clock Selection bit : Bit chọn clock cho bộ chuyển đổi A/D

111 : FRC 110 : FOSC/64 101 : FOSC/16 100 : FOSC/4011 : FRC 010 : FOSC/32 001 : FOSC/8 000 : FOSC/2

Nếu ta chọn là 000 thì TAD = 2 TOSC = 2/FOSC, FOSC là chu kì lệnh, bằng ¼ tần số dao động.

11.4 Cấu hình ADC trong PIC18F

Việc cấu hình module ADC trong PIC18F đi theo trình tự sau:

Cấu hình chân A/D (số kênh AD, chiều của chân AD là input), điện áp tham khảo (ADCON1)Chọn kênh A/D (ADCON0)Chọn thời gian acquisition time (ADCON2)Chọn clock.Bật chế độ AD (bit ADON trong ADCON0).

Nếu chọn lựa chế độ acquisition time là tự động, bạn chỉ cần set bit GO_DONE để bắt đầu quá trình chuyển đổi và polling bit nàyđể chờ cho đến khi quá trình chuyển đổi hoàn tất.

Nếu acquisition time được chọn là chế độ chỉnh bằng tay (manual mode), bạn phải tự viết delay để chờ, sau đó mới được phép setbit GO_DONE.

11.5 Hiện thực chương trình

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

15 trong 39 5/26/2013 4:19 PM

Page 16: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Hình 11.6 : Kiến trúc chương trình ADC

11.5.1 Hàm init_adc()

Hàm này dùng để khởi tạo ban đầu cho module ADC, được hiện thực đúng theo trình tự cấu hình ADC trong PIC 18F.Ở mạch BKIT PIC, chỉ có 1 kênh ADC nối với chân AN0, bit 0 của PortA.

Ở thanh ghi ADCON1, ta sẽ lần lượt chọn điện áp tham khảo là VSS và VDD, các bit 5,4 set là 0.

Cấu hình chỉ dùng 1 kênh AD ở chân AN0, bit 3:0 PCFG3:PCFG0 = 1110, ADCON1 = 0x0E. Cấu hình chiều input chochân ADC này.

Chọn kênh AD0 để chuyển đổi bằng cách thiết lập CHS3:CHS0 = 0000, ADCON0 = 0x00.

Chọn clock là FOSC /2 (ADCS2:ADCS0 = 000), lúc đó TAD = 2TOSC = 2/(5MHz) = 2/(510^6) (s).

Thời gian acquisition time là hằng số 2.4us = 2.4 10^-6 (s).Ta phải thỏa mãn được 2.4 10^-6 <= 2k/(510^6) => k >= 1.2Ta sẽ chọn k = 2 AQCT2:AQCT0 = 001.Như vậy ADCON2 = 0x04.Bật bit ADON ở thanh ghi ADCON0.

Code:

void init_adc(){

TRISA = 0x01; //input for analog pinADCON1 = 0x0E; //config ADC pinsADCON0 = 0x00; //select AN0ADCON2 = 0x04; //select acquisition timeADCON0bits.ADON = 1;//enable ADC

}

11.5.2 Hàm get_adc_value

Sau khi khởi tạo xong module ADC, ta có thể lấy kết quả bất cứ lúc nào. Trước tiên ta sẽ set bit GO_DONE lên 1 đểbắt đầu quá trình chuyển đổi và chờ cho nó xuống 0, việc chuyển đổi hoàn tất, kết quả sẽ được lưu trong 2 thanh ghiADRESH:ADRESL (chế độ canh trái).

Code:

int get_adc_value(){

int result = 0;ADCON0bits.GO_DONE = 1; //start conversionwhile(ADCON0bits.GO_DONE == 1){} //pollingresult = ADRESH;result = (result<<2) + (ADRESL>>6);return result;

}

Nếu người dùng chỉ cần 8 bit thì có thể sử dụng giá trị trong thanh ghi ADRESH là đủ.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

16 trong 39 5/26/2013 4:19 PM

Page 17: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

#16 (permalink)

Hình 11.7 : Chương trình ADC trên BKIT PIC

11.6 Code mẫu

Download tại đây

__________________BS

The Following User Says Thank You to bs135 For This Useful Post:

xuanbach05 (11-02-2013)

15-02-2013, 05:57 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 15 : Điều chế xung PWM

Bài 15 : Điều chế xung PWM

Mục đích:

Tìm hiểu module CCP1 của PIC18F, thiết lập chế độ hoạt động PWM.

Yêu cầu:

Viết chương trình điều khiển tốc độ động cơ, hiển thị tốc độ ra màn hình LCD.

12.1 Khái niệm PWM

PWM viết tắt của từ Pulse Width Modulation. PWM được sử dụng nhiều trong hệ thống điều khiển tự động ngày nay. Nó đượcứng dụng trong điều khiển tốc độ động cơ, độ sáng tối của led, màn hình LCD, pha màu cho bang quang báo, sử dụng trongcác thuật toán điều khiển vận tốc cho Robot như PI, PD, PID …Hiểu đơn giản PWM hoạt động như một công tác đóng mở rất nhiều lần trong 1 giây. Nếu tần số đóng mở càng nhanh thì điệnáp cấp trung bình càng lớn.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

17 trong 39 5/26/2013 4:19 PM

Page 18: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Một số khái niệm cơ bản của PWM :

Tần số (Hz, Khz…).Chu kỳ T, thời gian xung mức cao TH + thời gian xung mức thấp TL.Duty Cycle: tỉ lệ thời gian xung mức và thời gian xung mức thấp.

Như hình trên ta có Duty Cycle lần lượt là 0%, 25%, 50%, 75%, 100%.Một số công thức :

Khi đó nếu TOn = 0 thì VoltOutput = 0 (V) còn TOn = TTotal thì VoltOutput = VoltInput .

12.2 PWM trong PIC18F4520

PIC18F4520 có 2 module CCP. Ở đây chúng tôi giới thiệu module CCP1. Module này ngoài chức năng PWM thông thường, nócòn có chức năng Enhanced PWM dùng để điều khiển một số loại mạch cầu H thông dụng.Nguyên lý hoạt động chung của các module PWM tích hợp sẵn trong vi điều khiển là nó sẽ sử dụng 1 bộ timer để đếm. Khi giátrị đếm của timer bằng với Chu kì hoặc Duty Cycle thì ngõ ra sẽ thay đổi. Hình ở dưới đây minh họa cách hoạt động củamodule PWM trong PIC18F4520, nó sử dụng timer2 cho bộ đếm.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

18 trong 39 5/26/2013 4:19 PM

Page 19: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Hình 12.1 : Nguyên lý hoặt động của PWM

Trình tự thiết lập PWM trong PIC18F4520 như sau:

12.2.1 Thiết lập chu kì PWM

Chu kì của module CCP1 được tính như sau :PWM Period = (PR2 + 1)*4*TOSC*(TMR2 Prescaller)Trong đó TOSC = 1/FOSC, FOSC = 20MHz nếu sử dụng thạch anh ngoài.TMR2 Prescaller được xác định trong thanh ghi T2CON. Ở chế độ mặc định ban đầu, TMR2 Prescaller = 1.

Trên thực tế, người ta dùng thuật ngữ tần số PWM, là nghịch đảo của chu kì :

PWM Frequence = FOSC/ [ (PR2+1) * 4 * (TMR2 Prescaller) ]Tần số để điều khiển PWM tùy thuộc vào từng loại thiết bị. Đối với động cơ, tần số PWM phải phù hợp với độ đápứng của driver điều khiển động cơ.Trong mạch BKIT PIC, chúng tôi chọn tần số là 2 kHz. Giả sử ta chọn TMR2 Prescaller là 16 (T2CKPS1 = 1), thìgiá trị của PR2 làPR2 = 20MHz/ (4 * 16 * 2KHz) - 1 ~ 155

12.2.2 Thiết lập PWM Duty Cycle

Duty Cycle của CCP1 được thiết lập trong 2 thanh ghi CCPR1L (8bit) và 2 bit DC1B1:0 trong thanh ghi CCP1CON.Tuy nhiên đối với động cơ nhỏ thì với 8 bit là đủ, ta có thể để mặc định DC1B1:0 = 00 ngay khi khởi tạo. Giá trịcủa CCPR1L càng cao thì duty cycle càng lớn, và như vậy điện áp ngõ ra của CCP1 (RC2) càng cao.

Sau khi đã thiết lập xong 2 thông số trên, các bước còn lại là thiết lập chiều output cho chân RC2, cho phéptimer2 đếm bằng cách set bit TMR2ON lên 1, và cấu hình CCP1CON là chế độ Single PWM.

12.3 Xây dựng chương trình

Kiến trúc chương trình gồm có 2 module chính PWM và LCD.

Hình 12.2 : Kiến trúc chương trình PWM

Module PWM gồm có 2 file pwm.h khai báo các interface và pwm.c để hiện thực các interface đó. Interface trong pwm.h nhưsau:

Code:

#ifndef _PWM_H_#define _PWM_H_#include <P18F4520.h>void init_pwm();void set_DC(unsigned char duty_cycle);#endif

12.3.1 Hàm init_pwm

Hàm này hiện thực quá trình khởi động cho module PWM. Trước tiên là cấu hình prescaller cho timer2, nạp giá trịPWM Period và chọn chế độ PWM trong thanh ghi CCP1CON.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

19 trong 39 5/26/2013 4:19 PM

Page 20: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

#17 (permalink)

Code:

void init_pwm(){

T2CONbits.TMR2ON = 0; //turn off timer2

T2CONbits.T2CKPS0 = 0;T2CONbits.T2CKPS1 = 1; //prescaler 1:16PR2 = 155; //PWM period

CCP1CONbits.DC1B0 = 0; //PWM duty cycleCCP1CONbits.DC1B1 = 0; //2 bits LSB CCPR1L = 0x00; //8bits MSB

CCP1CONbits.P1M0 = 0; //PWM single modeCCP1CONbits.P1M1 = 0;CCP1CONbits.CCP1M0 = 0; //select PWM functionCCP1CONbits.CCP1M1 = 0;CCP1CONbits.CCP1M2 = 1;CCP1CONbits.CCP1M3 = 1;

TRISCbits.TRISC2 = 0; //config RC2 outputT2CONbits.TMR2ON = 1; //start timer2

}

12.3.2 Hàm set_DC

Hàm này chỉ đơn giản là thiết lập duty cycle trong thanh ghi CCPR1L. Giá trị trong thanh ghi này càng cao thì ápra ở chân RC2 càng cao, giá trị tối đa là 255 tương ứng với khoảng 5V.

Code:

void set_DC(unsigned char duty_cycle){

CCPR1L = duty_cycle;}

Chương trình demo cho phần này được hiện thực trong thư mục Bai13_PWM. Hàm main sẽ tăng dần duty cyclelên và động cơ sẽ quay nhanh dần. Giá trị của duty cycle (hay tốc độ của động cơ) sẽ được hiển thị ra LCD.

12.4 Code mẫu

Download tại đây

__________________BS

15-02-2013, 06:15 PM

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

20 trong 39 5/26/2013 4:19 PM

Page 21: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 16 : Giao tiếp UART RS232

Bài 16 : Giao tiếp UART RS232

13.1 Nguyên lý giao tiếp UART

Uart RS232 là chuẩn giao tiếp khá phổ biến và được hỗ trợ ở hầu hết các dòng vi điều khiển vì khoảng cách xa và chi phíthấp. Dòng 8051 hỗ trợ 1 kênh giao tiếp uart.

Dữ liệu được truyền đi trên chân TX gồm 1 start bit (mức 0), data và 1 stop bit (mức 1).

Tốc độ truyền : đơn vị bit per second (bps) còn gọi là Baud (số lần thay đổi tín hiệu trong 1 giây – thường sử dụng chomodem). Đối với đường truyền thì Baud và bps là như nhau.

UART là phương thức truyền nhận bất đồng bộ. nghĩa là bên nhận và bên phát không cần phải có chung tốc độ xung clock (vídụ : xung clock của vi điều khiển khác xung clock của máy tính) . Khi đó bên truyền muốn truyền dữ liệu sẽ gửi start bit (bit0) để báo cho bên thu biết để bắt đầu nhận dữ liệu và khi truyền xong dữ liệu thì stop bit (bit 1) sẽ được gửi để báo cho bênthu biết kết thúc quá trình truyền.

Khi có start bit thì cả hai bên sẽ dùng chung 1 xung clock (có thể sai khác một ít) với độ rộng 1 tín hiệu (0 hoặc 1) được quyđịnh bởi baud rate, ví dụ baud rate = 9600bps nghĩa là độ rộng của tín hiệu 0(hoặc 1) là 1/9600 = 104 ms và khi phát thìbên phát sẽ dùng baud rate chính xác (ví dụ 9600bps) còn bên thu có thể dùng baud rate sai lêch 1 ít(9800bps chẳng hạn).Truyền bất đồng bộ sẽ truyển theo từng frame và mỗi frame có cấu trúc như sau:

Ngoài ra trong frame truyền có thể có thêm bit odd parity (bit lẻ) hoặc even parity (bit chẵn) để kiểm tra lỗi trong quá trìnhtruyền. Bit parity này có đặc điểm nếu sử dụng odd parity thì số các bit 1 + odd parity bit sẽ ra 1 số lẻ còn nếu sử dụng evenparity thì số các bit 1 + even parity bit sẽ ra 1 số chẵn.

13.2 Giao tiếp UART với máy tính

Để giao tiếp COM giữa vi điều khiển và máy tính, ta kết nối mạch theo sơ đồ như sau:

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

21 trong 39 5/26/2013 4:19 PM

Page 22: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Hình 13.1 : Kết nối máy tính và vi điều khiểnDo mức điện áp của tín hiệu logic 1/0 ở cổng COM của máy tính khác với vi điều khiển, nên MAX 232 có tác dụng chuẩn hoámức điện áp giữa máy tính và điều khiển trong quá trình truyền nhận dữ liệu. Nếu giao tiếp trực tiếp giữa 2 vi điều khiển, takhông cần phải sử dụng MAX 232.

13.3 UART trong PIC18F

Trong phần này xin giới thiệu các bước thiết lập việc truyền 1 byte UART, việc cấu hình nhận UART cũng tương tự như truyền.Trình tự các bước như sau :

Nạp giá trị vào 2 thanh ghi BRGH: BRG để thiết lập tốc độ truyền theo công thức Baudrate = Fosc/ (64 * ([BRGH :BRG] + 1)).Enable serial port bằng cách clear bit SYNC và set bit SPENNếu muốn thiết lập interrupt, thì set thêm TXIE, GIE và PEIE.Set bit TXEN để cho phép truyền.Nạp dữ liệu vào thanh ghi TXREG.Khi truyền xong cờ TXIF sẽ bật lên 1, ta sẽ kiểm tra cờ này trước khi truyền dữ liệu mới.

Hiện thực bằng code như sau :Code:

void init_uart_transmit(){

//step 1 : Select baurateTXSTAbits.BRGH = 0;BAUDCONbits.BRG16 = 1;SPBRGH = 0;SPBRG = 25; //9600

//step 2 : enable ASYNTXSTAbits.SYNC = 0;RCSTAbits.SPEN = 1;

//step 3 : enable uart transmission interruptPIE1bits.TXIE = 1;PIR1bits.TXIF = 0;INTCONbits.GIE = 1;INTCONbits.PEIE = 1;

//step 4 : disable bit 9TXSTAbits.TX9 = 0;

//step 5 : enable transmissionTXSTAbits.TXEN = 1;

}

Sau khi enable việc truyền, ta chỉ cần ghi dữ liệu và thanh ghi TXREG và kiểm tra cờ TXIF bật lên:Code:

void uart_transmit(unsigned char data){

TXREG = data;while(PIR1bits.TXIF == 1){}

}

13.4 Kiểm tra truyền nhận UART

Để kiểm tra việc truyền nhận uart có đúng hay không ta thường dùng 1 số ứng dụng hyper terminal để kiểm tra. Lúc nàymáy tính của chúng ta sẽ là đối tượng dùng để giao tiếp với BKIT PIC. Trong đĩa CD này có phần mềm hyper terminal kháthông dụng chứa trong thư mục Terminal, bạn chỉ cần double click vào file Terminal.exe là khởi động được chương trình.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

22 trong 39 5/26/2013 4:19 PM

Page 23: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

#18 (permalink)

Hình 13.2 : Hyper TerminalCông việc còn lại là cấu hình cho cổng COM truyền nhận uart cho tương thích với giao thức truyền nhận của board 89. Cácthông số thông thường là Baud rate 9600, Data bit 8bit, không có Parity (chọn none) và 1 Stop bit. Nhấn nút Connect để kếtnối. Kể từ đây nếu board 89 có gửi dữ liệu lên, dữ liệu này sẽ nằm trong phần Receive. Ngược lại, muốn gửi dữ liệu xuốngboard 89 ta gõ vào textbox và ấn Send.

13.5 Download

Code mẫuPhần mềm Terminal

__________________BS

15-02-2013, 06:35 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 17 : Giao tiếp với bàn phím PS2

Bài 17 : Giao tiếp với bàn phím PS2

13.6 Ngắt ngoài

13.6.1 Giới thiệu ngắt ngoài

Ngắt ngoài trên vi điều khiển thường là một chân vào có khả năng phát hiện sự thay đổi tín hiệu bên ngoài. Cóthể chia ngắt thành hai loại : Ngắt cạnh và ngắt mức.Ngắt cạnh có hai loại: ngắt cạnh lên xảy ra khi có sự chuyển tín hiệu từ mức thấp lên mức cao ở chân ngắt ngoài.Tương tự ngắt cạnh xuống xảy ra khi có sự chuyển tín hiệu từ mức cao xuống mức thấp.Ngắt mức cũng có hai loại: ngắt mức cao và mức thấp. Ngắt mức cao (thấp) xảy ra khi tín hiệu tại chân ngắtngoài ở mức cao (thấp) trong tối thiểu 1 chu kì.Trong vi điều khiển PIC chí có chế độ ngắt cạnh(lên/xuống) không tồn tại chế độ ngắt mức.

13.6.2 Ngắt ngoài trong vi điều khiển PIC

Trong vi điều khiển PIC, có 3 ngắt ngoài INT0, INT1, INT2 nắm tương ứng với các chân RB0, RB1, RB2. Và trongvi điều khiển PIC chỉ có hai loại ngắt là ngắt cạnh lên và ngắt cạnh xuống. Đối với ngắt ngoài INT1 và INT2 có haimức ưu tiên ngắt là ngắt có độ ưu tiên cao và độ ưu tiên thấp, còn đối với ngắt ngoài INT0 thì luôn cố định là ngắtcó độ ưu tiên cao. Các chân ngắt ngoài khi sử dụng phải được cấu hình ở chế độ input.

13.6.3 Các thanh ghi để cấu hình ngắt ngoài cho PIC

Ngắt trong ci điều khiển PIC được cấu hình qua các thanh ghi INTCON, INTCON2, INTCON3.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

23 trong 39 5/26/2013 4:19 PM

Page 24: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Thanh ghi INTCON

Code:

Bit 7 GIE Global Interrupt EnableNếu IPEN = 01 = cho phép ng ắt0 = c ấm t ất c ả các ng ắtNếu IPEN = 11 = cho phép ng ắt m ức cao0 = c ấm t ất c ả các ng ắt

Bit 6 PEIE Peripheral Interrupr EnableNếu IPEN = 01 = cho phép ng ắt ngo ại vi0 = c ấm các ng ắt ngo ại viNếu IPEN = 01 = cho phép ng ắt m ức th ấp0 = c ấm ngắt m ức th ấp

Bit 4 INT0IE External Interrupt 0 Enable1 = cho phép ng ắt ngoài 00 = t ắt ng ắt ngoài 0

Bit 0 INT0IF External Interrupt Flag1 = c ờ báo ng ắt c ủa ng ắt ngoài 00 = không có tín hi ệu ng ắt ngoài 0

Thanh ghi INTCON2

Code:

Bit 6 INTEDG0 External Interrupr 0 Edge Select1 = ng ắt ngoài 0 khi có c ạnh lên0 = ng ắt ngoài 0 khi có c ạnh xu ống

Bit 5 INTEDG1 External Interrupr 1 Edge Select1 = ng ắt ngoài 1 khi có c ạnh lên0 = ng ắt ngoài 1 khi có c ạnh xu ống

Bit 4 INTEDEG2 External Interrupt 2 Edge Select1 = ng ắt ngoài 2 khi có c ạnh lên0 = ng ắt ngoài 2 khi có c ạnh xu ống

Thanh ghi INTCON3

Code:

Bit 7 INT2IP External Interrupt 2 Priority1 = độ ưu tiên cao0 = độ ưu tiên th ấp

Bit 6 INT1IP External Interrupt 1 Priority1 = độ ưu tiên cao0 = độ ưu tiên th ấp

Bit 4 INT2IE External Interrupt 2 Enable1 = cho phép ng ắt ngoài 20 = t ắt ng ắt ngoài 2

Bit 3 INT1IE External Interrupt 1 Enable1 = cho phép ng ắt ngoài 10 = t ắt ng ắt ngoài 1

Bit 1 INT2IF External Interrupt 1 Flag1 = c ờ báo ng ắt c ủa ng ắt ngoài 00 = không có tín hi ệu ng ắt ngoài 0

Bit 0 INT1IF External Interrupt 1 Flag1 = c ờ báo ng ắt c ủa ng ắt ngoài 00 = không có tín hi ệu ng ắt ngoài 0

Các cờ ngắt ngoài INT0IF, INT1IF, INT2IF phải được xóa bằng chương trình trong hàm xử lý ngắt của chúng.

13.7 Giao tiếp PS/2

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

24 trong 39 5/26/2013 4:19 PM

Page 25: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Dữ liệu trong giao tiếp PS/2 được truyền nối tiếp từng bit. Khi một phím được nhấn, 11 bit bao gồm Start bit, 8 bit dữ liệu (bittrọng số thấp truyền trước), 1 bit parity và 1 stop bit sẽ được gửi đi:

Hình 14.1 Dạng sóng của giao tiếp PS/2Ta sẽ lấy dữ liệu tại cạnh xuống của clock, chân của clock được nối vào chân ngắt ngoài INT0 của vi điều khiển Atmega32(PD2) như sau:

Hình 14 14.2 Sơ đồ kết nối PS/2Khi 1 phím được nhấn xuống, mã make_code sẽ được gửi lên. Trong khoảng thời gian phím đó được đè xuống thì mãmake_code vẫn được định kì gửi lên. Khi thả phím ra thì bàn phím gửi lên mã break_code và make_code.Bảng mã make_code và break_code của các phím như sau:

Dễ dàng nhận ra mã break_code của 1 phím gồm 0xF0 và mã make_code của phím đó.

13.8 Xây dựng chương trình

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

25 trong 39 5/26/2013 4:19 PM

Page 26: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

#19 (permalink

Gạt bit 2 của Switch3 lên ON để gắn điện trở kéo lên cho chân CLOCK và DATA của bàn phím PS/213.8.1 Khởi tạo ngắt ngoài

Code:

void init_ext_int0(void){

INTCONbits.INT0IE = 1; // set external interrupt0INTCONbits.INT0IF = 0; // clear external interrupt0 flagINTCON2bits.INTEDG0 = 0;// interrupt when appear an falling edge on RB0/INT0

TRISBbits.TRISB0 = 1; // set input for CLOCK pinTRISBbits.TRISB1 = 1; // set input for DATA pin

}

13.8.2 Xử lý ngắt

Phần chính của bài thực hành này là lấy cho được dữ liệu truyền lên từ bàn phím. Quá trình dịch từng bit để lấydữ liệu 8 bit trong chuỗi 10 bit được hiện thực trong hàm phục vụ ngắt ngoài INT0.

Code:

#pragma code#pragma interrupt high_isrvoid high_isr(void){

if (INTCONbits.INT0IF){

INTCONbits.INT0IF = 0;count_bits ++;if (count_bits == 1)

ps2_scan_code = 0;if (count_bits >1 && count_bits < 10){

ps2_scan_code = ps2_scan_code >> 1;if (PS2_DATA == 1)

ps2_scan_code |= 0x80;parity ^= PS2_DATA;

}if (count_bits == 12){

scan_code = ps2_scan_code;ps2_scan_code = 0;parity = 0;

}}

}

Biến count_bits dùng để đếm số bit gửi về, khi count_bit_input = 11 ta sẽ có được dữ liệu scan_code từ bàn phímtruyền lên. Bạn sẽ phải xử lý để phân loại đây là mã make_code hay break_code, có được nhấn kèm với phímShift hay Caps Lock hay không để chuyển sang mã ASCII cho kí tự được nhấn.

13.9 Download

Code mẫu

__________________BS

15-02-2013, 06:55 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 18 : Graphics LCD 128x64

Bài 18 : Graphics LCD 128x64

14.1 Giới thiệu GLCD 128x64

Graphic LCD được sử dụng trên mạch BKIT PIC là loại LCD chấm, không màu, có độ phân giải 128x64 tức 8192 chấm. GLCD được thiết kế đểđiều khiển được từng chấm, nên có thể dùng để hiển thị bất kỳ ký tự hay hình ảnh nào. Với mỗi chấm tương ứng một bit dữ liệu, GLCD128x64 cần 8192 bits RAM hay 1024 bytes RAM để hiển thị toàn màn hình.Loại GLCD YM12864J sử dụng 2 chip điều khiển KS0108 rất phổ biến của Samsung, mỗi chip có 512 bytes RAM. Do đó, nó tương tự như 2LCD 64x64 ghép lại với nhau.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

26 trong 39 5/26/2013 4:19 PM

Page 27: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Hình 15 1 GLCD 128x64

14.1.1 Chức năng các chân của GLCD 128x64

Chức năng các chân:

Các chân từ 4 đến 17 được kết nối trực tiếp đến vi điều khiển. Các chân còn lại được kết nối tùy theo chức năng tương ứng củanó.

Chân EN

Khi thực hiện một quá trình giao tiếp với GLCD, ban đầu, chân EN được kéo xuống thấp. Trong khi đó, các chân điềukhiển khác được thiết lập. Sau khi thiết lập xong, chân EN được kích lên mức cao để cho phép tín hiệu. Sau khoảngthời gian cần thiết cho quá trình hoàn tất, chân EN lại được kéo xuống thấp để sẵn sàng cho một quá trình khác.

Chân RS và RW

Hai chân này được kết hợp để thiết lập cho các thanh ghi của GLCD theo bảng sau:

Chân CS1 và CS2

Chọn chip điều khiển GLCD – KS0108 để giao tiếp, tích cực mức cao.

14.1.2 Tổ chức bộ nhớ RAM

Chip điều khiển GLCD KS0108 chỉ có một loại bộ nhớ là RAM, không có bộ nhớ chứa bộ font CGROM hay chứa mã font tự tạoCGRAM như của Text LCD. Dữ liệu ghi vào RAM sẽ được hiển thị trực tiếp trên GLCD. Mỗi chip KS0108 có 512 bytes RAM tương

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

27 trong 39 5/26/2013 4:19 PM

Page 28: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

ứng với 4096 chấm trên một nửa (64x64) LCD. RAM của KS0108 được truy cập theo từng byte, nghĩa là mỗi lần viết một giá trịvào một byte nào đó trên RAM của GLCD, sẽ có 8 chấm bị tác động, 8 chấm này nằm trên cùng 1 cột. Do đó, 64 dòng GLCD đượcchia thành 8 pages, mỗi page có độ cao 8 bit và rộng 128 cột (tính cả 2 chip).Sơ đồ bố trí RAM:

Hình 15 2 Sơ đồ bố trí RAM của GLCD 128x64Với mỗi chip KS0108, RAM chia thành 8 page, mỗi page bao gồm 64 cột, mỗi cột bao gồm 8 chấm. Các page được gọi là địa chỉ X,mang giá trị từ 0 đến 7, X = 0 tương ứng với page 0 và tương tự. Các cột được gọi là địa chỉ Y, cột đầu tiên có giá trị Y = 0 và cộtcuối cùng có giá trị Y = 63. Mỗi cột là một byte RAM, D0 đến D7, với D0 tương ứng điểm trên cao và D7 tương ứng điểm bên dưới.Các lệnh di chuyển được hỗ trợ theo cặp địa chỉ X, Y.Minh họa hiển thị ký tự “a” trên GLCD:

Hình 15 3 Ký tự "a" trên GLCDNhư hình trên, ký tự “a” được xác định bằng cách ghi dữ liệu vào X = 0 và Y = 0...7 theo bảng sau:

Hình 15 4 Dữ liệu RAM cho ký tự "a"Giá trị Data là các giá trị cần nạp cho vùng RAM tương ứng.

14.1.3 Các lệnh của GLCD 128x64

Bảng lệnh

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

28 trong 39 5/26/2013 4:19 PM

Page 29: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

1. Lệnh hiển thị ON/OFF

Dữ liệu được hiển thị lên màn hình khi bit D (DB0) bằng 1 và ngược lại khi D bằng 0. Khi D bằng 0, dữ liệu vẫn tồn tạitrong DDRAM.Lập trình:• RW = 0• RS = 0• Opcode = 0x3E + D (D = 0:1)

2. Hiển thị Start Line

Chọn một dòng nào đó của RAM để làm dòng đầu tiên được hiển thị lên, nghĩa là “cuộn” hình ảnh trong RAM lên mộtkhoảng LOffset, với LOffset có giá trị từ 0 đến 63. Phần bị che khuất khi cuộn sẽ được hiển thị tiếp ngay bên dưới. Vídụ với LOffset = 20:

Hình 15 5 Cuộn lên 20 dòngLập trình:• RS = 0• RW = 0• Opcode = 0xC0 + LOffset

3. Thiết lập trang (địa chỉ X)

Thiết lập địa chỉ X để truy xuất RAM.Lập trình:• RS = 0• RW = 0• Opcode = 0xB8 + X

4. Thiết lập địa chỉ Y

Thiết lập địa chỉ Y để truy xuất RAM.Lập trình:• RS = 0• RW = 0• Opcode = 0x40 + Y

5. Đọc trạng thái

Đọc trạng thái của GLCD, chủ yếu kiểm tra bit BUSY (bit 7).Lập trình:• RS = 0• RW = 1

6. Ghi dữ liệu hiển thị

Ghi dữ liệu vào RAM tại địa chỉ X, Y. Sau khi ghi xong, giá trị Y sẽ tự động được tăng lên 1 đơn vị, chuyển sang cột

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

29 trong 39 5/26/2013 4:19 PM

Page 30: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

#20 (permalink)

tiếp theo hoặc trở về cột đầu tiên, tức Y = 0.Lập trình:• RS = 1• RW = 0

7. Đọc dữ liệu hiển thị

Đọc dữ liệu từ RAM tại địa chỉ X, Y. Sau khi đọc xong, giá trị Y sẽ tự động được tăng lên 1 đơn vị, chuyển sang cột tiếptheo hoặc trở về cột đầu tiên, tức Y = 0.Lập trình:• RS = 1• RW = 1

14.2 Xây dựng chương trình

14.2.1 Khởi tạo graphic LCD

Quá trình khởi tạo được thực hiện như sau:

Khởi tạo các chân liên kết với glcd(thiết lập input/output).Chọn chip điều khiển thứ nhất.Thiết lập chân RS ở chế độ ghi lệnh.Gửi lệnh bât màn hình (0x3F).Gửi lệnh để thiết lập địa chỉ Y (0x40 + Y).Gửi lệnh để thiết lập địa chỉ X (địa chỉ trang) (0xB8 + X).Gửi lênh chọn dòng nào trong RAM để hiển thị lên.Làm tương từ bước thứ 2 cho chip thứ 2.

Tương ứng với từng lệnh trên trong chương trình như sau:Code:

glcd_write_byte(GLCD_ON_DISPLAY);glcd_write_byte(GLCD_SET_Y_ADDR);glcd_write_byte(GLCD_SET_PAGE);glcd_write_byte(GLCD_START_LINE);

Với các tham số truyền vào có giá trị như sau:Code:

#define GLCD_ON_DISPLAY 0x3F // DB0: turn display on#define GLCD_START_LINE 0xC0 // 11XXXXXX: set lcd sta rt line#define GLCD_SET_PAGE 0xB8 // 10111XXX: set lcd page (X) address#define GLCD_SET_Y_ADDR 0x40 // 01YYYYYY: set lcd Y a ddress

14.2.2 Ghi dữ liêu lên GLCD

Hàm ghi dữ liêu(một byte) có thể viết như sau:Code:

GLCD_CTRL_PORTbits.GLCD_CTRL_RW = 0;// ch ế độ ghi GLCD_DATA_PORT = abyte; // ghi d ữ li ệuGLCD_CTRL_PORTbits.GLCD_CTRL_E = 1;// sau khi ghi b ật chân EN lên 1 để cho phép tín _nop();_nop();_nop();GLCD_CTRL_PORTbits.GLCD_CTRL_E = 0;// cho chân EN x uống 0 l ại để chu ẩn b ị_nop();_nop();_nop();

Chi tiết cụ thể về quá trình xuất dữ liệu lên GLCD các bạn có thể tham khảo chương trình mẫu kèm theo.

14.3 Download

Code mẫu

__________________BS

15-02-2013, 07:28 PM

bs135 Administrator

Tham gia ngày: Sep 2008Bài gửi: 336Thanks: 151Thanked 363 Times in 160 Posts

Bài 19 : Giao tiếp SD Card bằng SPI

Bài 19 : Giao tiếp SD Card bằng SPI

15.1 Giới thiệu tổng quan về Sdcard

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

30 trong 39 5/26/2013 4:19 PM

Page 31: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

15.1.1 Sơ lược về SD card

Hình 18 18.1 Các loại SD CardSecure Digital (SD) Card là bộ nhớ flash tích hợp cao với khả năng truy xuất tuần tự và ngẫu nhiên. Với tốc độ truyềnnhận dữ liệu nhanh và ổn định, kích thước nhỏ gọn, khả năng lưu trữ cao từ 4MB đến 2GB, SD thích hợp cho các thiếtbị kỹ thuật số cầm tay như máy nghe nhạc, điện thoại di động, PDA, máy quay phim, chụp ảnh…

15.1.2 Sơ đồ khối của SD card

Hình 18 18.2 Sơ đồ khối của SD Card

15.1.3 Sơ đồ chân

15.1.4 Các thanh ghi bên trong

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

31 trong 39 5/26/2013 4:19 PM

Page 32: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

15.1.5 Chuẩn giao tiếp với SD card

SD Card hỗ trợ 2 chế độ giao tiếp là chế độ SD Card và SPI. Host (hệ thống chủ - vi điều khiển) có thể chọn một tronghai chế độ này để thực hiện giao tiếp với SD Card. Chế độ SD Card hỗ trợ 2 chế độ con là 1-bit và 4-bit, tốc độ truyềndữ liệu nhanh. Chế độ SPI tuy có tốc độ thấp hơn nhưng dễ sử dụng và được hỗ trợ trong hầu hết các hệ thống – viđiều khiển. Trong tài liệu này, chúng ta sẽ sử dụng SPI để giao tiếp với SD Card.

15.2 Giới thiệu về FAT

15.2.1 Tổng quan FAT

FAT (File Allocation Table – Bảng cấp phát tập tin) là kiến trúc hệ thống tập tin được sử dụng cho máy tính và hầu hếtcác loại thẻ nhớ. Được phát triển bởi Microsoft từ năm 1976.

FAT quản lý bộ nhớ bằng cách chia nhỏ bộ nhớ (sector, cluster) và đánh dấu các khối nhỏ đó bằng các bit địa chỉ. Mộtsector chứa 512 byte bộ nhớ. Một cluster chứa nhiều sector. Số sector trong một cluster là cố định và do người dùngchọn lúc định dạng bộ nhớ.

Ở chế độ mặc định một cluster chứa 8 sector. Khi lưu trữ một file, FAT cấp phát một hoặc nhiều cluster có tổng kíchthước không nhỏ hơn kích thước file đó. Ví dụ file có kích thước 5kB sẽ được cấp phát 2 cluster (8 sector/cluster) đểlưu trữ. Nếu số sector trong mỗi cluster càng lớn sẽ gây nhiều lãng phí bộ nhớ, ngược lại nếu số này càng nhỏ thì hệthống hoạt động càng chậm.

Các phiên bản FAT là FAT12, FAT16, FAT32. Điểm khác nhau cơ bản giữa các phiên bản là về giới hạn quản lý bộ nhớ.FAT12 dùng 12 bit để đánh dấu địa chỉ các cluster, nên có thể quản lý gần 212 cluster (trừ một số địa chỉ để đánh dấucác vùng đặc biệt). Tương tự FAT16 dùng 16 bit, FAT32 dùng 28 bit để đánh dấu địa chỉ.

15.2.2 Cấu trúc phân vùng FAT

Một hệ thống file FAT gồm 4 phần:

Reserved sectors: Nằm ở vị trí đầu tiên (sector 0) là Boot sector (tên đầy đủ là Partition Boot Record). Sectornày chứa một vùng gọi là BIOS Parameter Block (với một số thông tin của hệ thống file, chi tiết về kiểu file, vàcon trỏ tới các phần khác) và thường chứa boot loader code của hệ điều hành. Tổng số Reverved sector cũngđược lưu trong một trường của Boot sector. Những thông tin quan trọng của Boot sector một cấu trúc gọi làDrive Parameter Block trong DOC và OS/2. Riêng FAT32 có thêm một File System Information Sector (sector 1)và một Backup Boot Sector (sector 6).

1.

FAT Region: Gồm hai bảng, là bản đồ của vùng Data Region, cho biết những cluster nào đã được dùng.2.Root Directory Region: Đây là Directory Table, chứa thông tin về file và thư mục trong thư mục gốc (rootdirectory), chỉ có trên FAT12 và FAT16.

3.

Data Region: Đây là nơi thực sự file và thư mục được lưu trữ và chiếm hầu hết dung lượng của phân vùng ổ đĩa.FAT32 lấy cluster đầu tiên của Data Region làm Root Directory Table.

4.

15.2.3 Bảng cấp phát tập tin

Phân vùng bộ nhớ được chia nhỏ thành những phần nhỏ kề nhau, có kích thước bằng nhau gọi là cluster. Kích thướccủa cluster thường từ 2kB đến 32kB, phụ thuộc vào kiểu FAT, kích thước phân vùng bộ nhớ và lựa chọn của ngườidùng. Mỗi file chiếm một hoặc nhiều cluster tùy thuộc vào kích thước của file đó; như vậy, một file được chứa bởi mộtdãy các cluster tạo thành một danh sách liên kết. Các cluster của một file không nhất thiết phải liền kề nhau, điềunày thường gây ra tình trạng phân mảnh (fragmented).

Bảng cấp phát tập tin FAT là một danh sách các mục (entry) vẽ nên bản đồ của từng cluster trên phân vùng ổ đĩa. Mỗientry chứa các thông tin:

số của cluster tiếp theo trong dãy các clusterentry đánh kết thúc của dãy cluster (end of clusterchain – EOC)entry đặc biệt đánh dấu một cluster lỗi (bad cluster)entry đặc biệt đánh dấu cluster không dùngcờ zero đánh dấu cluster chưa dùng

Kích thước FAT entry khác nhau ở mỗi phiên bản. FAT12 và FAT16 dùng 12 và 16 bit cho mỗi entry. Trong FAT32, mỗientry là 32 bit, nhưng thực sự chỉ dùng 28 bit, 4 bit cao dự trữ (không dùng, thường là 0).

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

32 trong 39 5/26/2013 4:19 PM

Page 33: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

15.2.4 Directory table

Mỗi file/directory (cũng hiểu là một folder) khi lưu trữ được biểu thị là một entry 32-byte trong bảng Directory Table.Mỗi entry ghi: tên, thuộc tính (attributes: archive, directory, hidden, read-only, system and volume), ngày tạo lập, địachỉ của cluster dữ liệu đầu tiên, và kích thước của file/directory. Tất cả các Directory Table đều được chứa trong vùngData Region (trừ ở FAT12 và FAT16, Root Directory Table chiếm một vùng riêng gọi là vùng Root Directory Region).Mô tả một Directory entry (cả Root Directory và subdirectory):

15.3 Giới thiệu bộ thư viện MDD

SD card giao tiếp thông qua SPI, chúng ta có thể làm tất cả các bước từ cấu hình SPI cho PIC, sau đó gửi lệnh từ vi điều khiểnxuống SD card rồi chờ tín hiệu trả về, đọc master boot record, boot sector, đọc ghi FAT …Với cách làm này đòi hỏi bạn tốn nhiềuthời gian hơn để xây dựng các hàm API giao tiếp với SDcard nhưng bạn sẽ nắm được nhiều kiến thức hơn về SDcard. Ngoài ra cònmột cách khác nữa để làm là sử dụng thư viện các hàm có sẵn ở trên mạng để sử dụng như vậy chúng ta sẽ tốn ít thời gian hơncho việc viết các hàm giao tiếp thẻ nhớ và tập trung hơn vào xây dựng ứng dụng sử dụng SD card.

MDD là thư viện chứa các hàm và thiết lập để giao tiếp với SD card,nằm trong bộ thư viện đầy đủ hỗ trợ các chức năng gồm SDcard, mTouch, GraphicLCD, USB, audio… do Microchip cung cấp và được đặt tên là Microchip solutions. Ở đây chúng tôi tập trungvào cách sử dụng thư viện MDD vào giao tiếp với SD card bằng SPI.15.3.1 Hướng dẫn sử dụng MDD

Đây là một bộ thư viện của Microchip cung cấp có thể chạy trên các dòng PIC 8 bit (PIC18F), PIC 16bit (PIC24F,PIC24H, dsPIC30) và PIC 32bit (dsPIC33) nên thư viện cũng khá lớn, đòi hỏi bộ chương trình của vi điều khiển sửdụng cũng phải nhiều, cụ thể nếu sử dụng thư viện và chỉ có thể đọc file từ SDcard thì cần gần 22000 bytes bộ nhớchương trình để lưu trữ(chứ tính không gian lưu trữ cho code chương trình ứng dụng tự viết) và để sử dụng toàn bộchức năng của thư viện (có thể đọc ghi file, format thẻ nhớ, tìm kiếm file, tạo xóa quản lý thư mục, sử dụng các hàmmở rộng pgm, sử dụng được hàm Fsfprintf, hỗ trợ thẻ nhớ định dạng FAT32) thì cần gần 35000 bytes bộ nhớ chươngtrình. Đó là thông tin do Microchip cung cấp nhưng thực thế sử dụng thì với vi điều khiển chỉ có 32KB bộ nhớ chươngtrình thì hoàn toàn không thế sử dụng được bộ thư viện(trừ chế độ chỉ đọc file) mà vi điều khiển PIC18F4520 chỉ có32KB bộ nhớ chương trình nên chúng tôi chọn một chip khác cùng dòng với vi điều khiển là vi điều khiển PIC18F4620với bộ nhớ chương trình là 64KB, nhưng vẫn còn một vài chức năng phụ mà chúng tôi đã bỏ không sử dụng để thugọn chương trình sau khi biên dịch, nên nếu bạn muốn sử dụng toàn bộ chức năng của thư viện thì nên chọn vi điềukhiển có bộ nhớ chương trình 96KB trở lên.

Hình 18-3 Chi tiết sử dụng bộ nhớ chương trình cho thư viện MDD

Hình 18-4 Các tính năng được lựa chọn của thư viện

Muốn bỏ bớt chức năng nào của thư viện chúng ta cần phải tìm và khóa tất cả các dòng code define cho tính năngđó(vd #ifdef ALLOWS_DIRS … #endif).Bước 1: Tạo 1 project mới, sau đó vào trang của Microchip download xuống thư viện Microchip Solutions(hoặc có sẵntrong đĩa CD kèm theo) , trong đó bao gồm luôn cả thư viện MDD. Vào thư mục Microchip Solutions chép thư mụcMDD File System và thư mục Microchip vào thư mục chứa project. Sau đó vào thư mục MDD File System xóa hếtnhững file không cần thiết trừ thư mục PIC18F, tương tự trong thư mục Microchip chúng ta chỉ để lại thư mục PIC18salloc và thư mục Include, trong thư mục Include chúng ta cũng xóa hết và chỉ để lại những file .h ở trong thư mụcnày và thư mục PIC18 salloc,MDD File System. Tiếp theo chúng ta include những file sau vào project với đường dẫn ./là thư mục mà chứa project.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

33 trong 39 5/26/2013 4:19 PM

Page 34: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

.\Microchip\MDD File System\FSIO.c

.\Microchip\MDD File System\SD-SPI.c

.\Microchip\PIC18 salloc\salloc.c

.\MDD File System-SD Card\PIC18F\Fsconfig.h

.\MDD File System-SD Card\PIC18F\HardwareProfile.h

.\Microchip\Include\MDD File System\FSIO.h

.\Microchip\Include\MDD File System\SD-SPI.h

.\Microchip\Include\MDD File System\FSDefs.h

.\Microchip\Include\PIC18 salloc\salloc.h

.\Microchip\Include\Compiler.h

.\Microchip\Include\GenericTypeDefs.h

Hình 18-5 Project sau khi thêm các file headerFile tmp.c là file chứa hàm main do chúng ta tự viết.Sau đó vào tab Project →Build Options → Project, chọn Include Search Path, chọn New sau đó thêm vào các đườngdẫn như trên.

Hình 18-6 Thêm đường dẫn cho project

Bước 2: Thiết lập buffer đọc và ghi, buffer cho FATMở file linker tương ứng với vi điều khiển PIC đang sử dụng(ở đây là file 18f4620.lkr ), rồi chỉnh sửa lại với nội dungnhư sau

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

34 trong 39 5/26/2013 4:19 PM

Page 35: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Hình 18-7 Chỉnh sửa file linker cho project

Bước 3: Thiết lập bộ nhớ cache và xung clockThiết lập bộ nhớ cacheTrong file Fsconfig.h đã cấu hình sẵn bộ nhớ cache sử dụng là 512bytes thông qua câu lệnh định nghĩa

Code:

#define MEDIA_SECTOR_SIZE 512

Nếu bạn muốn thay đổi bộ nhớ của cache thì chỉ cần chỉnh sửa trong câu lệnh này nhưng nhớ là bộ nhớ cache là bộisố của 512.Ngoài ra còn một số thiết lập chức năng khác như bật/tắt chức năng ghi, tìm file… đều có trong fileFSconfig.h các bạn có thể tự đọc để tìm hiểu thêm.Thiết lập xung clockĐể cấu hình xung clock bạn mở file HardwareProfile.h tìm đến dòng lệnh define sau

Code:

#define GetSystemClock() 20000000 // System clock frequency

Ở đây vi điều khiển đang được cấu hình sử dụng xung tần số 20MHz, và tùy vào nhu cầu sử dụng các bạn có thể thayđổi con số này.Bước 4: Thiết lập các chân giao tiếp và các thanh ghi của chế độ SPITrong thư viện này của Microchip chỉ hỗ trợ cho một số con PIC18F (PIC18F87J50, PIC18F8722, PIC18F46J50), toànbộ PIC24F,PIC32F và dsPIC.Cho nên để sử dụng cho những con PIC khác(ví dụ là PIC18F4620) thì cần phải chỉnh sửathêm một số file sau.Trong file HardwareProfile.h bạn thêm vào ở trong mục define dành cho PIC18F những dòng định nghĩa sau

Code:

#elif defined PIC18F4520_PIM #define USE_PIC18 #define USE_SD_INTERFACE_WITH_SPI #define INPUT_PIN 1 #define OUTPUT_PIN 0

#define USE_SD_INTERFACE_WITH_SPI #define TRIS_CARD_DETECT TRISBbits.TRISB 4 // Input #define CARD_DETECT PORTBbits.RB4 #define TRIS_WRITE_DETECT TRISDbits.TRISD 7 // Input #define WRITE_DETECT PORTDbits.RD7 // Chip Select Signal #define SD_CS PORTAbits.RA5 #define SD_CS_TRIS TRISAbits.TRISA 5

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

35 trong 39 5/26/2013 4:19 PM

Page 36: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

// Card detect signal #define SD_CD PORTBbits.RB4 #define SD_CD_TRIS TRISBbits.TRISB 4 // Write protect signal #define SD_WE PORTDbits.RD7 #define SD_WE_TRIS TRISDbits.TRISD 7 // TRIS pins for the SCK/SDI/SDO lines #define SPICLOCK TRISCbits.TRISC 3 #define SPIIN TRISCbits.TRISC 4 #define SPIOUT TRISCbits.TRISC 5 // Latch pins for SCK/SDI/SDO lines #define SPICLOCKLAT LATCbits.LATC3

Và trước đó bạn cần phải định nghĩa các nhãn PIC18F4520_PIM bằng cách ở phần định nghĩa nhãn cho các con PICkhác bạn thêm vào đoạn code sau

Code:

#elif defined(__18F4620)#define DEMO_BOARD PIC18F4620_PIM#define PIC18F4620_PIM

Bước 5: Cấu hình bộ nhớTrong MPLAB IDE, chọn Project → Build Options → Project, chọn thẻ MPLAB C18 rồi chọn Memory Model trongCategories và thiết lập như sau:

Code model : Small code modelData model : Large code modelStack model : Multibank model

Hình 18-8 Cấu hình Memory ModelCác bước thiết lập để sử dụng đã hoàn tất, bây giờ các bạn có thể tạo 1 file source của mình và sử dụng các hàm cósẵn trong thư viện để giao tiếp với SDcard.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

36 trong 39 5/26/2013 4:19 PM

Page 37: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Hình 18-9 Chương trình mẫu

15.3.2 Các hàm trong thư viện

FSInit Initializes the card,loads the master boot record(partition information),loads the boot sector and updatesthe parameters passed into it with its informationFSfclose Updates the file information, writes the remaining entry in and frees the RAM from the heap that wasused to hold the information about the file.This also updates the time-stamp information for thr file.FSfeof Verifies if the end of the file has been reachedFSfopen Allocates space in the heap for file information.If the file being opened already exist, Fsfopen can openit so that the data would be appended at the end of the line, erase it and create a new file qith the same nameto be written to,or simply open it for reading.If the file does nont exist, Fsfopen can creat it. This function thenreturns a pointer to the tructure in the heap that contains information for this fileFSfread Reads information from an open file to a buffer. The number of bytes written can be specified by itsparameters. If Fsfread is called consecutively on the same open file, the read will continue from the place itstopped after the previous read. This function returns the number of data objects readFsfseek Changes the position in a file. When a user calls FSfseek, they specify the base address to set, whichcan either be at the beginning or end of the file, or at the current position in the file.The user also specifies an offset to add to the base (note that if the base address is at the end of the file, theoffset will be subtracted). Hence, if FSfseek is called with the base set to the beginning of the file and aspecified offset of ë0í, the position would be changed to the first byte of the file.Fsftell Returns the current position in the file. The first position in the file is the first byte in the first sector ofthe first cluster, which has the value ë0í. Hence, if a file was created and 2000 bytes were written to it, FSftellwould return the number 1999 if it was called.Fsfwrite Writes information from a buffer to an open file. The algorithm it uses reads a sector from the dataregion of the disk to SRAM, modifies the relevant bytes and then writes the sector back to the disk. Becauseeach FSfwrite call reads the data first, the ability to open multiple files at a time is supported. This also meansthat writing data in larger blocks takes less time than writing the same data in smaller blocks as fewer sectorreads and writes will be needed.Fsremove Searches for a file based on a filename parameter passed into it. If the file is found, its directoryentry is marked as deleted and its FAT entry is erased.Fsremovepgm Deletes the file identified by a given filename. If the file is opened with FSfopen, it must beclosed before calling FSremovepgm. The filename must be specified in ROM. This function is necessary only onthe PIC18 architecture.Fsfopenpgm Opens a file on the SD card and associates an FSFILE structure (stream) with it using argumentsspecified in ROM. This function is necessary only on the PIC18 architecture.FSrename Changes the name of a file or directory. If the pointer passed into this function is NULL, the name ofthe current working directory will be changed.Fsrewind Resets the position of the file to the beginning of the file.Fsmkdir Creates a new subdirectory in the current working directory.Fschdir Changes the current working directory to the one specified by the user.FSrmdir Deletes the specified directory. The user may also choose to specify whether subdirectories and filescontained within the deleted directory are removed. If the user does not permit the function to deletesubdirectories, it fails if the user attempts to delete a non-empty directory.Fsgetcwd Returns the name of the current working directory to the user.FindFirst Locates files in the current working directory that meet the name and attribute criteria. A SearchRecStructure Pointer will be passed into the function. Once a file is located, the file-name, file size, create time anddate stamp, and attributes fields in the SearchRec structure will be updated with the correct file information.FindFirstpgm Operates in the same manner as the FindFirst function, except the name criteria for the file tobe found will be passed into the function in ROM. This function is necessary only on the PIC18 architecture.FindNext Locates the next file in the current working directory that matches the criteria specified in the lastcall of FindFirst or FindFirstpgm. It will then update the SearchRec structure provided by the user with the fileinformation.Fsformat Erases the root directory and file allocation table of a card. The user may also call the function in amode that causes it to create a new boot sector based on the information in the master boot record.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

37 trong 39 5/26/2013 4:19 PM

Page 38: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Fsfprintf Writes a formatted string to a file. It automatically replaces any format specifiers in the string withdynamic values from variables passed into the function. Integer promotion must be enabled in the build optionsmenu when using this function with the PIC18 architecture.SetClockVars Used in user-defined Clock mode to manually set the current date and time. This date and timewould be applied to files as they are created or modified.

15.4 Xây dựng chương trình

15.4.1 Kết nối phần cứng

Hình 18-10 Sơ đồ kết nối SDcardVì SDcard hoạt động ở điện áp 3V3 mà tín hiệu ra của vi điều khiển là 5V nên các chân SDI,SDO,SS,SCK được gắnthông qua các điện trở để chia áp xuống 3V3 cho phù hợp với giao tiếp SDcard.

15.4.2 Chương trình mẫu

Code:

1 #include <p18f4520.h>2 #include <FSIO.H>

3 void blocking(void)4 {5 while (1);6 }

7 void main(void)8 {9 FSFILE *file1;10 unsigned char txt[] = "Giao tiep SDcard!!";11 while (!MDD_MediaDetect());12 while(!FSInit());13 file1 = FSfopenpgm("file_test_1.txt","w+");14 if (file1 == NULL)15 blocking();16 if (FSfwrite((void*)txt,1,18,file1) != 18)17 blocking();18 if (FSfclose(file1) != 0)19 blocking();20 while (1);21 }

Giải thích các lệnh:

Dòng 2: include file header chính của thư viện.Dòng 3→6: tạo hàm blocking hệ thống nếu có lỗi.Dòng 9: khai báo con trỏ sẽ trỏ đến file cần xử lý.Dòng 10: khai báo chuỗi sẽ được ghi vào file.Dòng 11: đợi tín hiệu báo có thẻ nhớ thông qua chân card dectec.Dòng 12: khởi tạo thẻ nhớ để bắt đầu giao tiếp với thẻ nhớ.Dòng 13: khởi tạo cho file, đặt tên file , truyền vào đối số cho phép ghi lên file.Dòng 14→15: kiểm tra có khởi tạo được file hay không.Dòng 16→17: ghi chuỗi vào file.Dòng 18→19: đóng file

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

38 trong 39 5/26/2013 4:19 PM

Page 39: ( Hu_ng d_n th_c hành MPLAB 8 và MPLAB C18 trên BKIT PIC - Trang 2 - BKIT Hardwareclub)

Hình 18-11 Kết quả của chương trình

15.5 Download

Code mẫu

__________________BS

The Following 2 Users Say Thank You to bs135 For This Useful Post:

mhl167 (17-04-2013), ninzaij (22-02-2013)

Trang 2/2 < 1 2

« Ðề Tài Trước | Ðề Tài Kế »

Quyền viết bài

Bạn không thể gửi chủ đề mớiBạn không thể gửi trả lờiBạn không thể gửi file đính kèmBạn không thể sửa bài viết của mình

BB code is MởMặt cười đang Mở[IMG] đang MởHTML đang TắtTrackbacks are MởPingbacks are MởRefbacks are Mở

Forum Rules

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

Liên hệ - Lưu Trữ - Lên trên

BKIT Hardware Club forum Powered by: vBulletin Copyright ©2000-2013, Jelsoft Enterprises Ltd.

[DOC] Hướng dẫn thực hành MPLAB 8 và MPLAB C18 trên BKIT PIC - ... http://bkit4u.com/forum/pic/39601-doc-huong-dan-thuc-hanh-mplab-8-va...

39 trong 39 5/26/2013 4:19 PM