Thông báo

Collapse
No announcement yet.

chia sẻ cách tạo code delay chính xác nhất

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

  • chia sẻ cách tạo code delay chính xác nhất

    đây là đoạn code tạo trễ tổng quát
    delay :
    push 5
    push 6
    push 7
    mov r5,#m
    mov r6,#n
    mov r7,#p
    djnz r7,$
    djnz r6,$-4
    djnz r5,$-8
    pop 7
    pop 6
    pop 5
    ret
    với m,n,p là số tự nhiên từ 1 đến 255
    khi đó chu kì máy sau khi chạy hết vòng lặp là ((2p+1)xn+2n+1)xm+2m+1 (MC)
    làm thế nào để tìm m,n,p cho chính xác nhất
    mình đã tạo 1 code c để tìm m,n,p với độ chính xác khá cao như sau
    //tinh chu ki delay
    #include<conio.h>
    #include<stdio.h>
    void main()
    {
    clrscr();
    float m, n,p;
    float m1,m2,t;
    float tem=1,tem2,n1,p1;
    float i,j;
    printf ("nhap so chu ki may\n");
    scanf("%f",&t);
    printf("\nnhap n p \n");
    scanf ("%f",&n);
    scanf("%f",&p);
    for ( i=1;i<=n;i++)
    {
    for ( j=1;j<=p;j++)
    {

    m1=(t-1)/(3*i+3+2*j*i);


    m2=long ((t-1)/(3*i+3+2*j*i)); //lay phan nguyen

    tem2=m1-m2; // sai lech

    if (m1<=255&&tem2<=tem) { m=m1; n1=i ; p1=j;tem=tem2; }

    }

    }
    printf(" m=%f\n n=%f\n p=%f \n",m,n1,p1);

    getch();


    }

    vidu: nếu muôn delay 1s thì nhập : so chu ki may=1000000
    nhap n, p lân lượt 255
    255
    ket qua rat tròn m=63 n=230 p=33
    vì m tròn nên sai số là không có
    code delay nay chi sai 14 chu kì máy bởi 3 lệnh push (3x2=6 MC) và lệnh pop (2x3 MC) va 1 lênh ret ( 2 MC)
    nên sai số là 14us/1s =0.0014%
    Last edited by dinhlongbk93; 19-04-2014, 13:18.

  • #2
    bài này mình thấy có ích mà không ai bình luận nhị. cái code c nó ứng dung rất nhiều vào tính delay
    chia sẻ mà không ai quan tâm. chán ...

    Comment


    • #3
      Hì, bạn đưa ra 1 ví dụ bằng code Assembler, giải quyết lại bằng code C thì ai biết mà đọc được bạn.
      Thân!
      "Cái quý nhất của con người ta là sự sống. Đời người chỉ sống có một lần.Phải sống sao cho khỏi xót xa ân hận..."
      Lê lết, lay lất sống qua ngày! >:)

      Comment


      • #4
        Nguyên văn bởi BabyKid Xem bài viết
        Hì, bạn đưa ra 1 ví dụ bằng code Assembler, giải quyết lại bằng code C thì ai biết mà đọc được bạn.
        Thân!
        chắc bạn chưa hiểu rồi. bạn có thể viết delay chính xác thời gian tùy ý mà không dùng timer không?
        cụ thể dùng vòng lặp này:
        mov r5,#m
        mov r6,#n
        mov r7,#p
        djnz r7,$
        djnz r6,$-4
        djnz r5,$-8
        bài toán đặt ra ở đây là chọn m , n, p như thế nào để delay vói số giây nhất định,
        với vòng lặp trên thì mỗi vòng lặp có thể chạy tối đa 256 lần nếu chon m=n=p=0,
        như vậy có thể delay thời gian lên tới và hơn giây thì đủ sức dùng rồi,
        nếu 8051 có xung nhịp là 12mhz thì 1 chu kì máy là 1MC= 1us.
        lênh :
        mov Rn,#data có chu kì 1 MC
        djnz Rn,rel có chu kì là 2 MC
        vậy số chu kì trong vòng lặp trên là : (2p+1)n+2n+1)m+2m+1
        nếu muốn delay 1s =1000000 chu kì máy thì bạn chọn m ,n ,p như thế nào??? tính tay à , hay ước lượng khoảng nào đó. mình nói với bạn là sẽ sai lệch rất lớn lên cả nghìn MC, không tin thì cứ chọn m n p đi để mình kiểm tra cho ma xem. mà không đuọc dùng đoạn code c để tính nhé
        Last edited by dinhlongbk93; 24-04-2014, 19:34.

        Comment

        Về tác giả

        Collapse

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

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

        Collapse

        Đang tải...
        X