Giao diện RTC (DS1307) với Vi điều khiển và lập trình của nó

Hãy Thử Công Cụ CủA Chúng Tôi Để LoạI Bỏ Các VấN Đề





RTC là một thiết bị điện tử đóng một vai trò thiết yếu trong thiết kế hệ thống nhúng thời gian thực . Nó cung cấp thời gian và ngày tháng chính xác trong các ứng dụng khác nhau như đồng hồ hệ thống, hệ thống điểm danh học sinh và báo thức, v.v., giúp theo dõi thời gian hiện tại và cung cấp kết quả nhất quán cho nhiệm vụ tương ứng. Bài viết này trình bày giao tiếp RTC với 8051microcotrollera và truy cập cơ bản vào các thanh ghi bên trong.

Giao diện RTC với Vi điều khiển 8051

Giao diện RTC với Vi điều khiển 8051



Lập trình RTC và Giao diện

Giao tiếp RTC với vi điều khiển 8051 tương tự như tất cả các loại “Đồng hồ thời gian thực” khác được giao diện với nó. Vì vậy, chúng ta hãy xem xét giao diện RTC đơn giản với Vi điều khiển 8051 và quy trình lập trình liên quan đến nó.


Bước 1: Chọn thiết bị RTC

Các loại chip RTC khác nhau có sẵn trong thế giới nhúng thời gian thực, được phân loại dựa trên các tiêu chí khác nhau như loại gói, điện áp cung cấp và cấu hình chân, v.v. Một vài loại thiết bị RTC là



  • Giao diện nối tiếp hai dây (Bus I2C)
  • Giao diện nối tiếp ba dây (USB BUS)
  • Giao diện nối tiếp bốn dây (SPI BUS)

Đầu tiên, chúng ta cần chọn loại thiết bị RTC theo danh mục dựa trên yêu cầu như I2C Bus RTC hoặc SPI Bus RTC hoặc loại khác, phù hợp với giao diện với vi điều khiển tương ứng. Sau đó, chúng ta có thể chọn các tính năng của thiết bị RTC tùy theo yêu cầu của ứng dụng như tuổi thọ pin, gói phù hợp và tần số xung nhịp. Chúng ta hãy xem xét giao diện hai dây RTC với vi điều khiển 8051 như DS1307 .

Bước 2: Đăng ký nội bộ và địa chỉ của thiết bị RTC

RTC là viết tắt của đồng hồ thời gian thực cung cấp năm, tháng, tuần, ngày, giờ, phút và giây dựa trên tần số tinh thể. RTC bao gồm Bộ nhớ RAM để lưu trữ dữ liệu . Pin dự phòng sẽ được cung cấp trong trường hợp mất nguồn điện chính bằng cách kết nối pin với thiết bị RTC.

Cấu hình RTC DB1307:

Sơ đồ chân và khối nội bộ RTC

Sơ đồ chân và khối nội bộ RTC

A0, A1, A2: là các chân địa chỉ của chip RTC DB1307, có thể được sử dụng để giao tiếp với thiết bị chủ. Chúng tôi có thể điều khiển tám thiết bị có giao tiếp RTC với Vi điều khiển 8051 bởi các bit A0, A1, A2 sử dụng giao thức I2C.


VCC và GND: VCC và GND lần lượt là chân cấp nguồn và chân nối đất. Thiết bị này hoạt động với dải 1,8V đến 5,5V.

VBT: VBT là chân cung cấp năng lượng cho pin. Nguồn pin phải được giữ trong khoảng từ 2V đến 3,5V.

SCL: SCL là một chân đồng hồ nối tiếp và nó được sử dụng để đồng bộ hóa dữ liệu trên giao diện nối tiếp.

SDL: Nó là một chân đầu vào và đầu ra nối tiếp. Nó được sử dụng để truyền và nhận dữ liệu trên giao diện nối tiếp.

Hết giờ: Nó là một chân đầu ra sóng vuông tùy chọn.

OSC0 và OSC1: Đây là các chân dao động tinh thể được sử dụng để cung cấp tín hiệu đồng hồ cho thiết bị RTC. Tần số tinh thể thạch anh tiêu chuẩn là 22,768KHzs.

Địa chỉ thiết bị:

Giao thức bus I2C cho phép nhiều thiết bị phụ tại một thời điểm. Mỗi thiết bị phụ phải có địa chỉ riêng để đại diện trên đó. Thiết bị chính giao tiếp với thiết bị phụ cụ thể bằng một địa chỉ. Địa chỉ thiết bị RTC là “0xA2” trong đó “1010” do nhà sản xuất cung cấp và A0, A1, A2 là địa chỉ do người dùng xác định, được sử dụng để giao tiếp tám thiết bị RTC trên Giao thức bus I2C .

Thêm thiết bị

Thêm thiết bị

Bit R / W được sử dụng để thực hiện các thao tác đọc và ghi trong RTC. Nếu R / W = 0, hoạt động ghi được thực hiện và R / W = 1 cho hoạt động đọc.

Địa chỉ của thao tác Đọc của RTC = “0xA3”

Địa chỉ của hoạt động Ghi của RTC = “0xA2”

Thanh ghi bộ nhớ và địa chỉ:

Thanh ghi RTC được đặt ở vị trí địa chỉ từ 00h đến 0Fh và thanh ghi bộ nhớ RAM được đặt ở vị trí địa chỉ từ 08h đến 3Fh như trong hình. Thanh ghi RTC được sử dụng để cung cấp chức năng lịch và thời gian lái xe trong ngày và hiển thị các ngày cuối tuần.

Đăng ký bộ nhớ và địa chỉ

Đăng ký bộ nhớ và địa chỉ

Đăng ký Kiểm soát / Trạng thái:

DB1307 bao gồm hai thanh ghi bổ sung như control / status1 và control / status2 được sử dụng để điều khiển đồng hồ thời gian thực và gián đoạn .

Đăng ký Kiểm soát / Trạng thái1:

Đăng ký trạng thái kiểm soát1

Đăng ký trạng thái kiểm soát1

  • TEST1 = 0 chế độ bình thường

= 1 chế độ kiểm tra đồng hồ EXT

  • STOP = 0 RTC bắt đầu

= 1 điểm dừng RTC

  • TESTC = 0 tắt thiết lập lại nguồn

= bật đặt lại bật nguồn được bật

Đăng ký Kiểm soát / Trạng thái2:

Đăng ký trạng thái kiểm soát2

Đăng ký trạng thái kiểm soát2

  • TI / TP = 0 INT luôn hoạt động

= 1 INT thời gian hoạt động bắt buộc

  • AF = 0 Báo thức không khớp

= 1 trận đấu báo thức

  • TF = 0 Không xảy ra tràn bộ hẹn giờ

= 1 xảy ra tràn bộ hẹn giờ

  • ALE = 0 Tắt báo động ngắt

= 1 Đã bật ngắt cảnh báo

  • TIE = 0 Vô hiệu hóa ngắt bộ hẹn giờ

= 1 Bật ngắt hẹn giờ

Bước 3: Giao diện RTC ds1307 với 8051

RTC có thể là giao diện với vi điều khiển bằng cách sử dụng các giao thức bus nối tiếp khác nhau như I2C và Giao thức SPI cung cấp liên kết giao tiếp giữa chúng. Hình cho thấy, giao tiếp đồng hồ thời gian thực với vi điều khiển 8051 sử dụng giao thức bus I2C. I2C là một giao thức nối tiếp hai chiều, bao gồm hai dây như SCL và SDA để truyền dữ liệu giữa các thiết bị kết nối với bus. Bộ vi điều khiển 8051 không có thiết bị RTC sẵn có, do đó chúng tôi đã kết nối bên ngoài thông qua truyền thông nối tiếp để đảm bảo dữ liệu bao gồm.

Giao diện RTC với Vi điều khiển 8051

Giao diện RTC với Vi điều khiển 8051

Các thiết bị I2C có đầu ra cống hở do đó, một điện trở kéo lên phải được kết nối với đường dây I2C với nguồn điện áp. Nếu các điện trở không được kết nối với đường SCL và SDL, bus sẽ không hoạt động.

Bước 4: Định dạng khung dữ liệu RTC

Vì giao tiếp RTC với vi điều khiển 8051 sử dụng bus I2C do đó việc truyền dữ liệu ở dạng byte hoặc gói và mỗi byte được theo sau bởi một xác nhận.

Khung truyền dữ liệu:

Trong chế độ truyền, thiết bị chủ giải phóng điều kiện bắt đầu sau khi chọn thiết bị phụ theo bit địa chỉ. Bit địa chỉ chứa 7 bit, cho biết thiết bị phụ là địa chỉ ds1307. Dữ liệu nối tiếp và đồng hồ nối tiếp được truyền trên đường SCL và SDL. Các điều kiện START và STOP được coi là bắt đầu và kết thúc của quá trình truyền nối tiếp. Các hoạt động nhận và truyền được theo sau bởi bit R / W.

Khung truyền dữ liệu

Khung truyền dữ liệu

Khởi đầu: Về cơ bản, trình tự truyền dữ liệu được khởi tạo bởi trình chủ tạo điều kiện bắt đầu.

Địa chỉ 7-bit: Sau đó, tổng thể gửi địa chỉ phụ ở hai định dạng 8 bit thay vì một địa chỉ 16 bit.

Địa chỉ Đăng ký Kiểm soát / Trạng thái: Địa chỉ thanh ghi trạng thái / điều khiển là cho phép các thanh ghi trạng thái điều khiển.

Đăng ký Kiểm soát / Trạng thái1: Thanh ghi trạng thái điều khiển1 được sử dụng để kích hoạt thiết bị RTC

Đăng ký Kiểm soát / Trạng thái2: Nó được sử dụng để bật và tắt ngắt.

R / W: Nếu bit đọc và ghi ở mức thấp, thì hoạt động ghi được thực hiện.

ALAS: Nếu thao tác ghi được thực hiện trong thiết bị phụ, thì bộ thu sẽ gửi ACK 1 bit đến vi điều khiển.

Dừng lại: Sau khi hoàn thành thao tác ghi trong thiết bị tớ, vi điều khiển sẽ gửi điều kiện dừng đến thiết bị tớ.

Khung dữ liệu nhận:

Khung nhận dữ liệu

Khung nhận dữ liệu

Khởi đầu: Về cơ bản, trình tự truyền dữ liệu được khởi tạo bởi trình chủ tạo điều kiện bắt đầu.

Địa chỉ 7-bit: Sau đó, tổng thể gửi địa chỉ phụ ở hai định dạng 8 bit thay vì một địa chỉ 16 bit.

Địa chỉ Đăng ký Kiểm soát / Trạng thái: Địa chỉ thanh ghi trạng thái / điều khiển là cho phép các thanh ghi trạng thái điều khiển.

Control / Status Register1: Thanh ghi trạng thái điều khiển1 được sử dụng để kích hoạt thiết bị RTC

Đăng ký Kiểm soát / Trạng thái2: Nó được sử dụng để bật và tắt ngắt.

R / W: Nếu bit đọc và ghi cao, thì hoạt động đọc được thực hiện.

ALAS: Nếu thao tác ghi được thực hiện trong thiết bị phụ, thì bộ thu sẽ gửi ACK 1 bit đến vi điều khiển.

Dừng lại: Sau khi hoàn thành thao tác ghi trong thiết bị tớ, vi điều khiển sẽ gửi điều kiện dừng đến thiết bị tớ.

Bước 5: Lập trình RTC

Viết hoạt động từ Master sang Slave:

  1. Đưa ra điều kiện bắt đầu từ chủ đến nô lệ
  2. Chuyển địa chỉ phụ ở chế độ ghi trên dòng SDL
  3. Gửi địa chỉ đăng ký điều khiển
  4. Gửi điều khiển / đăng ký trạng thái1 giá trị
  5. Gửi giá trị đăng ký điều khiển / trạng thái 2
  6. Gửi ngày giống như phút, giây và giờ
  7. Gửi điểm dừng

#include

sbit SCL = P2 ^ 5
sbit SDA = P2 ^ 6
void start ()
void hosts (unsigned char)
trì hoãn (ký tự không dấu)

void main ()
{

khởi đầu()
write (0xA2) // địa chỉ nô lệ //
write (0x00) // địa chỉ thanh ghi điều khiển //
write (0x00) // thanh ghi điều khiển 1 giá trị //
write (0x00) // điều khiển regiter2 vlaue //
ghi (0x28) // giá trị giây //
ghi (0x50) // giá trị phút //
ghi (0x02) // giá trị giờ //
}

void start ()
{

SDA = 1 // xử lý dữ liệu //
SCL = 1 // xung nhịp cao //
trì hoãn (100)
SDA = 0 // đã gửi dữ liệu //
trì hoãn (100)
SCL = 0 // tín hiệu xung nhịp thấp //
}
void write (unsigned char d)
{

ký tự không dấu k, j = 0 × 80
cho (k = 0k<8k++)
{
SDA = (d & j)
J = j >> 1
SCL = 1
trì hoãn (4)
SCL = 0
}
SDA = 1
SCL = 1
trì hoãn (2)
c=SDA
trì hoãn (2)
SCL = 0
}
void delay (int p)
{
unsignedinta, b
Đối với (a = 0a<255a++) //delay function//
Đối với (b = 0b}

Đọc Thao tác từ Slave đến Master:

#include
sbit SCL = P2 ^ 5
sbit SDA = P2 ^ 6
void start ()
void ghi (ký tên)
void read ()
void ack ()
void delay (unsigned char)
void main ()
{
khởi đầu()
write (0xA3) // địa chỉ tớ ở chế độ đọc //
đọc()
Chao ôi ()
giây = giá trị
}
void start ()
{

SDA = 1 // xử lý dữ liệu //
SCL = 1 // xung nhịp cao //
trì hoãn (100)
SDA = 0 // đã gửi dữ liệu //
trì hoãn (100)
SCL = 0 // tín hiệu xung nhịp thấp //
}
void write (unsigned char d)
{

ký tự không dấu k, j = 0 × 80
cho (k = 0k<8k++)
{
SDA = (d & j)
J = j >> 1
SCL = 1
trì hoãn (4)
SCL = 0
}
SDA = 1
SCL = 1
trì hoãn (2)
c=SDA
trì hoãn (2)
SCL = 0
}
void delay (int p)
{
unsignedinta, b
Đối với (a = 0a<255a++) //delay function//
Đối với (b = 0b}
Void read ()
{
Ký tự không dấu j, z = 0 × 00, q = 0 × 80
SDA = 1
cho (j = 0j<8j++)
{
SCL = 1
trì hoãn (100)
cờ = SDA
if (cờ == 1)

z = (z
void ack ()
{
SDA = 0 // Dòng SDA xuống mức thấp //
SCL = 1 // xung nhịp từ cao xuống thấp //
trì hoãn (100)
SCL = 0
}

Đây là các bước cần thiết để giao tiếp RTC với vi điều khiển 8051. Ngoài các bước bổ sung này, các khung dữ liệu được sử dụng để truyền và nhận dữ liệu cũng được thảo luận trong bài viết này để người dùng hiểu được cách lập trình thích hợp. Để được trợ giúp thêm về khái niệm này, bạn có thể để lại bình luận bên dưới.