Thông báo

Collapse
No announcement yet.

Code Cho PIC16F887 và DS1307 không chậy ?

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Code Cho PIC16F887 và DS1307 không chậy ?

    Mình đang viết code cho PIC16F887 giao tiếp với DS1307 , nhưng không hiểu xao mình không thấy quá trình giao tiếp thành công ???
    đây là code của mình,các bác xem hộ mình cái :
    Code:
                // khai bao bo tien xu ly
    #include "htc.h"
    #include <pic.h>
    
                // cau hinh ngoai vi xu dung cho PIC
    __CONFIG(FOSC_XT&WDTE_OFF&PWRTE_ON&MCLRE_ON&CP_OFF&CPD_OFF&BOREN_OFF&IESO_OFF&FCMEN_OFF&LVP_OFF&DEBUG_OFF);
    __CONFIG(BOR4V_BOR40V&WRT_OFF);
    
                //  khai bao mot so bien toan cuc
    #define led RE0
    
    /*********************************************************************************************
     *********************************************************************************************
     *****************      cac chuong trinh con bat dau tu day          *************************
     *****************                                                   *************************
     *********************************************************************************************/
    
    
                //  chuong trinh con cau hinh cho pic
    void config(void)
    {
               //  cau hinh cho port
        ANSEL = ANSELH = 0x00;              // dat tat ca cac PIN lam PIN vao ra so
        TRISA = TRISB = TRISC = TRISD = TRISE =0x00;          // dat tat ca cac pin deu la dau ra so
        PORTA = PORTB = PORTC = PORTD = PORTE = 0x00;         // xoa xuong muc 0
    
              // cau hinh cho ngat time0
        GIE = 1;                //  cho phep ngat toan cuc
        PEIE = 1;               //  cho phep ngat ngoai vi
        T0IE = 1;               //  cho phep ngat time0
        T0IF = 0;               //  xoa co ngat
        T0CS = 0;               //  xung clock la xung noi
        T0SE = 0;               //  chon xuon tang la tu thap len cao
        PSA = 0;                //  prescale  la cung cap cho time0
        TMR0 = -200;
        PS2 = PS1 = PS0 = 1;    //  chon ty so chia tan la 1:256
    
               //  cau hinh cho khoi MSSP hoat dong o che do I2C master
        SSPEN = 1; //  cau hinh cho 2 chan SCL va SDA hoat dong o che do i2c
        SSPM3 = 1;
        SSPM2 = SSPM1 = SSPM0 = 0; // chon che do hoat dong cua khoi MSSP la I2C mode master
        SMP = 1;               //  su dung toc do truyen du lieu thong thuong la : 100Khz hoac 1Mhz
        SSPIF = 0;
        SSPADD = 0x09;             //  clcok_i2c = Fosc/(4*(SSPADD + 1))
    
    }
    
    /*===============================================================================
     =============     cac chuong trinh con giao tiep voi khoi i2c va slave     ====*/
    
    void wait_comp(void)
    {
        while(SSPIF == 0);          //  tuc la da xu ly du lieu tren i2c chua song
        SSPIF = 0;                  //  khi nao song thi xoa co bao ngat
    }
    
               //  chuong trinh con gui bit start de khoi dong duong truyen
    void start_i2c(void)
    {
        SEN = 1;                   //  khoi dong dieu kien start
        wait_comp();               //  doi cho den khi thuc hien song
    }
    
               //  chuong trinh con gui bit stop de ket thuc giao tiep i2c
    void stop_i2c(void)
    {
        PEN = 1;                   //  tao ra dieu kien stop de ket thuc qua trinh giao tiep
        wait_comp();               //  doi den khi thuc hien song
    }
    
                //  chuong trinh con restart duong truyen i2c
    void restart_i2c(void)
    {
        RSEN = 1;                    //  tao ra mot dieu kien de resstart i2c
        wait_comp();
    }
    
                //  chuong trinh con gui bit ASK
    void send_ask(void)
    {
        ACKDT = 0;                //  chon bit gui di la bit ASK
        ACKEN = 1;                //  bat dau gui -- cho phep gui di
        wait_comp();
    }
    
                //   chuong trinh con gui di bit NASK
    void send_nask(void)
    {
        ACKDT = 1;               //  chon bit gui di la bit NOT-Acknowledge
        ACKEN = 1;               //  bat dau gui di
        wait_comp();
    }
    
                //  chuong trinh con ghi du lieu len duong tuyen i2c
    void writer_i2c(unsigned char temp)
    {
        SSPBUF = temp;                 //  truyen du lieu vao bo dem (sau do qua trinh dich bit se bat dau)
        wait_comp();                   //  doi truyen song
    }
    
                //  chuong trinh con ghi du lieu len ds1307 (slave)
    void writer_ds1307(unsigned char addr_slave , unsigned char addr_data , unsigned char data )
    {
        start_i2c();                //  khoi dong duong truyen i2c
        writer_i2c(0xD0);               //   gui dia chi cua ds1307 len duong truyen, dong thoi kem theo bit cuoi cung de bao la se ghi len ds1307
        writer_i2c(addr_data);             //  gui dia chi cua du lieu can ghi len slave
        writer_i2c(data);                  //  gui du lieu len slave
        stop_i2c();                        //  ket thuc qua trinh ghi
    
    }
    
                //   chuong trinh con doc du lieu tu ds1307
    unsigned char read_ds1307(unsigned char addr_slave , unsigned char addr_data )
    {
        unsigned char temp;
        start_i2c();
        writer_i2c(0xD0);                  //  gui dia chi cua ds1307 len duong truyen, dong thoi kem theo bit cuoi cung de bao la se ghi dia chi cua du lieu con doc
        writer_i2c(addr_data);             //   dia chi cua du lieu can doc
        restart_i2c();                     //  gui lenh restart  de bat dau doc du lieu tu o nho can doc
        writer_i2c(0xD1);                  //  gui dia chi cua ds1307 len duong truyen i2c dong thoi kem theo bit de bao la master se doc tu slave
        while( R_W );                      //
        RCEN = 1;                          //  cho phep nhan du lieu
        wait_comp();
        send_nask();                       //   phat bit not asknowledge de bao khong doc nua
        stop_i2c();                        //  gui bit stop de bao ket thuc qua trinh giao tiep i2c
        temp = SSPBUF;
        return(temp);                    //  return  du lieu da doc duoc tu slave
    }
    
    /*===========      ket thuc qua trinh giao tiep voi slave     ==================
     ===============================================================================*/
    
                //   chuong trinh con phuc vu ngat
    void interrupt isr(void)
    {
        static unsigned char count = 0;
        if(T0IF == 1)
        {
            T0IF =0;          //  xoa co ngat di
            count++;
            TMR0 = -200;
            PS2 = PS1 = PS0 = 1; //  chon ty so chia tan la 1:256
            if(count == 5)
            {
                led = ~led;
                count =0;
            }
        }
    }
                //   chuong trinh con tao tre thoi gian
    void delay(unsigned int time)
    {
        while(time--)
        {
            // lam gi o day thi lam
        }
    }
                //  chuong trinh chinh bat dau tu day
    void main()
    {
        config();
        writer_ds1307(0xD0 , 0x07 , 0x10 );       // 00010000 cau hinh de cho chan Sout cua ds1307 hoat dong
        PORTD = read_ds1307(0xD0, 0x07);
        while(1)
        {
            //
    
        }
    
    }
    test của mình là thử ghi giá trị vào thanh ghi 0x07 rồi đọc lại, nhưng đọc rồi xuất ra port thì thấy không được ? chả biết có ghi được không
    mạch mô phỏng đây :
    I2C_RTC_DS1307.X.7z
    thank

Về tác giả

Collapse

huuthobka Tìm hiểu thêm về huuthobka

Bài viết mới nhất

Collapse

Đang tải...
X