Thông báo

Collapse
No announcement yet.

Kết nối PIC với EEPROM, DS1307 dùng chuẩn I2C ( hardware)

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

  • #16
    làm thế nào để biết ds1307 đã khởi tạo hay chưa

    Chào các bạn,
    có bạn nào biết, mình dựa vào thông số nào của ds1307 để biết được là ds1307 đã được khởi tạo giờ hay chưa, vd lúc mất điện và hết pin, khi khởi động lại ta cần kiểm tra xem giờ tron RTC còn không

    Comment


    • #17
      Nguyên văn bởi tranhuyky Xem bài viết
      Chào các bạn,
      có bạn nào biết, mình dựa vào thông số nào của ds1307 để biết được là ds1307 đã được khởi tạo giờ hay chưa, vd lúc mất điện và hết pin, khi khởi động lại ta cần kiểm tra xem giờ tron RTC còn không
      Bạn hãy set cho pin 7 (SQW) có xung vuông 1Hz xuất ra thì sẽ biết RTC có làm việc không

      Comment


      • #18
        có ai giúp mình với.tại sao mạch đồng hồ của bọn mình khi mới bật lên thì led hiện ô nhớ giây hiện số 80 và nó đứng im luôn mặc dù mình đã đưa 00 vào ô nhớ giây rùi.Chỉ khi vào hàm sửa để sửa ô nhớ giây thì nó chạy đúng bình thường nhưng khi tắt nguồn lâu thì nó lại bị như vậy. hic2.giúp mình với

        Comment


        • #19
          Bài viết rất hay! Thank a lot.

          Comment


          • #20
            bạn khởi tạo ds1307 , và chuẩn i2c với ngôn ngữ asm nhé.....mình muốn hiểu ngôn ngữ máy hơn....thank a lot

            Comment


            • #21
              Nguyên văn bởi linhnc308 Xem bài viết
              Bác Mạnh viết rất hay và cơ bản, ai mới học chắc đêu làm được. Đúng là viết bằng ASM thì hơi khó đọc cho ai mới làm để hiểu tương tận vấn đề, nhưng đừng vì thê mà nản. Tôi thấy ASM thật sự rất hay, no giúp ta hiêu tường tận về phần cứng hơn.
              - Việc giao tiếp với ngoại vi bên ngoài là một bài toán không thể thiếu khi làm việc với VDK. Rât may là PIC đã hỗ trợ khá nhiều về phần cứng, ta chi việc gọi ra và dùng nó. Về giao tiếp với các IC thời gian thực bằng I2C, trước đây tôi đã làm và dùng bằng CCS. Phai công nhận là viết bẳng CCS công việc dễ dàng hơn nhiều. Vấn đề chính của ta chi còn là việc tôi ưu phần mềm. Tôi định đưa code mà tôi đã viết lên nhưng tiếc là hôm nay trong USB chỉ có bản demo thôi, anh em thông cảm, hôm khăc sẽ pót sau. Trong bản chính có đầy đủ cả phần bàn phím chỉnh và hẹn giờ gồm 4 phím giống như ở đồng hồ Casio mà bạn hay dùng ý (mode - change - alarm set - clear status).
              Chi tiết về lập trình bạn có thể xem thêm trong datasheet của con DS1337 đề hiểu quá trình gửi lệnh.
              Chuc thành công!
              here is demo:

              #include <16F877A.h>
              #include <def_877a.h>
              #FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, NOWRT
              #use delay(clock=20000000)
              #use rs232(baud=4800,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=9)
              #use i2c(Master,Slow,sda=PIN_C4,scl=PIN_C3)

              int8 sec,min,hour,dow,date,month,year;
              int8 const maled7[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90 };
              int8 so[13]; //sec,min,hour,dow,date,month,year
              #bit key = 0x06.7
              void display() {
              int8 led1,led2,led3,led4,led5,led6,led7,led8,led9,led10 ,led11,led12;
              int8 temp1,temp2;
              i2c_start();
              i2c_write(0xD0);
              i2c_write(0x00); //set register pointer
              I2C_start();
              I2C_write(0xD1); /* write slave address + read */
              sec = i2c_read(1); /* starts w/last address stored in register pointer */
              min = i2c_read(1);
              hour = i2c_read(1) & 0x3F;
              dow = i2c_read(1);
              date = i2c_read(1);
              month = i2c_read(1) & 0x7F;
              year = i2c_read(0);
              i2c_stop();
              led1=sec & 0x0F;
              led2=(sec & 0xF0)>>4; //convert to BCD SEC
              led3=min & 0x0F;
              led4=(min & 0xF0)>>4; //convert to BCD MIN
              led5=hour & 0x0F;
              led6=(hour & 0xF0)>>4; //convert to BCD HOUR
              led7=date & 0x0F;
              led8=(date & 0xF0)>>4; //convert to BCD DATE
              led9=month & 0x0F;
              led10=(month & 0xF0)>>4; //convert to BCD MONTH
              led11=year & 0x0F;
              led12=(year & 0xF0)>>4; //convert to BCD YEAR
              // Sec - Min - Hour
              PortB=maled7[led1]; RD0=0;//LED1
              delay_us(200); if(key) RC2=0;
              RD0=1;
              PortB=maled7[led2]; RD1=0; //LED2
              delay_us(200); if(key) RC2=1;
              RD1=1;
              PortB=maled7[led3]; RD2=0;//Led3
              delay_us(200); if(key) RC2=0;
              RD2=1;
              PortB=maled7[led4]; RD3=0;//led4
              delay_us(200); if(key) RC2=1;
              RD3=1;
              PortB=maled7[led5]; RD4=0;//led5
              delay_us(200); RD4=1;
              PortB=maled7[led6]; RD5=0;//led6
              delay_us(200); RD5=1;//*/
              /*/ Date - Month - Year
              PortB=maled7[led7]; RD0=0;//LED1
              delay_us(200); RD0=1;
              PortB=maled7[led8]; RD1=0; //LED2
              delay_us(200); RD1=1;
              PortB=maled7[led9]; RD2=0;//Led3
              delay_us(200); RD2=1;
              PortB=maled7[led10]; RD3=0;//led4
              delay_us(200); RD3=1;
              PortB=maled7[led11]; RD4=0;//led5
              delay_us(200); RD4=1;
              PortB=maled7[led12]; RD5=0;//led6
              delay_us(200); RD5=1; */
              }

              void init_time() {
              int8 date,mth,year,dow,hour,min,sec;
              I2C_start(); /* The following Enables the Oscillator */
              I2C_write(0xD0); /* address the part to write */
              I2C_write(0x00); /* position the address pointer to 0 */
              I2C_write(0); /* write 0 to the seconds register, clear the CH bit */
              I2C_write(0x30); /* write slave address + write */
              I2C_write(0x52); /* hour = 101 0010 12h mode - time =12 */
              I2C_write(0x07); // Thoi gian ban dau la: 3/11/2005 - 12h/30ph/00sec
              I2C_write(0x03);
              I2C_write(0x11);
              I2C_write(0x05);
              I2C_stop();

              I2C_start(); // Write control and status register
              I2C_write(0xD0); // write slave address + write */
              I2C_write(0x0e); // write register address, control register */
              I2C_write(0x20); /* enable osc, bbsqi */
              I2C_write(0x00);
              I2C_stop();

              }

              void keyscan() {

              }
              void main() {
              int8 temp;
              int8 i;
              #bit key = 0x08.7

              setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
              set_timer0(0xC4);

              TrisB=0x00;//output
              TrisD=0x00;
              TrisC=0x00;
              trisc0=1; //Set key input pin
              TMR0IF=0;
              RC2=1;
              if(key) {
              init_time(); //Thiet lap thoi gian ban dau
              sec=0;min=59;hour=19;
              }
              i2c_start();
              i2c_write(0xD0);
              i2c_write(0x00); //set register pointer
              I2C_start();
              I2C_write(0xD1); /* write slave address + read */
              temp = i2c_read(1); /* starts w/last address stored in register pointer */
              temp = i2c_read(1);
              temp = i2c_read(1);
              temp = i2c_read(1);
              temp = i2c_read(1);
              temp = i2c_read(1);
              temp = i2c_read(0);
              i2c_stop();

              while(1) {
              display();
              }
              }
              Chào bác Linhnc308.
              Sau khi đọc code của bác thì em làm thử đọc giây từ Ds1307 nhưng sao không thay gì.Em dùng lcd 4 bit để hiển thị có anh kèm theo (dùng lcd_lib_4bit.c)
              giao tiếp với potB (rb2 nối chân rs,rb3-en,rb4:7- d4:7 của lcd)
              Bác xem giúp code thế này có sai chổ nào ?
              Cám ơn bác trước

              #include <16f877a.h>
              #include <def_877a.h>
              #use delay(clock=20000000)
              #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
              #use I2C(master,sda=PIN_C4,scl=PIN_C3,address=0xd0,FORC E_HW)
              #fuses HS,NOWDT,NOPROTECT,NOLVP
              #include <lcd_lib_4bit.c>
              int8 giay,phut,gio,ngay,thang,nam,temp_Re;

              void main()
              {
              set_tris_B(0);
              Lcd_init();
              while (1)
              {
              i2c_start();
              i2c_write(0xD1); // Device address+read
              giay= i2c_read(0x00);// Now read from slave
              i2c_stop();
              printf(lcd_putchar,"%d",giay);
              delay_ms(200);
              }
              }

              Comment


              • #22
                Em có thắc mắc về vấn đề đọc dữ liệu trên DS1307! Bằng ASM

                Thưa các sư huynh, em đã có tham khảo theo bài của các anh rất kỹ lưỡng và một số bài khác nói về giao tiếp I2C cụ thể là trong trường hợp: gia tiếp với DS1307.
                --------------------------------
                Kết quả: em có thể ghi dữ liệu vào DS1307, nhưng không thể đọc ra được. Nói chính xác hơn là đọc ra sai! Cụ thể như sau:
                --------------------------------
                1_Em nạp dữ liệu vào DS1307 từ 0x00 đến 0x07.




                2_Kiểm tra bằng KIT developing thì thấy có dao động ở chấn SQW=> nạp dữ liệu vào control byte (địa chỉ 0x07) của IC DS1307 là chính xác.( Cụ thể hơn em nạp giá trị 0x10 vào control byte =>xung 1Hz;...)=>chứng tỏ là ghi dư liệu được và là ghi đúng!


                3_Em xuất đúng ngay tại giá trị control byte (tức là bằng 0x10) thì khi đọc thanh ghi SSPBUF sau khi waitMSSP la sai!!



                4_Em cũng đã thử rất nhiều lần với nhiều thanh ghi khác của RTC, nhưng kết quả truy xuất lại đều vô vọng. Em cũng có tra cai flowchart phần ghi và nhận của PIC về I2C master mode trong datasheet 16F887A(trang số 315 và 317). Nhưng em thấy nó đúng!(sau khi thiết lập mọi thứ; chỉ cần SET SREN thôi).

                ------------------------------------------
                Đó là những thăc mắc của em, em cũng đã suy nghĩ rất nhiều về vấn đề đó và em cũng đã thử và rút ra là:
                -có thể sau mỗi lần nhận thì ACK phát ra từ PIC đến RTC có ành hưởng j đến SSPBUF ko?
                -Có lần thí nghiệm em đã có thể nhận được 4 bit đầu là chính xác!(chạy debug và KT thanh ghi bằng Watch trong MPLAB), nhung 4 bit sau la FFFF trong khi DS1307 chỉ đếm BCD thôi=> có thể xung clk không đồng bộ dẫn đến dữ liệu nhận sai? Thiết lập của em la hoàn toàn bình thường: thạch anh 4Mhz cho PIc; 32768 cho RTC; tao xung clk đồng bộ 100 Khz....
                -Em cũng đã kham khảo ý kiến của thầy trong trường nhưng coi bộ khó có giải đáp!
                --------------------------------------------
                Em biết là đã làm mất thời gian của các anh rất nhiều nhưng mong anh giúp đỡ em. Em rất muốn hiểu rõ hơn nữa về PIC. Cái này là ĐAMH1 của em: nó chỉ chiếm có 1 trình thôi, tuy vậy em cố gắng thực hiện có KQ ko vì điểm số chỉ vì hiểu biết và đam mê.
                -----------------------------------------------
                Mong anh hồi âm cho em để em có thể giảii quyết được vấn đề trên.
                -----------------------------------------
                Em có gửi theo cái ASM của em; hơi lung tung 1 tí (có thêm phần xuất LCD nhưng em đã làm chạy rồi). http://www.mediafire.com/download.php?iyhtwro5zrn
                ------------------------
                CHÂN THÀNH CÁM ƠN các ANH!!!

                Comment


                • #23
                  Lịch vạn niên có ngày âm

                  e đang thử nghiệm lịc vạn niên có ngày âm bằng PÍC6f877a và ds1307 hiển thị qua LCD 16x2.thực tế thì ngày dương và thời gian đã có nhiều nhưng ngày âm thì khó quá.mọi người giúp em thuật toán đổi ngày tháng dương qua âm lịch với..hix

                  Comment


                  • #24
                    Em mới làm quen với PIC nên có nhiều chỗ chưa hiểu, chưa thông, mong các anh (chị) giải đáp giúp em.
                    Trong đoạn code READ_BYTE có đoạn:
                    ;================================================= ========================
                    BSF STATUS,RP0 ; Set bit RP0 trong thanh ghi STATUS len 1
                    BTFSC SSPSTAT,2 ; Kiem tra bit R/W
                    GOTO $-1

                    BANKSEL SSPCON2
                    BSF SSPCON2,RCEN ; Cho phep RECEIVE Mode (I2C )
                    ; loi o cho nay day
                    CALL WaitMSSP

                    BCF STATUS,RP0
                    BCF PIR1,SSPIF ; Xoa co bao ngat SSPIF trong thanh ghi PIR1

                    CALL NACKBit ; Phat bit NACKBit ket thuc qua trinh nhan

                    CALL STOPBit
                    ;================================================= ========================
                    Em chưa hiểu được đoạn code trên hoạt động như thế nào, vai trò của từng bit ra sao?
                    Trong đoạn code thì có chỗ giải thích "loi o cho nay day", vậy lỗi đó là gì?
                    Ngoài ra khi nào thì mình sử dụng bit ACK, NACK?
                    Em xin chân thành cảm ơn!

                    Comment


                    • #25
                      chao anh linh
                      anh linh co code "bản chính có đầy đủ cả phần bàn phím chỉnh và hẹn giờ gồm 4 phím giống như ở đồng hồ Casio mà bạn hay dùng ý (mode - change - alarm set - clear status).,anh cho em doan code do di nhé.em dang can code hẹn giở dùng bàn phím,dung ds1307 và 16f87.
                      Dù chưa biết kết quả thế nào nhưng em cũng xin cam ơn anh trước nhé,nhớ send em đoạn code di.

                      Comment


                      • #26
                        e mun ket noi chip eprom vs pic 16f877a ...ket noi the nao va viet chuong trinh ra sao ai chi giup e....
                        tks nhm ạ

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        Đang tải...
                        X