Thông báo

Collapse
No announcement yet.

không delay được đúng thời gian mong muốn

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

  • không delay được đúng thời gian mong muốn

    e đang tập viết cái code sao băng mà không hiểu sao không delay được đúng giá trị mong muốn
    code của em đây ạ,thuật toán nó lủng củng mọi người đừng cười nhé :
    Code:
    #include <REGX52.H>
    //thach anh 12 Mhz
    sbit c1=P0^0;
    sbit c2=P0^1;
    sbit c3=P0^2;
    sbit c4=P0^3;
    sbit c5=P0^4;
    sbit c6=P0^5;
    sbit c7=P0^6;
    sbit c8=P0^7;
    sbit c9=P1^0;
    sbit c10=P1^1;
    sbit c11=P1^2;
    sbit c12=P1^3;
    sbit c13=P1^4;
    sbit c14=P1^5;
    sbit c15=P1^6;
    sbit c16=P1^7;
    sbit c17=P2^0;
    sbit c18=P2^1;
    sbit c19=P2^2;
    sbit c20=P2^3;
    sbit c21=P2^4;
    sbit c22=P2^5;
    sbit c23=P2^6;
    sbit c24=P2^7;
    
    unsigned char i,j,k;
    //ham delay 0.1 ms
         void delay_01ms(unsigned int time)
    {  while(time--)
    {  unsigned char ck=13;
       while(ck--);
       }
       }
    void saobang(void)
       { unsigned char b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,b10,b11,b12,b13,b14,b15,b16,b17,b18,b19,b20,b21,b22,b23;
       	 unsigned char code a[24][24]=
           {
    {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0},
    {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0}
             };
       for ( k=0;k<24;k++)
       {   b0=k;
           b1=k+1;
           if (b1>23)
           b1=b1-24;
    	   b2=k+2;
    	   if (b2>23)
    	   b2=b2-24;
    	     b3=k+3;
    	   if (b3>23)
    	   b3=b3-24;
    	     b4=k+4;
    	   if (b4>23)
    	   b4=b4-24;
    	     b5=k+5;
    	   if (b5>23)
    	   b5=b5-24;
    	     b6=k+6;
    	   if (b6>23)
    	   b6=b6-24;
    	     b7=k+7;
    	   if (b7>23)
    	   b7=b7-24;
    	     b8=k+8;
    	   if (b8>23)
    	   b8=b8-24;
    	     b9=k+9;
    	   if (b9>23)
    	   b9=b9-24;
    	     b10=k+10;
    	   if (b10>23)
    	   b10=b10-24;
    	     b11=k+11;
    	   if (b11>23)
    	   b11=b11-24;
    	     b12=k+12;
    	   if (b12>23)
    	   b12=b12-24;
    	     b13=k+13;
    	   if (b13>23)
    	   b13=b13-24;
    	     b14=k+14;
    	   if (b14>23)
    	   b14=b14-24;
    	     b15=k+15;
    	   if (b15>23)
    	   b15=b15-24;
    	     b16=k+16;
    	   if (b16>23)
    	   b16=b16-24;
    	     b17=k+17;
    	   if (b17>23)
    	   b17=b17-24;
    	     b18=k+18;
    	   if (b18>23)
    	   b18=b18-24;
    	     b19=k+19;
    	   if (b19>23)
    	   b19=b19-24;
    	     b20=k+20;
    	   if (b20>23)
    	   b20=b20-24;
    	     b21=k+21;
    	   if (b21>23)
    	   b21=b21-24;
    	     b22=k+22;
    	   if (b22>23)
    	   b22=b22-24;
    	     b23=k+23;
    	   if (b23>23)
    	   b23=b23-24;
    
       for (i=0;i<8;i++)
       {
          for (j=0;j<24;j++)
    	  {	   c1=a[b0][j];
    		   c2=a[b1][j];
    		   c3=a[b2][j];
    		   c4=a[b3][j];
    		   c5=a[b4][j];
    		   c6=a[b5][j];
    		   c7=a[b6][j];
    		   c8=a[b7][j];
    		   c9=a[b8][j];
    		   c10=a[b9][j];
    		   c11=a[b10][j];
    		   c12=a[b11][j];
    		   c13=a[b12][j];
    		   c14=a[b13][j];
    		   c15=a[b14][j];
    		   c16=a[b15][j];
    		   c17=a[b16][j];
    		   c18=a[b17][j];
    		   c19=a[b18][j];
    		   c20=a[b19][j];
    		   c21=a[b20][j];
    		   c22=a[b21][j];
    		   c23=a[b22][j];
    		   c24=a[b23][j];
    		   delay_01ms(1);
    	   
    	  }
    	  }
    	  }
    	  }
    	void main()
    	{
    	while(1)
    	{
    	saobang();
    	}
    	}
    đáng lẽ chu kỳ xung phải là 0.1x24=2.4 ms nhưng không hiểu sao e mô phỏng được tới 17ms luôn @@
    mọi người giúp em với! Click image for larger version

Name:	Capture.JPG
Views:	1
Size:	83.3 KB
ID:	1419144
    TaiDangAtm

  • #2
    chưa nói tới thuật toán đã thấy sai cơ bản về ram của 89. RAM 89x52 cùng lắm thì có đc hơn 200 byte, cái mảng 24x24=576 byte thì là sao chạy đúng

    Comment


    • #3
      híc,cảm ơn a,thế giờ tách cái mảng lớn thành 24 mảng con thì có được ko a?
      TaiDangAtm

      Comment


      • #4
        Nguyên văn bởi Đặng Văn Tài Xem bài viết
        híc,cảm ơn a,thế giờ tách cái mảng lớn thành 24 mảng con thì có được ko a?
        bỏ cái mảng đó vô ROM

        Comment


        • #5
          a có thể chỉ e cái được ko ạ?
          tại thằng bạn nhờ làm cái gì gì đó cho 20/10
          nên e đọc cấp tốc 8051 chứ cũng chưa biết gì
          hôm trước e cũng viết 1 cái cũng mảng 8x64=512 thấy delay nó bị sai nhiều,té ra là thế @@
          nhưng may là nó vẫn chạy
          TaiDangAtm

          Comment


          • #6
            mọi người giúp em tí với
            TaiDangAtm

            Comment


            • #7
              Nguyên văn bởi chung1608 Xem bài viết
              chưa nói tới thuật toán đã thấy sai cơ bản về ram của 89. RAM 89x52 cùng lắm thì có đc hơn 200 byte, cái mảng 24x24=576 byte thì là sao chạy đúng
              Bác không thấy chữ "code" sao @@.

              Comment


              • #8
                mọi người giúp em xíu đi,e làm cái này từ ý tưởng của a Huy Tiến..dùng mảng để pwm mà e đọc ko hiểu nên e chế lại thành thế này
                TaiDangAtm

                Comment


                • #9
                  Code:
                  if(bx>23)
                     bx=bx-23;
                  sao không phải là:
                  if(bx>23)
                      bx=0;
                  hoặc chỉ đơn giản là:
                  bx=bx%24;
                  viết gọn là 
                  bx%=24;
                  mà thực sự chỉ có cách này mới tạo đựoc sao băng?

                  Comment


                  • #10
                    Tại e thấy kiểu này là dễ hiểu nhất
                    TaiDangAtm

                    Comment


                    • #11
                      Nguyên văn bởi Đặng Văn Tài Xem bài viết
                      Tại e thấy kiểu này là dễ hiểu nhất
                      Dễ hiểu? thuật toán rối tung mù mà dễ hiểu? Nếu bx lớn hơn 23 thì bx bằng bx - 23, như vậy là xét từ 24 trở đi, thì bx quay trở lại giá trị 1? nếu vậy thì sửa cái của tớ đi dạng như
                      Code:
                      if(bx>23)
                         bx=1;
                      thế có phải chính xác hơn không? mà thuật toán rõ ràng?
                      còn như của cậu thế có thể nói là không đúng vì nếu bx=100 hoặc 200 hoặc những giá trị khác nữa thì tính sao? vì đó là biến cục bộ, cậu không khởi tạo giá trị mà nếu vậy thì giá trị là ngẫu nhiên, nó có thể là bất cứ thứ gì. nên giá trị của bx nếu đầu tiên là khoảng 200 thì sau lượt chạy đầu của vòng lặp bx=200-23, sau lượt chạy 2 bx=200-23*2, cứ như vậy thì giá trị của bx là không thể kiểm soát được và đã vượt qua biên của mảng.

                      Comment


                      • #12
                        bởi vì k chạy từ 0 đến 23 mà?
                        tối đa bx chỉ đến 23+23=46 thôi chứ?
                        lúc đó bx lại quay về 23
                        nếu lalmf như bạn thì lúc k=2 , b23 = 23+2 = 25 => b23 =0
                        cái mình muốn là b23 phải bằng 1 chứ?
                        để nó xoay vòng mà?
                        TaiDangAtm

                        Comment


                        • #13
                          Nguyên văn bởi Đặng Văn Tài Xem bài viết
                          bởi vì k chạy từ 0 đến 23 mà?
                          tối đa bx chỉ đến 23+23=46 thôi chứ?
                          lúc đó bx lại quay về 23
                          nếu lalmf như bạn thì lúc k=2 , b23 = 23+2 = 25 => b23 =0
                          cái mình muốn là b23 phải bằng 1 chứ?
                          để nó xoay vòng mà?
                          ừ xin lỗi mình không để ý có khởi tạo bx=k+x; có điều bạn thử phân tích lại bi toán xem không lẽ không có cách nào khác?

                          Comment


                          • #14
                            mà bạn xem giúp mình tại sao ko delay đc với,nếu để như thế rồi tăng tần số thạch anh với giảm chu kì máy thì chu kì giảm được 1 chút
                            nhưng vẫn ko đúng @@
                            TaiDangAtm

                            Comment


                            • #15
                              Nguyên văn bởi Đặng Văn Tài Xem bài viết
                              mà bạn xem giúp mình tại sao ko delay đc với,nếu để như thế rồi tăng tần số thạch anh với giảm chu kì máy thì chu kì giảm được 1 chút
                              nhưng vẫn ko đúng @@
                              Cậu không nghĩ những lệnh số học kia cũng cần time à? mà 0.1ms có nghĩa là 100us? nếu thế sao không thử đơn giản như
                              Code:
                              delay100us()
                              {
                                  unsigned char time=100;
                                  ;
                                  while(time--);
                              }
                              //hoặc có thể là
                              #include <intrins.h>
                              
                              delay100us()
                              {
                                  unsigned char time=100;
                                  ;
                                  while(time--)
                                     _nop_();
                              }
                              rồi xem nó hết bao nhiêu time?
                              nếu chưa được thì tăng lên hoặc giảm đi tùy theo nhu cầu.

                              Comment

                              Về tác giả

                              Collapse

                              Đặng Văn Tài Tìm hiểu thêm về Đặng Văn Tài

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

                              Collapse

                              Đang tải...
                              X