Thông báo

Collapse
No announcement yet.

[hỏi] hàm tạo trễ

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

  • [hỏi] hàm tạo trễ

    em viết bằng phần mềm keil C chương trình cứ sau 2000us thì kích một xung chương trình như sau :
    #include<reg51.h>
    sbit xung = P1^0;
    void delay_us(unsigned long x)
    {
    unsigned long i ;
    for(i=0;i<x;i++);

    }
    void main(void)
    {
    while(1)

    {
    xung = 0;
    delay_us(2000);
    xung = 1 ;


    }

    }

    Nhưng khi chạy thì khoảng thời gian kích xung lại không như vậy , thời gian kích xung ngắn nhất là 0.1s Click image for larger version

Name:	untitled.JPG
Views:	1
Size:	602.4 KB
ID:	1419878

  • #2
    Bởi vì hàm delay sai tè me hột le. Mỗi lần long i nó tăng được 1 phải mất mấy lệnh ASM. Nhân với 2000 lần thì nó ra không biết là bao nhiêu nữa, chưa kể là CISC nhiều lệnh mất 2 chu kì máy => sai. ( Chưa tính mô phỏng dùng thạch anh sai ).

    Comment


    • #3
      Vậy em muốn tạo delay chuẩn bởi ngôn ngữ C thì phải viết như thế nào ạ ? thạch anh là 12M ?

      Comment


      • #4
        Nguyên văn bởi datinhtt Xem bài viết
        Vậy em muốn tạo delay chuẩn bởi ngôn ngữ C thì phải viết như thế nào ạ ? thạch anh là 12M ?
        Nếu liên quan đến xung thì tốt nhất là dùng timer ấy, chứ delay thì .... haiz. Bạn tìm hiểu về timer đi vì có vô vàn ứng dụng mà nếu không có timer vẫn chạy được nhưng nếu dùng timer thì cho tính chính xác cao mà lại dễ lập trình hơn rất nhiều.

        Comment


        • #5
          Timer hay cách bình thường đều cho kết quả như nhau, đều là tương đối. Với cách tự tính hàm delay chỉ có cách tính sơ lược, viết áng chừng rồi bug dần đến khi nào đúng nhất.

          Comment


          • #6
            Nguyên văn bởi duong_act Xem bài viết
            Timer hay cách bình thường đều cho kết quả như nhau, đều là tương đối. Với cách tự tính hàm delay chỉ có cách tính sơ lược, viết áng chừng rồi bug dần đến khi nào đúng nhất.
            Nói rằng chỉ là tuơng đối, đúng thôi nhưng dám khẳng đinh timer độ chính xác sẽ cao hơn. Chỉ cần tần số không bị quá cao dẫn đến ngắt đè ngắt thì trong truơng chình phục vụ ngắt thời gian ta không cho dừng đếm timer thì độ chính xác của timer có thể ở tần số khoảng 40khz mà chỉ sai khoảng +-10 xung, thế chắc chắn là khá đủ rồi bác nhỉ?

            Comment


            • #7
              Chuẩn rồi. Nhưng mình nghĩ là hơn 10 xung. Với hơn 10 xung thì delay thường thừa sức .
              Last edited by duong_act; 08-12-2013, 22:47.

              Comment


              • #8
                Không hơn 10 xung đâu bác ạ, hôm trước mình thử đếm "tất nhiên là đồ tự chế dùng 1307 tạo ngắt 1s" mà hôm đó thử điều chế PWM để 50Khz hình như sai cỡ 15 xung thì phải nên 40k chắc chỉ khoảng 10 xung thôi. Quan trọng là nếu dùng delay tính toán không sung sướng gì thì chớ lại còn phải debug để kiểm tra thực tế nữa thì có vẻ như mệt mỏi hơn so với dùng timer nhiều, lại còn chưa nói đến khi dùng biến long để tạo tần số cỡ Hz thì thời gian debug khác, nếu dùng biến int để tạo tần số cao hơn chút nữa thì thời gian bug lại khác, nên tốt nhất là dùng timer, vì mình quét hầu hết mọi thứ bằng timer nên cũng muốn các bạn này dùng đến timer để sau này nếu có bài hướng dẫn quét các thứ bằng timer thì có thể hiểu đựoc luôn.

                Comment


                • #9
                  câu nói " long để tạo tần số cỡ Hz" khác int như thế nào nhỉ(biến long nó rộng hơn biến int về dải số phải không nhỉ) ? em không hiểu rõ lắm , nói như vậy thì tạo xung với tần số tần số càng thấp thì sai số càng nhiều chứ , tần số thấp > thời gian delay cao > sai số nhiều ! (debug là gì ạ )

                  Comment


                  • #10
                    Nguyên văn bởi myth-coder Xem bài viết
                    Không hơn 10 xung đâu bác ạ, hôm trước mình thử đếm "tất nhiên là đồ tự chế dùng 1307 tạo ngắt 1s" mà hôm đó thử điều chế PWM để 50Khz hình như sai cỡ 15 xung thì phải nên 40k chắc chỉ khoảng 10 xung thôi. Quan trọng là nếu dùng delay tính toán không sung sướng gì thì chớ lại còn phải debug để kiểm tra thực tế nữa thì có vẻ như mệt mỏi hơn so với dùng timer nhiều, lại còn chưa nói đến khi dùng biến long để tạo tần số cỡ Hz thì thời gian debug khác, nếu dùng biến int để tạo tần số cao hơn chút nữa thì thời gian bug lại khác, nên tốt nhất là dùng timer, vì mình quét hầu hết mọi thứ bằng timer nên cũng muốn các bạn này dùng đến timer để sau này nếu có bài hướng dẫn quét các thứ bằng timer thì có thể hiểu đựoc luôn.
                    Bao nhiêu xung bạn phải Dis assembly ra mà đếm. Tính toán thời gian thì cũng là cái đơn giản rồi. Bug vài lần là OK.

                    Comment


                    • #11
                      Nguyên văn bởi datinhtt Xem bài viết
                      câu nói " long để tạo tần số cỡ Hz" khác int như thế nào nhỉ(biến long nó rộng hơn biến int về dải số phải không nhỉ) ? em không hiểu rõ lắm , nói như vậy thì tạo xung với tần số tần số càng thấp thì sai số càng nhiều chứ , tần số thấp > thời gian delay cao > sai số nhiều ! (debug là gì ạ )
                      Tần số càng thấp => chu kì càng lớn => Tỷ lệ sai số càng nhỏ.

                      Comment

                      Về tác giả

                      Collapse

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

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

                      Collapse

                      Đang tải...
                      X