đẩy dữ liệu ra 595

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • mrcuongcon
    Thành viên tích cực
    • Oct 2007
    • 737

    #1

    đẩy dữ liệu ra 595

    Em muốn đẩy 4 Byte dữ liệu ra cho 4 chú 595 thì làm thế nào. Em đang dùng CODEversion AVR, các bac giúp em với.(Chú ý em đã hiểu rõ hoạt động của 595)
  • mrcuongcon
    Thành viên tích cực
    • Oct 2007
    • 737

    #2
    đây là chương trình em viết, nó hơi lộn xộn chút.
    while (1)
    {
    z++;y++;
    // đành phải dùng thanh ghi portb làm thanh ghi đệm
    PORTB=x;
    x=t;
    // lấy 1 bit dữ liệu đưa ra chân SDA
    PORTD.0=PORTB.7;
    // tạo một xung đến chân SCL
    PORTD.1=1;
    delay_ms(100);
    PORTD.1=0; // dịch bit

    x<<=y;
    delay_us(10);

    if (z==8){t=0b11111001;
    y=0;}
    if (z==16){t=0b10100100;
    y=0;}
    if (z==24){t=0b10110000;
    y=0;}
    if (z==33){
    while (1){};}

    // Place your code here
    };
    }
    Last edited by mrcuongcon; 19-12-2007, 10:21.

    Comment

    • mrcuongcon
      Thành viên tích cực
      • Oct 2007
      • 737

      #3
      em không định dc bit nên em phải dùng chân cổng PORTB để có thể định đc định chỉ Bit

      Comment

      • hoctro89xxx
        Thành viên tích cực
        • Mar 2006
        • 589

        #4
        Nguyên văn bởi mrcuongcon Xem bài viết
        Em muốn đẩy 4 Byte dữ liệu ra cho 4 chú 595 thì làm thế nào. Em đang dùng CODEversion AVR, các bac giúp em với.(Chú ý em đã hiểu rõ hoạt động của 595)
        Đã hướng dẫn bạn ở trong này
        http://dientuvietnam.net/forums/showthread.php?t=9310

        email:mahaco@fpt.vn

        Comment

        • hungnp
          Thành viên tích cực
          • Nov 2005
          • 178

          #5
          //khai báo các chân

          #define SHCP PORTB.0
          #define STCP PORTB.1
          #define DS PORTB.2
          void send595(unsigned char byte1,unsigned char byte2,unsigned char byte3,unsigned char byte4)
          {
          unsigned char i;
          unsigned int k;
          //send byte thu 1
          k=128;//send bit cao nhất đầu tiên.
          for(i=0;i<16;i++)
          {
          if((byte1 & k)==k)
          DS=1;//neu bit la 1 thi send 1 ra chan DS
          else
          DS=0;//Nguoc lai send 0
          SHCP=0; //
          delay_us(1); //
          SHCP=1; //
          delay_us(1); // các tín hiệu xung nhịp để 595 dịch giá trị ra ngõ ra

          STCP=1; //
          delay_us(1); //
          STCP=0; //
          delay_us(1); //các tín hiệu để ngắt việc gửi bít trước và bắt đầu gửi bít tiếp theo.
          k >>= 1; //chuẩn bị cho bít tiếp theo
          }
          //send byte thu 2
          k=128;
          for(i=0;i<16;i++)
          {
          if((byte2 & k)==k)
          DS=1;
          else
          DS=0;
          SHCP=0;
          delay_us(1);
          SHCP=1;
          delay_us(1);

          STCP=1;
          delay_us(1);
          STCP=0;
          delay_us(1);
          k >>= 1;
          }
          //send byte thu 3
          k=128;
          for(i=0;i<16;i++)
          {
          if((byte3 & k)==k)
          DS=1;
          else
          DS=0;
          SHCP=0;
          delay_us(1);
          SHCP=1;
          delay_us(1);

          STCP=1;
          delay_us(1);
          STCP=0;
          delay_us(1);
          k >>= 1;
          }
          //send byte thu 4
          k=128;
          for(i=0;i<16;i++)
          {
          if((byte4 & k)==k)
          DS=1;
          else
          DS=0;
          SHCP=0;
          delay_us(1);
          SHCP=1;
          delay_us(1);

          STCP=1;
          delay_us(1);
          STCP=0;
          delay_us(1);
          k >>= 1;
          }
          }

          Ban co the tim cach rut gon chuong trinh nay hon.

          Comment

          • mrcuongcon
            Thành viên tích cực
            • Oct 2007
            • 737

            #6
            Em thấy như thế này, khi xuất xung ra:
            SHCP=0;
            delay_us(1);
            SHCP=1;
            không cần phải có delay, em đã thử nghiệm rồi
            SHCP=0;
            SHCP=1;
            Và 595 hoạt động bình thường, với tần số hoạt động của ATMEGA16L la 4Mhz

            Comment

            • mrcuongcon
              Thành viên tích cực
              • Oct 2007
              • 737

              #7
              đây là chương trình em đã viết gọn lại:gửi 1 byte dữ liệu ra 595
              dữ liệu là PORTD.0, clock là PORTD.1


              k=128;
              data=0x0f;// 1 byte dữ liệu cần gửi

              for(i=0;i<9;i++)
              {
              if ((data & k)==k) PORTD.0=1;
              else PORTD.0=0;
              PORTD.1=0;
              PORTD.1=1;
              k>>= 1;
              }
              Last edited by mrcuongcon; 23-12-2007, 11:31.

              Comment

              • quoc_thaibk
                Thành viên tích cực
                • Mar 2006
                • 766

                #8
                Nguyên văn bởi mrcuongcon Xem bài viết
                đây là chương trình em đã viết gọn lại:gửi 1 byte dữ liệu ra 595
                dữ liệu là PORTD.0, clock là PORTD.1


                k=128;
                data=0x0f;// 1 byte dữ liệu cần gửi

                for(i=0;i<9;i++)
                {
                if ((data & k)==k) PORTD.0=1;
                else PORTD.0=0;
                PORTD.1=0;
                PORTD.1=1;
                k>>= 1;
                }
                Cậu nên dùng marco của C để định nghĩa các đường kích cho dễ đọc
                Ví dụ
                nếu PORTD.1 là đường latch thì cậu định nghĩa như vậy thì người khác khi nhìn code của cậu viết sẽ có thể sửa lỗi ngay mà không cần phải dò từ đầu chương trình
                #define LATCH PORTD.1

                Sông dài, Thuyền lớn, Biển rộng bao la.
                Tháo neo ngôn ngữ, lèo lái con thuyền kiến thức nhân loại.

                Comment

                • irf540
                  Thành viên tích cực
                  • Sep 2005
                  • 233

                  #9
                  //chang can delay gi het dau.
                  #define serin PORTB.5
                  #define clk PORTB.6
                  #define sclk PORTB.7
                  void spi(unsigned char _data)
                  {
                  unsigned char i;
                  for(i=0;i<8;i++)
                  {
                  serin=(_data>>i)&0x01;
                  clk=0;
                  clk=1;
                  }
                  sclk=0;
                  sclk=1;
                  }
                  Cty TNHH Cơ Điện tử Hiệp Phát.
                  ------------------------------------------
                  Trần Hoàng Giang
                  11-04-1985

                  Mobil: 0905 438 533

                  Comment

                  • Acxen_lupine
                    Thành viên tích cực
                    • Dec 2007
                    • 192

                    #10
                    Em là thành viên mới tinh, vừa "chào" diễn đàn 10 phút
                    Em thấy cách giải quyết của bác irf540 là chuẩn nhất
                    xin góp ý thêm: Fclock của 595 Max = 20MHz nên cần có thêm trễ đối với các AVR dùng tần số làm việc lớn hơn 20MHz
                    Mong các tiền bối chỉ giáo
                    Hôm nay trời nắng chang chang.
                    Mèo con đi học chẳng mang thứ gì.
                    Chỉ mang một cái bút chì.
                    Và mang một mẩu bánh mì con con.

                    Comment

                    • mrcuongcon
                      Thành viên tích cực
                      • Oct 2007
                      • 737

                      #11
                      He he . Tiếc là kô có con AVR nào làm việc với tần số trên 20 MHz cả !

                      Comment

                      • Acxen_lupine
                        Thành viên tích cực
                        • Dec 2007
                        • 192

                        #12
                        Ha ha. đấy là hiện tại thôi, tương lai thì phải khác chứ...
                        Hôm nay trời nắng chang chang.
                        Mèo con đi học chẳng mang thứ gì.
                        Chỉ mang một cái bút chì.
                        Và mang một mẩu bánh mì con con.

                        Comment

                        • traihole
                          Banned
                          • Jul 2007
                          • 50

                          #13
                          the nay hay hon nhieu
                          sbit Data = P2^2;
                          sbit Clock = P2^0;
                          sbit Strobe = P2^4;
                          void Dieukhien(unsigned char input){
                          unsigned char i;
                          Clock = 0;
                          for(i=0;i<8;i++){
                          if(input&0x01) Data = 1;
                          else Data = 0;
                          input>>=1;
                          Clock = 1;
                          Clock = 0;
                          }
                          }

                          Comment

                          • irf540
                            Thành viên tích cực
                            • Sep 2005
                            • 233

                            #14
                            Nguyên văn bởi traihole Xem bài viết
                            the nay hay hon nhieu
                            sbit Data = P2^2;
                            sbit Clock = P2^0;
                            sbit Strobe = P2^4;
                            void Dieukhien(unsigned char input){
                            unsigned char i;
                            Clock = 0;
                            for(i=0;i<8;i++){
                            if(input&0x01) Data = 1;
                            else Data = 0;
                            input>>=1;
                            Clock = 1;
                            Clock = 0;
                            }
                            }
                            hay gì mà hay
                            riêng mấy cái lệnh IF và ELSE đã thấy thừa thải rồi chớ đừng nói là hay nhât
                            một bài toán có rất nhiều cách giải quyết nhưng muốn tối ưu nhất là cả vấn đề.soure của tui tuy không hay nhất nhưng chắc là xử lý nhanh hơn đoạn code của bác.
                            #define serin PORTB.5
                            #define clk PORTB.6
                            #define sclk PORTB.7
                            void spi(unsigned char _data)
                            {
                            unsigned char i;
                            for(i=0;i<8;i++)
                            {
                            serin=(_data>>i)&0x01;
                            clk=0;
                            clk=1;
                            }
                            sclk=0;
                            sclk=1;
                            }
                            Cty TNHH Cơ Điện tử Hiệp Phát.
                            ------------------------------------------
                            Trần Hoàng Giang
                            11-04-1985

                            Mobil: 0905 438 533

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...