Giao tiếp I2C với DS1307

Status
Not open for further replies.

2death

Cố Vấn CLB
Staff member
Mục tiêu:

Học lập trình giao tiếp I2C.
Đọc giá trị đồng hồ số (DS1307) (hiển thị lên LCD), hẹn giờ bật/tắt tải AC (đèn, quạt, máy bơm, …)


I. PHẦN CỨNG
Hướng dẫn thực hiện mạch DS1307 + TRIAC, sơ đồ nguyên lý + Layout, các linh kiện trong bài các bạn xem ở bài này:​
http://www.payitforward.edu.vn/forum/threads/15/
và tại:
http://www.payitforward.edu.vn/forum/threads/29/

--> Tham khảo giá linh kiện :) tại luồng này:​
http://www.payitforward.edu.vn/forum/threads/28/

II. KẾT NỐI:

- Nguồn:
2 module Ds1307 và Triac trong board hoàn toàn độc lập với nhau, không chung nguồn 5V và GND.
Tuy nhiên trên board có 2 cái jumper (mình hàn 2 cái header 2) dùng để nối Vcc 2 module và Gnd 2 module trong trường hợp muốn cấp 1 nguồn 5V cho cả 2 module cùng hoạt động.

Trong bài này, chúng ta sẽ đọc thời gian từ DS1307 về để kích TRIAC, nên ta sẽ cấp 1 nguồn 5V (nguồn từ board MainPIC) cho cả 2 module. Vì vậy:

+ Dùng 2 cái jumper / hoặc 2 cái bus 1 để nối 2 thằng VCC và 2 thằng GND lại với nhau (xem hình: jumper màu xanh và màu vàng)
+ Cấp nguồn 5V từ mạch mainPIC sang: có 2 chỗ để cắm dây, ví dụ như trong hình, sợi vàng là +5V, sợi đen là GND.
(Phía mặt dưới board có in chữ chú thích các bạn xem kĩ để khỏi cắm lộn)




- Tín hiệu:

+ Nếu trên mạch MainPIC không có 2 điện trở kéo SCL và SDA lên nguồn thì gạt công tắc SW sang phía có chữ ON (như hình trên). Lưu ý là cứ gạt công tắc sang phía nào có chữ ON, còn bạn hàn cái công tắc theo chiều nào cũng được.

Thật ra mạch mainPIC từ đầu chúng ta thiết kế cũng có 2 R 4.7k, nhưng chưa được nối vào port I2C (ngăn cách bởi cái header 2x2). Vậy bạn có thể tuỳ chọn:
*Gạt SW trên board DS1307 sang ON.
*Hoặc nối jumper cho port I2C trên MainPIC.

+ Nối 2 dây SDA và SCL trên board DS1307 với 2 chân SDA, SCL tương ứng của PIC.
*Lật mặt dưới board DS1307 các bạn sẽ thấy chú thích chân nào là SDA, chân nào là SCL.
*Đối với PIC: SDA là chân RC4, SCL là chân RC3.

+ Chân CTRL: tín hiệu điều khiển TRIAC
*Nối chân CTRL trên board DS1307 với 1 chân I/O nào đó của PIC để điều khiển đóng/cắt TRIAC (trong hình là dây màu trắng)

III. HEADER FILES

1. Các hàm dùng để giao tiếp I2C được define trong i2c.h
Source code tương ứng được viết trong i2c.c

Lưu ý:
- Phải copy 2 files này vào folder chứa project bài học I2C.
- Phải thêm #include "i2c.h" ở đầu chương trình.
- Add 2 files tương ứng vào phần header files và source files của project.
(tương tự như dùng các hàm hiển thị LCD)

2. Nếu muốn configure lại module I2C thì sửa hàm i2c_init() trong file i2c.c

3. Khi đã dùng giao tiếp I2C thì không được dùng 2 chân RC3 và RC4 cho mục đích khác (tất nhiên :D). Và 2 chân này đã được config trong hàm i2c_init() rồi, nên bạn không cần phải cấu hình cho nó nữa.

Download i2c.c
Download i2c.h
 

2death

Cố Vấn CLB
Staff member
Sử dụng môđun MSSP trong chế độ I²C của PIC

Bài viết trích từ trang web của thầy Nguyễn Quang Nam, GV Bộ Môn Thiết Bị Điện, khoa Điện - Điện tử.
Thầy Nguyễn Quang Nam đã giúp đỡ CLB rất nhiều từ khi CLB mới thành lập.
Thầy rất nổi tiếng trên các forum điện tử như picvietnam, dientuvietnam với nick namqn :)

Link đầy đủ:
http://www4.hcmut.edu.vn/~nqnam/Commu.php


Sử dụng môđun MSSP trong chế độ I²C của PIC

Các thanh ghi liên quan đến môđun MSSP trong chế độ I²C của PIC gồm có SSPCON1 (thanh ghi điều khiển 1), SSPCON2 (thanh ghi điều khiển 2), SSPSTAT (thanh ghi trạng thái), SSPADD (thanh ghi địa chỉ, cũng dùng để tạo tốc độ baud), và SSPBUF (thanh ghi đệm dữ liệu), và các thanh ghi liên quan đến ngắt.

Môđun MSSP hỗ trợ một số chế độ làm việc cho cả master và slave, nhưng chỉ có chế độ master với sự hỗ trợ trực tiếp từ phần cứng được đề cập ở đây (vì đây là chế độ tận dụng phần cứng tốt nhất). Chú ý: một số chip chỉ có môđun SSP sẽ không hỗ trợ làm việc ở chế độ master theo giao tiếp I²C.

Thanh ghi PIR1 chứa cờ ngắt SSPIF và thanh ghi PIE1 kết hợp với thanh ghi INTCON chứa các cờ cho phép ngắt liên quan đến môđun MSSP. Riêng với các PIC18, còn có thêm thanh ghi IPR1 chứa bit thiết lập độ ưu tiên ngắt. Vị trí cụ thể của từng bit tùy thuộc vào chip được dùng, bạn cần tham khảo thêm datasheet của chip được dùng để có các thông tin cần thiết.

Cờ ngắt SSPIF được bật khi xảy ra một trong các sự kiện: điều kiện START, điều kiện STOP, đã phát/thu dữ liệu, truyền bit ACK/NACK, điều kiện RESTART (hay Start lặp lại). Tuy nhiên, mô tả của Microchip về trình tự phát dữ liệu không khẳng định được việc có thể dùng bit này để xác định môđun MSSP có rỗi hay không. Đồng thời Microchip lại đưa ra chú ý về bit R/W trong thanh ghi SSPSTAT trong việc xác định khi nào môđun MSSP rỗi, do đó chương trình con chờ môđun MSSP sẽ được viết theo cách thứ hai.

Để sử dụng môđun MSSP ở chế độ I²C, cần thiết lập các thanh ghi: SSPCON1 (thường chỉ quan tâm đến bit SSPEN và đặt các bit SSPM<3:0> = 1000), SSPCON2 (đảm bảo 5 bit thấp nhất là 0), SSPSTAT (đảm bảo là tắt slew rate control đối với tốc độ baud 100 kHz), và SPPADD (thiết lập tốc độ baud). Giá trị của thanh ghi SSPADD được xác định theo công thức sau:
Code:
SPPADD = (Fosc/(4 x Baud)) - 1
với Fosc là tần số xung clock, Baud là tốc độ baud cần thiết.

Sau đây là một ví dụ về chương trình con khởi tạo chế độ master I²C cho môđun MSSP, viết bằng C18:

Code:
void Init_I2C(void) {
	SSPCON1 = 0x28;		//Bat che do I2C cua MSSP, che do master
	SSPCON2 = 0x00;		//Tat cac co trang thai va cho phep
	SSPSTAT |= 0xC0;	//Tat slew rate control
	SSPADD = (Fcy/Baud) - 1;	//Dat toc do baud can thiet
}
Trước khi thực hiện một thao tác nào đó, cần đảm bảo là môđun MSSP đang ở trạng thái rỗi. Chúng ta có thể thực hiện chương trình con kiểm tra trạng thái rỗi (viết bằng C18) của môđun MSSP (chế độ I²C) như sau:

Code:
void Wait_I2C(void) {
	while ((SSPCON2 & 0x1F) | (SSPSTATbits.R_W)) continue;
}
Các điều kiện START, STOP, và RESTART (hay START lặp lại) được tạo ra bằng cách bật các bit SEN, PEN, và RSEN của thanh ghi SSPCON2 một cách tương ứng. Phần cứng sẽ tự động tắt các bit này khi đã hoàn tất điều kiện.

Để ghi thông tin ra bus I²C, bạn chỉ cần ghi vào thanh ghi SSPBUF, sau đó chờ cho đến khi môđun MSSP rỗi, và đọc trạng thái ACK/NACK được slave trả về. Dưới đây là một ví dụ về chương trình con ghi thông tin ra bus I²C, viết bằng C18:

Code:
void Write_I2C(unsigned char d) {
	SSPBUF = d;
	Wait_I2C();
	if (SSPCON2bits.ACKSTAT) flag1 |= 0x01;
}
Để đọc thông tin từ bus I²C, bạn chỉ cần bật cờ cho phép nhận RCEN (trong thanh ghi SSPCON2), chờ cho môđun MSSP hoàn tất công việc, sau đó đọc từ thanh ghi SSPBUF, và tạo trạng thái ACK/NACK như mong muốn. Sau đây là một ví dụ về chương trình con đọc thông tin từ bus I²C, viết bằng C18:

Code:
unsigned char Read_I2C(void) {
	unsigned char d;
	SSPCON2bits.RCEN = 1;
	Wait_I2C();
	d = SSPBUF;
	if (flag2 & 0x0001) SSPCON2bits.ACKDT = 1;
	else SSPCON2bits.ACKDT = 0;
	SSPCON2bits.ACKEN = 1;
	Wait_I2C();
	return d;
}
Chú ý: Hoàn toàn có thể dùng một trình biên dịch C nào đó để viết các chương trình con tương tự cho các PIC16. Về mặt cú pháp thì các trình biên dịch C chuẩn đều tương thích nhau, nhưng có khả năng cách đặt tên bit và thanh ghi chức năng của mỗi trình biên dịch C là khác nhau đôi chút.

Tài liệu tham khảo: Microchip-PICmicro Mid-range MCU Family Reference Manual; Microchip-PICmicro 18C Family Reference Manual
 
Status
Not open for further replies.
Top