Thứ Năm, 29 tháng 11, 2018

Giao tiếp thời gian thực

Giới thiệu

Khóa R eal  T ime  C (RTC) được sử dụng để theo dõi thời gian và duy trì lịch.
Nhiều ứng dụng yêu cầu lưu giữ hồ sơ về thời gian / ngày khi xảy ra một số sự kiện nhất định. RTC hữu ích trong các ứng dụng như vậy.
RTC có ích trong các ứng dụng ghi dữ liệu. Chúng cũng được sử dụng trong các thiết bị như máy tính, máy tính xách tay và điện thoại di động.
RTC được cấp nguồn bằng pin bên ngoài để chúng có thể duy trì thời gian và ngày ngay cả trong trường hợp mất điện.
RTC có một số thanh ghi để theo dõi thời gian và ngày tháng.
Để sử dụng RTC, trước tiên chúng tôi cần lập trình nó với ngày giờ hiện tại. Một khi điều này được thực hiện, các thanh ghi RTC có thể được đọc bất cứ lúc nào để biết thời gian và ngày tháng.
DS1307 là một RTC hoạt động trên giao thức I2C. 
Để biết thông tin về giao thức PIC18F4550 I2C, tham khảo chủ đề PIC18F4550 I2C trong phần PIC
Mô-đun RTC DS1307

Sơ đồ


RTC DS1307 interfacing với PIC18F4550

Các bước lập trình cho RTC DS1307 (H1)

Ban đầu, trong khi sử dụng RTC lần đầu tiên, chúng tôi phải đặt giá trị đồng hồ và lịch, sau đó RTC luôn cập nhật giá trị lịch và đồng hồ này.
Chúng tôi sẽ đặt giá trị lịch và đồng hồ RTC ở bước đầu tiên và ở bước thứ hai, chúng tôi sẽ đọc các giá trị này. 
Bước 1: Thiết lập đồng hồ và lịch để RTC DS1307
  • Trong mã hóa RTC, chúng tôi yêu cầu địa chỉ thiết bị RTC đầu tiên (địa chỉ nô lệ) mà vi điều khiển muốn giao tiếp với DS1307.
  • Địa chỉ thiết bị RTC DS1307 là 0xD0 (được cung cấp trong biểu dữ liệu).
  • Khởi tạo I2C trong PIC18F4550.
  • Bắt đầu giao tiếp I2C với thiết bị ghi địa chỉ tức là 0xD0.
  • Sau đó, gửi địa chỉ Đăng ký của Giây là 0x00, sau đó gửi giá trị giây để viết trong RTC. Địa chỉ RTC được tự động tăng lên để tiếp theo, chúng tôi chỉ phải gửi các giá trị phút, giờ, ngày, tháng, tháng và năm.  
  • Và dừng giao tiếp I2C.
void RTC_Clock_Write(char sec, char min, char hour, char AM_PM)     /* function for clock */
{
    hour = (hour | AM_PM);     /* whether it is AM or PM */
 I2C_Start(device_id_write);/* start I2C comm. with device slave address*/ 
 I2C_Write(0);      /* write 0 location for sec value */
 I2C_Write(sec);      /* write second value on 00 location */
 I2C_Write(min);      /* write min value on 01 location */
 I2C_Write(hour);     /* write hour value on 02 location */
 I2C_Stop();       /* stop I2C communication */
}

void RTC_Calendar_Write(char day, char date, char month, char year) /* function for calendar */
{
 I2C_Start(device_id_write);/* start I2C comm. with device slave address */
 I2C_Write(3);      /* write on 3 location for day value */
 I2C_Write(day);      /* write day value on 03 location */
 I2C_Write(date);     /* write date value on 04 location */
 I2C_Write(month);     /* write month value on 05 location */
 I2C_Write(year);     /* write year value on 06 location */
 I2C_Stop();
}

Bước 2: Đọc thời gian và giá trị ngày từ RTC DS1307
  • Trong bước thứ hai, chúng tôi sẽ đọc dữ liệu từ RTC, tức là giây, phút, giờ, v.v.
  • Bắt đầu giao tiếp I2C với thiết bị ghi địa chỉ tức là 0xD0.
  • Sau đó viết giá trị đăng ký từ nơi chúng ta phải đọc dữ liệu (chúng ta đọc từ vị trí 00 tức là đọc phần thứ hai).
  • Sau đó gửi lặp đi lặp lại bắt đầu với thiết bị đọc địa chỉ tức là 0xD1.
  • Bây giờ đọc dữ liệu với sự thừa nhận từ vị trí 00.
  • Để đọc vị trí cuối cùng luôn đọc với xác nhận tiêu cực, thì thiết bị sẽ hiểu đây là dữ liệu cuối cùng để đọc từ thiết bị.
  • Để đọc Byte tiếp theo, vị trí của địa chỉ đăng ký sẽ tự động tăng lên.

Chương trình đọc ngày và giờ

/*
 * PIC18F4550 interfacing with RTC DS1307
 */ 


#include <stdio.h>
#include "Configuration_Header_File.h"
#include "16x2_LCD_4bit_File.h"
#include <pic18f4550.h>
#include "I2C_Master_File.h"

#define device_id_write 0xD0
#define device_id_read 0xD1

int sec,min,hour;
int Day,Date,Month,Year;

void RTC_Read_Clock(char read_clock_address)
{
    I2C_Start(device_id_write);
    I2C_Write(read_clock_address);     /* address from where time needs to be read*/
    I2C_Repeated_Start(device_id_read);
    sec = I2C_Read(0);                 /*read data and send ack for continuous reading*/
    min = I2C_Read(0);                 /*read data and send ack for continuous reading*/
    hour= I2C_Read(1);                 /*read data and send nack for indicating stop reading*/
    
}

void RTC_Read_Calendar(char read_calendar_address)
{   
    I2C_Start(device_id_write);
    I2C_Write(read_calendar_address); /* address from where time needs to be read*/
    I2C_Repeated_Start(device_id_read);
    Day = I2C_Read(0);                /*read data and send ack for continuous reading*/
    Date = I2C_Read(0);               /*read data and send ack for continuous reading*/
    Month = I2C_Read(0);              /*read data and send ack for continuous reading*/
    Year = I2C_Read(1);               /*read data and send nack for indicating stop reading*/
    I2C_Stop();
}

void main()
{
    
    char secs[10],mins[10],hours[10];
    char date[10],month[10],year[10];
    char Clock_type = 0x06;
    char AM_PM = 0x05;
    char days[7] = {'S','M','T','W','t','F','s'};
    OSCCON=0x72;                    /*Use internal oscillator and 
                                     *set frequency to 8 MHz*/ 
    I2C_Init();                     /*initialize I2C protocol*/
    LCD_Init();                     /*initialize LCD16x2*/    
    LCD_Clear();
    MSdelay(10);
    while(1)
    { 
        RTC_Read_Clock(0);              /*gives second,minute and hour*/
        I2C_Stop();
        if(hour & (1<<Clock_type)){     /* check clock is 12hr or 24hr */
            
            if(hour & (1<<AM_PM)){      /* check AM or PM */
                LCD_String_xy(1,14,"PM");
            }
            else{
                LCD_String_xy(1,14,"AM");
            }
            
            hour = hour & (0x1f);
            sprintf(secs,"%x ",sec);   /*%x for reading BCD format from RTC DS1307*/
            sprintf(mins,"%x:",min);    
            sprintf(hours,"Tim:%x:",hour);  
            LCD_String_xy(0,0,hours);            
            LCD_String(mins);
            LCD_String(secs);
        }
        else{
            
            hour = hour & (0x3f);
            sprintf(secs,"%x ",sec);   /*%x for reading BCD format from RTC DS1307*/
            sprintf(mins,"%x:",min);    
            sprintf(hours,"Tim:%x:",hour);  
            LCD_String_xy(0,0,hours);            
            LCD_String(mins);
            LCD_String(secs); 
        }
        
        RTC_Read_Calendar(3);        /*gives day, date, month, year*/        
        I2C_Stop();
        sprintf(date,"Cal %x-",Date);
        sprintf(month,"%x-",Month);
        sprintf(year,"%x ",Year);
        LCD_String_xy(2,0,date);
        LCD_String(month);
        LCD_String(year);

    /* find day */
        switch(days[Day])
        {
            case 'S':
                        LCD_String("Sun");
                        break;
            case 'M':
                        LCD_String("Mon");
                        break;                
            case 'T':
                        LCD_String("Tue");
                        break;                
            case 'W':   
                        LCD_String("Wed");
                        break;                
            case 't':
                        LCD_String("Thu");
                        break;
            case 'F':
                        LCD_String("Fri");
                        break;                
            case 's':
                        LCD_String("Sat");
                        break;
            default: 
                        break;
                        
        }
        
    }    
}
​​​​​

1 nhận xét:

  1. Caesars Casino & Resort - DrmCD
    The Caesars 동해 출장마사지 Entertainment Casino 광명 출장마사지 Resort is a Wedding Venue in Las Vegas, NV. Click to 제주 출장안마 browse 여수 출장안마 for details 거제 출장샵 about the Wedding Services ‎Beverages · ‎Entertainment · ‎Casino

    Trả lờiXóa