Thông báo

Collapse
No announcement yet.

nhờ anh em trong diễn đàn giúp mình cái timer0

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

  • #16
    Nguyên văn bởi doituquan Xem bài viết
    Anh Dương, trong chương trình em viết về timer0 chế độ bộ đếm, khi ko co xung tác động ở chân ra4 thì led sáng còn khi có tác động chân ra4 thì led tắt, vì timer0 co chưc năng chế độ bộ đếm nên ko cần fai khai báo chân ra4 nữa đúng ko anh, đây là đoạn chương trình em viết ko hiểu sao nó chỉ thực hiện trong hàm while còn trong hàm ngắt lại ko dc,hic, giúp em với, em cảm ơn ạ
    }
    Bạn đang mô phỏng ?
    Khi mô phỏng thì máy tính sẽ đáp ứng chậm hơn thực tế. Bạn dùng while(true) để đưa PORTB = 0xFF và dùng ngắt timer0 để xóa PORTB, để nhận rõ PORTB bị xóa bạn nên cho thêm delay vào while(true) để nó chậm lại và bạn nhìn thấy được hiệu ứng. Nếu bạn để while(true) thế kia nó sẽ chạy cực nhanh (tầm vài us một lần) nên khi ngắt timer0 xóa PORTB thì nó gần như ngay lập tức được while(true) set trở lại nên bạn không thấy được cả khi nó chạy đúng.
    Về phía timer :
    Timer thực chất là 1 bộ đếm (nên bạn mới thấy nó thường viết "timer/counter"). Nó sẽ đếm xung tại nguồn mà ta set cho nó. Bạn đã set cho RTCC là "RTCC_EXT_L_TO_H | RTCC_DIV_1" thì cứ sau 1 xung tác động vào RA4 thì bộ đếm của timer 0 tăng lên 1. Đến khi nó đếm được 255 và về 0 thì một ngắt timer0 được xảy ra (với loại timer 8 bit, timer 16 bit thì đếm đến 65535). Nếu bạn set cho timer0 là 0 thì sau 256 lần xung tác động vào RA4 thì nó mới xảy ra ngắt và xóa PORTB 1 lần. Để nó xóa PORTB sau mỗi xung vào RA4 thì bạn phải set cho nó là 255 để sau mỗi xung là 1 ngắt timer0 sẽ xảy ra.

    Comment


    • #17
      Nguyên văn bởi duong_act Xem bài viết
      Bạn đang mô phỏng ?
      Khi mô phỏng thì máy tính sẽ đáp ứng chậm hơn thực tế. Bạn dùng while(true) để đưa PORTB = 0xFF và dùng ngắt timer0 để xóa PORTB, để nhận rõ PORTB bị xóa bạn nên cho thêm delay vào while(true) để nó chậm lại và bạn nhìn thấy được hiệu ứng. Nếu bạn để while(true) thế kia nó sẽ chạy cực nhanh (tầm vài us một lần) nên khi ngắt timer0 xóa PORTB thì nó gần như ngay lập tức được while(true) set trở lại nên bạn không thấy được cả khi nó chạy đúng.
      Về phía timer :
      Timer thực chất là 1 bộ đếm (nên bạn mới thấy nó thường viết "timer/counter"). Nó sẽ đếm xung tại nguồn mà ta set cho nó. Bạn đã set cho RTCC là "RTCC_EXT_L_TO_H | RTCC_DIV_1" thì cứ sau 1 xung tác động vào RA4 thì bộ đếm của timer 0 tăng lên 1. Đến khi nó đếm được 255 và về 0 thì một ngắt timer0 được xảy ra (với loại timer 8 bit, timer 16 bit thì đếm đến 65535). Nếu bạn set cho timer0 là 0 thì sau 256 lần xung tác động vào RA4 thì nó mới xảy ra ngắt và xóa PORTB 1 lần. Để nó xóa PORTB sau mỗi xung vào RA4 thì bạn phải set cho nó là 255 để sau mỗi xung là 1 ngắt timer0 sẽ xảy ra.
      heheheheh, em làm được rồi , cảm ơn A Dương nhiều lắm, ôi cả ngày loay hoay cái này ma ko ra, dạ em mô phỏng trên proteus ạ, chỉnh sữa lại delay và set timer0(255) như lời anh nói là được,hihihi

      Comment


      • #18
        A duơng ơi, đề bài của em như thế này Sử dụng ngắt timer 0 để quét led 7 đoạn hiển thị số lần bấm phím (được đo bởi ngắt ngoài) trong khoảng thời gian 1 phút (được định thời bởi ngắt timer 1) em viết chuơng trình mà mô phỏng không hiểu sao chưa tới 1 phút led 7 đoạn da set vê 00 rồi ạ, đáng lẽ ra theo bài toán thì 60s sau nó mới set lại lần đếm đúng ko anh, anh xem thử em sai đoạn nào, cảm ơn anh nha!!
        #include<16f877a.h>
        #FUSES NOWDT,PUT,XT,NOPROTECT
        #use delay(clock=4000000)

        int maled[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
        int16 dem,sln;
        int slb=0,sll,so,hc,hdv;
        #INT_EXT
        EXT_ISR() {

        slb++;
        if (slb>99) slb = 0;
        }
        #int_timer1
        void ngat_timer1()
        {
        set_timer1(3036);//0,5s//
        {
        sln++;
        if(sln==360) sln=0;
        slb=0;
        //hc=slb/10,hdv=slb%10;

        }}

        #int_timer0
        void ngat_timer0()

        {
        set_timer0(6);// 0,5ms//
        dem++;
        if(dem==5)//5*0,5=2ms
        {
        dem=0;
        // output_d(0x00); // T?t các LED
        hc=slb/10,hdv=slb%10;
        if(sll==0)
        {
        output_high(pin_d1);
        output_low(pin_d0);
        output_c(maled[hc]);

        }
        else
        {
        output_high(pin_d0);
        output_low(pin_d1);
        output_c(maled[hdv]);

        }
        sll++;
        if(sll>1) sll=0;

        }
        }

        void main()
        {
        set_tris_b(0xFF);
        set_tris_d(0x00);
        set_tris_c(0x00);
        enable_interrupts(int_timer0);
        enable_interrupts(int_EXT);
        enable_interrupts(int_timer1);
        ext_int_edge(H_TO_L); // Chon ngat theo suon am//
        setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
        setup_timer_1(T1_internal|T1_div_by_8);//1:4//
        enable_interrupts(global);
        set_timer0(6);
        set_timer1(3036);
        while(1)
        {

        }
        }

        Comment


        • #19
          Cụ thể là thực tế thì sau bao nhiêu s nó set về 0 ?

          Comment


          • #20
            Nguyên văn bởi duong_act Xem bài viết
            Cụ thể là thực tế thì sau bao nhiêu s nó set về 0 ?
            chuơng trình trong khoảng thời gian 1 phút dùng timer1 là sao anh nhỉ, hình như em hiểu sai vấn đê rồi, chắc là sau 1 phút nó mới hiển thị số lần phím bấm fai không anh

            Comment


            • #21
              Nguyên văn bởi doituquan Xem bài viết
              chuơng trình trong khoảng thời gian 1 phút dùng timer1 là sao anh nhỉ, hình như em hiểu sai vấn đê rồi, chắc là sau 1 phút nó mới hiển thị số lần phím bấm fai không anh
              Thế nào cũng được nhưng code trên thấy hàm ngắt timer1 chỉ đếm mà không làm gì thì cũng vô tác dụng. Vấn đề thời gian bị sai như mình đã nói ở bài trước là khi dùng nhiều ngắt cùng lúc nếu không kiểm soát được thì không biết đâu mà lần vì bạn mới học. Cứ từ từ thôi Bạn nên đưa ra 1 đề bài và cố gắng nghĩ giải thuật để giải quyết 1 cách đơn giản nhất.
              Như bài trên thì mình nghĩ bạn nên dùng timer0 để quét và tính thời gian 1 phút. Còn số lần ấn nút thì dùng timer1 chế độ counter. Như vậy sẽ chỉ có 1 ngắt thôi và chắc chắn vấn đề sai thời gian sẽ giảm và bạn dễ kiểm soát code hơn.
              ______
              Khi up code lên bạn nên đặt trong thẻ code nhé. Cấu trúc "[c o d e]" để mở đầu đoạn code và "[/ code]" để kết thúc (viết liền không cách).
              Code:
              Up code như thế này ....

              Comment


              • #22
                dạ, để em thử xem,hì, cảm ơn anh đã chỉ bảo !!!

                Comment

                Về tác giả

                Collapse

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

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

                Collapse

                Đang tải...
                X