Thông báo

Collapse
No announcement yet.

Hỏi Về Cách Giao Tiếp Giữa Vdk Với Ic Thời Gian Thực

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

  • #16
    Mình đang ráp thử mạch đồng hồ dùng ds12887.Nhưng thật khó để đọc dữ liệu giờ,phút,dây trong 12887 quá.
    Mình thấy bạn big_sky có lẽ rành nó lám.Mình nhờ bạn chỉ giáo vài chiêu nhé.
    Mình nối chân as của 12887 vào chân khác mà ko nối vào chân ALE của 89c51.Như vậy có thể đọc được dữ liệu từ 12887 ko bạn?
    Vì mình thấy một số tài liệu thì lại cấp xung cho chân as bằng lệnh(thông qua một chân nào đó).
    Mình chưa hiểu rõ vấn đề này lắm.Mong các bạn giúp đỡ nhiều.
    Chúc các bạn ngày cuối tuần thật vui và có nhiều phát minh mới nhé.

    Comment


    • #17
      Rtc

      Nguyên văn bởi LacTu Xem bài viết
      mình muốn làm một cái đồng hồ số hiện thị thứ giờ phút giây , nhưng chỉ làm bằng VDK thì nó chạy ko nổi, nghe người ta nói phải dùng con IC thời gian thực
      chạy mới chính xác
      VẬY :ai có sơ đồ mạch giao tiếp giữa VDK với IC realtime cho tui xin , hoạc chỉ cách giao tiếp với IC thời gian thực cũng dc , xin chân thành cảm ơn
      rất mong nhận dc hồi âm của các bạn, thanks so much


      CẨN BÚT
      LacTu is online now Report Post Edit/Delete Message
      bạn xem sơ đồ này nhé
      mạch đã chạy ok rồi đó
      chúc thành công
      Attached Files
      0945061338(vocam.h@gmail.com,lehanhdtk3@gmail.com)
      ||
      PROGRAMING(C,ASM),HARDWARE,LMD,RTC,GPRS,GPS....ALL OF VDK

      Comment


      • #18
        pác nào có code giao tiếp at24c64 với 8051 không !
        chỉ giáo giùm với
        mail: vocam.h@gmail.com
        0945061338(vocam.h@gmail.com,lehanhdtk3@gmail.com)
        ||
        PROGRAMING(C,ASM),HARDWARE,LMD,RTC,GPRS,GPS....ALL OF VDK

        Comment


        • #19
          Nguyên văn bởi vo_cam Xem bài viết
          pác nào có code giao tiếp at24c64 với 8051 không !
          chỉ giáo giùm với
          mail: vocam.h@gmail.com
          Bạn xem file gởi kèm nhé.

          I2C.h

          #include <at89x52.h>
          //#include <reg51.h>
          typedef unsigned char uchar;
          typedef unsigned int uint;

          //#define eechar uchar idata // data space for read, write eeprom
          #define eechar uchar idata // data space for read, write eeprom
          //typedef uchar idata echar; // not equal above, errorious !!!


          #define I2CWAIT _nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_nop_(),_n op_(),_nop_(),_nop_()
          // 6cycle wait time at 14.7456MHz

          #define WRITEPAGE 0x3 // 8 bytes page size

          //sbit SSCL = P2_7;
          //sbit SSDA = P2_6;
          //sbit SSCL = 0xA7;
          //sbit SSDA = 0xA6;

          //#ifdef _QB_ //QB TT
          // #define SSCL P1_0
          // #define SSDA P1_1
          //#else //MON51
          // #define SSCL P3_3
          // #define SSDA P3_5
          //#endif
          // QB GCOM
          #define SSCL P3_5
          #define SSDA P3_3


          #define I2CSIZE 0x2000
          #define FIRMWARESIZE 0x1ff8

          extern bit Seepromwrite( uint adr, eechar *s, uchar n );
          extern bit Seepromread( uint adr, eechar *s, uchar n );

          uchar Si2c_in( bit ack );
          bit Si2c_out( uchar b );
          bit Si2c_stop(void);
          void Si2c_start(void);

          I2C.C

          //#define _24C16_ //use 24c16 or 24c64
          #pragma cd pl(30000)
          #include<intrins.h>
          //#include<reg51.h>
          #include<i2c.h>
          #include<stdio.h>

          uchar Si2c_in( bit ack ){
          uchar i = 8, b;
          SSDA = 1;
          do{
          I2CWAIT;
          SSCL = 1;
          I2CWAIT;
          b <<= 1; // shift 0 in
          if( SSDA )
          b++; // set to 1
          SSCL = 0;
          }while( --i );
          SSDA = ack;
          I2CWAIT;
          SSCL = 1;
          I2CWAIT;
          SSCL = 0;
          return b;
          }

          bit Si2c_out( uchar b ){
          uchar i = 9;
          do{
          SSCL = 0;
          SSDA = b & 0x80; // SSDA = boolean
          b = (b << 1) + 1;
          I2CWAIT;
          SSCL = 1;
          I2CWAIT;
          }while( --i );
          {
          bit ack = SSDA;
          SSCL = 0;
          return ack; // 1 = NACK, 0 = ACK
          }
          }

          bit Si2c_stop(void){
          SSDA = 0;
          I2CWAIT;
          SSCL = 1;
          I2CWAIT;
          SSDA = 1;
          _nop_(); // time to go high
          return ~SSDA; // 1 = Error, SDA not high
          }

          void Si2c_start(void){
          SSDA = 1;
          SSCL = 1;
          I2CWAIT;
          SSDA = 0;
          I2CWAIT;
          SSCL = 0;
          }

          #ifdef _24C16_
          bit Seepromadr(uchar adrh , uchar adrl, bit rd ){
          adrh &= 7; // mask 2kByte
          adrh *= 2; // shift
          adrh |= 0xa0; // + I2C device address
          adrh |= rd; // + read bit
          Si2c_start();
          if( Si2c_out( adrh )){
          return 1;
          }
          if( !rd )
          return Si2c_out( adrl ); // if write, then next byte = low address
          return 0;
          }
          #else
          bit Seepromadr(uchar adrh , uchar adrl, bit rd ){
          Si2c_start();
          if( Si2c_out( 0xA0|rd )){
          // puts("No ack 1 !");
          return 1;
          }
          if( !rd ){
          if( Si2c_out( adrh )){
          // puts("No ack 2 !");
          return 1;
          }
          return Si2c_out( adrl ); // if write, then next byte = low address
          }
          return 0;
          }
          #endif

          bit Seepromwrite( uint adr, eechar *s, uchar n ){
          uchar i;
          do{
          for( i = 255;; ){
          if( 0 == Seepromadr( adr>>8, adr, 0) )
          break; // receive ACK = write finished
          Si2c_stop();
          if( 0 == --i ) // try it 25.5msec
          return 1; // Timeout
          }
          if( 0 == n )
          return Si2c_stop(); // all bytes written
          i = adr & ((1 << WRITEPAGE) - 1); // prepare write boundary check
          do{
          if( Si2c_out( *s )){
          Si2c_stop();
          return 1; // Write error
          }
          s++;
          adr++;
          }while( --n && ++i < (1 << WRITEPAGE));
          Si2c_stop();
          }while(1);
          }

          bit Seepromread( uint adr, eechar *s, uchar n ){
          if( Seepromadr( adr>>8, adr, 0)){
          Si2c_stop();
          return 1; // EEPROM not connected
          }
          do{
          if( Seepromadr( adr>>8, 0, 1)){ // repeat start for read
          Si2c_stop();
          return 1;
          }
          for({
          bit ack = --n && ++adr & 0xff; // last byte or last in page
          *s = Si2c_in( !ack ); // NACK on last byte
          s++;
          if( !ack )
          break;
          }
          }while( n );
          return Si2c_stop();
          }
          Attached Files

          Comment


          • #20
            cảm ơn pác nhiều nhé!
            pác cho em hỏi thêm chút:
            truyền nhận dữ liệu của các con 24c01,24c32 và 24c64 có khác gì nhau không nhỉ!
            có phải khác nhau phần truyền địa chỉ không nhỉ?
            mình test trên proteus mô phỏng giao tiếp với 24c01 ngon lành
            nhưng chuyển sang cho 24c64 thì im hẳn.
            mình viết bằng asm,đã có phần cứng rồi
            giao tiếp với ds1307 ngon lành
            chỉ có 24c64 thì không hiểu sao không ghi đọc được
            vậy pác chỉ giáo thêm cách truy xuất 24c64 dùng asm nhé,hoặc cho em link code tham
            khảo
            thanks nhiều!
            0945061338(vocam.h@gmail.com,lehanhdtk3@gmail.com)
            ||
            PROGRAMING(C,ASM),HARDWARE,LMD,RTC,GPRS,GPS....ALL OF VDK

            Comment


            • #21
              Tiếng anh mình còn tệ quá.Bác nào có tại liệu tiếng việt nói về con DS12887 cho mình xin nhé.Mình muốn làm 1 cái đồng hồ (dùng 89c51)treo cho vui nhà vui cửa,nhưng con DS12887 này thật khó sử dụng quá.
              Mong các bác giúp đỡ nhiều nhé.
              Thanks!

              Comment


              • #22
                Tìm hiểu DS12887

                Cảm ơn mấy anh chị thật nhiều.Để mình tìm hiểu các chương trình này và sữa lại chương trình của mình cho đúng.

                Comment


                • #23
                  Quên nữa.Mình còn thắc mắc chưa hiểu rõ.Sao chương trình của anh busy ko thấy các lệnh điều khiển các chân as,DS,RW vậy?Thật tình là mình chưa rõ điểm này lắm.
                  Mong anh busy giải thích cho mình thông suốt nó luôn nhé.

                  Comment


                  • #24
                    Nguyên văn bởi vo_cam Xem bài viết
                    cảm ơn pác nhiều nhé!
                    pác cho em hỏi thêm chút:
                    truyền nhận dữ liệu của các con 24c01,24c32 và 24c64 có khác gì nhau không nhỉ!
                    có phải khác nhau phần truyền địa chỉ không nhỉ?
                    mình test trên proteus mô phỏng giao tiếp với 24c01 ngon lành
                    nhưng chuyển sang cho 24c64 thì im hẳn.
                    mình viết bằng asm,đã có phần cứng rồi
                    giao tiếp với ds1307 ngon lành
                    chỉ có 24c64 thì không hiểu sao không ghi đọc được
                    vậy pác chỉ giáo thêm cách truy xuất 24c64 dùng asm nhé,hoặc cho em link code tham
                    khảo
                    thanks nhiều!
                    Vì bộ nhớ của 24C64 lớn hơn 24C01 nên địa chỉ cũng nhiều hơn 24C01 1 byte nên không thể dùng chung chương trình điều khiển được. Nếu bạn dùng ASM thì thêm một byte địa chỉ nữa là OK.

                    Comment


                    • #25
                      Nguyên văn bởi tc8051 Xem bài viết
                      Quên nữa.Mình còn thắc mắc chưa hiểu rõ.Sao chương trình của anh busy ko thấy các lệnh điều khiển các chân as,DS,RW vậy?Thật tình là mình chưa rõ điểm này lắm.
                      Mong anh busy giải thích cho mình thông suốt nó luôn nhé.
                      Con IC DS12887 giao tiếp //. VĐK coi nó như 1 bộ nhớ ngoài, nếu nối đúng chân cẳng của VĐK với DS12887 (AS,RW..) thì không cần lệnh điều khiển riêng vì lệnh MOVX - thao tác bộ nhớ ngoài đã làm hết cho rồi.

                      Nguyên văn bởi tc8051 Xem bài viết
                      Tiếng anh mình còn tệ quá.Bác nào có tại liệu tiếng việt nói về con DS12887 cho mình xin nhé.Mình muốn làm 1 cái đồng hồ (dùng 89c51)treo cho vui nhà vui cửa,nhưng con DS12887 này thật khó sử dụng quá.
                      Mong các bác giúp đỡ nhiều nhé
                      Con này dùng rất dễ mà. Bạn nối đúng chân như với bộ nhớ ngoài của VĐK. Thời gian trong datasheet đã quy định cụ thể, nó được chứa trong các ô nhớ của DS12887. Chỉ việc dùng lệnh MOVX để đọc và ghi các ô nhớ thôi.

                      @vo_cam: Bạn đã làm được con 24c01 thì cũng nên ngó datasheet của con 24c64 trước khi làm chứ.

                      email:mahaco@fpt.vn

                      Comment


                      • #26
                        Tìm hiểu DS12887

                        Mình hiểu rồi.
                        Có phải chân RD của vdk nối với chân ds của 12887 ko nhỉ
                        Và chân WR nối với chân RW của 12887?
                        và chân ALE nối với chân AS của 12887?
                        Và P0(89c51)nối với A0-A7 của 12887?
                        Nếu đúng vậy là mình có nhiều hy vọng rồi.
                        Cảm ơn các cao thủ nhiều lắm.

                        Comment


                        • #27
                          Chào anh big_sky.
                          Mình đã kết nối chân giống hệt như sơ đồ chân của anh rồi.Nhưng sau dữ liệu H,phút,giây vẫn chưa xuất ra được nhỉ.
                          Mình thiết kế mạch hiển thị led chạy cũng khá tốt rồi.Và còn nạp thử một chương trình trên mạng(của a busy chay ok rồi)nhưng vẫn ko thể cập nhật được thời gian.
                          Mong anh chỉ thêm một ít kinh nghiệm nữa nhé.Có còn bí quyết gì khác nũa ko anh?
                          Cảm ơn các anh!

                          Comment


                          • #28
                            cảm ơn các pác
                            đúng là em chủ quan nên nhầm phần địa chỉ 8 bit và 16 bit
                            giờ thì ổn rồi,
                            em thấy dùng ds1307 cũng dễ mà
                            dùng giao thức i2c chạy ok luôn!
                            0945061338(vocam.h@gmail.com,lehanhdtk3@gmail.com)
                            ||
                            PROGRAMING(C,ASM),HARDWARE,LMD,RTC,GPRS,GPS....ALL OF VDK

                            Comment


                            • #29
                              Thank

                              Mình cũng đang làm mạch đồng hồ và vấp phải cái sự sai số của mấy cái delay không thể làm thế nào cho nó chính xác được
                              Mình sẽ thử làm với con IC này xem thế nào
                              .: Lê Tiến Mạnh :.
                              Phone number : 0989 735 804
                              YM,Skype,mail : [leemanhj916]@gmail.com

                              Comment


                              • #30
                                Chào anh big_sky.
                                Mình đã kết nối chân giống hệt như sơ đồ chân của anh rồi.Nhưng sau dữ liệu H,phút,giây vẫn chưa xuất ra được nhỉ.
                                Mình thiết kế mạch hiển thị led chạy cũng khá tốt rồi.Và còn nạp thử một chương trình trên mạng(của a busy chay ok rồi)nhưng vẫn ko thể cập nhật được thời gian.
                                Mong anh chỉ thêm một ít kinh nghiệm nữa nhé.Có còn bí quyết gì khác nũa ko anh?
                                Cảm ơn các anh!
                                Pót thử nguyên mạch lên tôi xem rồi mới nhận xét được.
                                Khi viết chương trình cho DS12887 thì khi mới bật nguồn cần phải chờ 1 khoảng thời gian (khoảng 200ms) rồi khởi động cho DS12887 bằng cách ghi vào các thanh ghi A và B của nó tại địa chỉ 0AH và 0BH các giá trị cần thiết, sao đó là có thể đọc được rồi.
                                Nếu muốn chắc thì bạn thử ghi vào một ô nhớ nào đó trong ds12887 1 giá trị nào đó rồi đọc ra xem có chính xác không.
                                Ví dụ:
                                mov r0,#10h
                                mov a,#55h
                                movx @r0,a
                                movx a,@r0
                                cjne r0,#55h,rel

                                Nếu nhảy tới rel là không ghi được vào DS12887 rồi.

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X