Cài đặt thời gian (ghi vào DS1307)

Một phần của tài liệu Thu thập dữ liệu nhiệt độ môi trường trên cở sở dùng vi điều khiển PIC18F458 (Trang 39 - 44)

vào DS1307) Cập nhật thời gian (đọc ra từ DS1307) Hiển thị Kiểm tra cài đặt Không

Đoạn code sau viết bằng ngôn ngữ C trên trình dịch CCS v5.068 cho ta quá trình cài đặt thời gian ban đầu cho đồng hồ

/////////////// Cai thoi gian ////////////// i2c_start(); //bắt đầu

i2c_write(0xD0); //Cho phép ghi vào DS1307 i2c_write(0x00); //Bắt đầu từ thành ghi 0 i2c_write(set_sec(sec)); // thanh ghi 0 i2c_write(set_min(min)); // thanh ghi 1 i2c_write(set_hour(hr)); // thanh ghi 2 i2c_write(set_dow(dow)); // thanh ghi 3 i2c_write(set_day(day)); // thanh ghi 4 i2c_write(set_mth(mth)); // thanh ghi 5 i2c_write(set_year(year)); // thanh ghi 6

i2c_write(0x80); //thanh ghi7 -bo qua phat xung i2c_stop();

///////////////////////////////////////////////

5.6.2.2 Hàm cập nhật thời gian từ đồng hồ.

Sau khi cài đặt thời gian, đồng hồ bên trong DS1307 đã chạy. Muốn cập nhật thông tin từ đồng hồ, cần phải truy xuất tới IC đọc các giá trị trong các thanh ghi, các giá trị này sẽ cho ta các thông số chính xác về thời gian. Để làm được điều này phải sử dụng chế độ “slave transmitter”. Vi điều khiển gửi chỉ thị START sau đó là giá trị 0xD1, khi giá trị này tới DS1307, IC cho phép đọc các thanh ghi bắt đầu tư địa chỉ được đưa tới cho tới khi có chỉ thị STOP dừng quá trình đọc.

Đoạn code sau sẽ cho ta thực hiên thao tác đó.

///////////////Doc dữ liệu DS1307/////////// i2c_start();

i2c_write(0xD0); //Gui dia chi cua slave i2c_write(0x00); //thiet lap lai con

i2c_stop(); I2C_start();

I2C_write(0xD1); /* gui lenh doc du lieu */ sec = i2c_read(1); /* bat dau tu thanh ghi 0*/ min = i2c_read(1);

dow = i2c_read(1); date = i2c_read(1); month = i2c_read(1); year = i2c_read(0); i2c_stop(); ////////////////////////////////////////////

5.7 Giao tiếp I2C mềm.

Trong một số trường hợp các vi điều khiển không có khối giao diện I2C để điều khiển truyền nhận dữ liệu với slave, master hoặc như có nhưng đã sử dụng vào một ứng dụng khác. Khi đó ta hoàn toàn có thể sử dụng các chân khác của vi điều khiển và dùng phần mềm viết một khối giao tiếp I2C cho vi điều khiển. Tuy công việc này có hơi mất công tuy nhiên ta có thể tạo ra nhiều hơn 1 giao diện I2C ở trên vi điều khiển thuận tiện cho việc ghép nối với các ngoại vi sử dụng giao thức truyền dữ liệu theo loại này.

Vi điều khiển PIC18F458 có một khối giao diện I2C các chân được sử dụng là PIN_C3 (SCL) và PIN_C4 (SDA) tuy nhiên các chân này lại được sử dụng vào mục đích ghép nối với thẻ nhớ MMC trong giao diện SPI, giao diện SPI các chân được sử dụng PIN_C3 (CLK), PIN_C4 (DI), PIN_C5 (DO), được trình bày rõ ở chương về MMC. Vì vậy I2C mềm được lựa chọn để ghép nối DS1307 với vi điều khiển

5.7.1 Các bước thực hiện.

Để có được khối I2C mềm phải thực hiện các bước sau: • Định nghĩa các chân được sử dụng cho ghép nối.

• Tạo ra các hàm bao gồm : khởi tạo giao thức, kết thúc giao thức, hàm đọc dữ liệu, hàm ghi dữ liệu và 1 số hàm phụ khác.

5.7.2 Hàm thư viện của khối I2C mềm.

Để viết được hàm thư viện cho khối giao tiếp I2C trước hết ta phải biết về cơ chế truyền dữ liệu theo chuẩn này là như thế nào ? Hoạt động theo các bước sau:

• Dữ liệu bắt đầu truyền khi SCL ở mức thấp. Thời gian của dữ liệu kéo dài trong 1 chu kỳ xung SCL. Số lượng bít truyền trong 1 khung tùy thuộc thiết bị • Quá trình truyền nhận kết thúc khi SCL ở mức cao và tín hiệu SDA chuyển từ

thấp lên cao (LH).

Hình 5.8: Giản đồ xung của chuẩn I2C.

Dữ liệu khi đọc ghi DS1307 có độ dài 1 byte với bit MSB đi đầu.

Sau khi tạo được các hàm ta chỉ cần đính thư viện vào trong chương trình và sử dụng chúng như một khối giao diện cứng.

Đoạn code mô tả quá trình đọc ghi dữ liệu của DS1307 theo chuẩn I2C. ///////////////Tao giao dien I2C//////////////

#define SDA_PIN RB5 // RB.5 #define SCL_PIN RB4 // RB.4 #define SDA_DIR trisb5

#define SCL_DIR trisb4 /////cac ham duoc su dung/////

int8 i2c_read(void);

void i2c_write(byte o_byte); void i2c_nack(void); void i2c_start(void); void i2c_stop(void); void i2c_high_sda(void); void i2c_low_sda(void); void i2c_high_scl(void); void i2c_low_scl(void); //////////////////////////////////////////// byte i2c_read(void){ byte i_byte, n; i2c_high_sda();

for (n=0; n<8; n++){ i2c_high_scl(); if (SDA_PIN){

i_byte=(i_byte << 1)|0x01; // msbit trước } else{ i_byte = i_byte << 1; } i2c_low_scl(); } return(i_byte); } ////////////////////////////////////////////// void i2c_write(byte o_byte){

byte n; for(n=0; n<8; n++){ if(o_byte&0x80){ i2c_high_sda(); } else{ i2c_low_sda(); } i2c_high_scl(); i2c_low_scl(); o_byte = o_byte << 1; } i2c_high_sda(); } //////////////////////////////////////////////// =======================================================

Một phần của tài liệu Thu thập dữ liệu nhiệt độ môi trường trên cở sở dùng vi điều khiển PIC18F458 (Trang 39 - 44)