Thông báo

Collapse
No announcement yet.

Nhờ mọi người giúp dùm em về sử dụng 2 timer trong PIC16F877A.

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

  • Nhờ mọi người giúp dùm em về sử dụng 2 timer trong PIC16F877A.

    Em sử dụng timer1 và timer2 để định thời gian là 0.5ms. Em sử dụng thạch anh 4M, PIC16F677A, trình biên dịch CCS.
    Em khai báo timer1 như thế này
    SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_1);
    SET_TIMER1(0xEC77); //0xEC77 = 60535
    Vậy thời gian tràn của timer 1 là: (65535 - 60535)*1us = 5000*1us = 5ms

    còn timer2 là

    setup_timer_2 ( T2_DIV_BY_4,249,5); // (249+1)*4*5*1us = 250*4*5*1us = 5000*1us =5ms

    Và em kết hợp với đếm ngắt 200 lần tức 5ms *200 = 1s
    Khi mô phỏng, em thấy
    Lúc đầu viết chung trên 1 chương trình thì em thấy timer chạy gần 1s so với thời gian mô phỏng hơn trong khi timer2 chạy trễ hơn thời gian mô phỏng và trể hơn timer1 đến 1s lận
    sau đó em tách 2 chương trình ra riêng biệt thì vẫn vậy. Em đã làm sai chổ nào vậy? Em đã tra nhiều rồi mà thấy ích ai sài timer2 nên cũng chưa tìm ra được. Mong anh chị chỉ dẫn dùm em.

  • #2
    Đợi rất lâu mà ko có 1 gợi ý. Diễn đàn ko còn cho người bắt đầu nữa. Mod xoá bài này luôn đi.

    Comment


    • #3
      Tôi thấy nó xấp xỉ 1s cả 2 cái nhưng không trùng điểm xuất phát. Đơn giản vì thời gian tính bằng timer cũng chỉ là tương đối.
      Code:
      #include <16F877A.h>
      #device *=16
      #device adc=8
      
      #FUSES NOWDT                    //No Watch Dog Timer
      #FUSES XT                       
      
      #use delay(clock=4000000)
      
      #byte PORTB = 0x006
      #bit  OUT1  = 0x006.0
      #bit  OUT2  = 0x006.1
      
      int x,y;
      #INT_TIMER2
      void T2_Isr()
      {
         x++;
         if(x>199)
         {
            x=0;
            OUT1=!OUT1;
         }
      }
      
      #INT_TIMER1
      void T1_Isr()
      {
         set_timer1(60535);
         y++;
         if(y>199)
         {
            y=0;
            OUT2=!OUT2;
         }
      }
      void main()
      {
         output_b(0x00);
         set_tris_b(0x00);
         
         enable_interrupts(GLOBAL);
         enable_interrupts(INT_TIMER2);
         enable_interrupts(INT_TIMER1);
         setup_timer_1(T1_DIV_BY_1 | T1_INTERNAL);
         setup_timer_2(T2_DIV_BY_4,249,5);
         
         while(true)
         {
         
         }
      }
      Attached Files

      Comment


      • #4
        #INT_TIMER2
        void T2_Isr()
        {
        x++;
        if(x>199)
        {
        x=0;
        OUT1=!OUT1;
        }
        }
        Đã thử mô phỏng lại nhưng ko được nốt. Thường thì lệch thời gian thì 2 timer phải lệch cùng chứ sao 1 cái lệt 1 cái ko lệch.
        Mình khai báo hoàn toàn giống bác. Cho mình hỏi là mình tính toán vậy đúng chứ, nếu ko chạy chắc mai mình cắm test board thử thôi. Hết cách rồi, vì vấn đề này mà làm mất hết gần 1 tuần mà vẫn ko tìm ra chổ sai.
        Last edited by Ultra; 22-05-2013, 02:08.

        Comment


        • #5
          Nguyên văn bởi Ultra Xem bài viết
          Em sử dụng timer1 và timer2 để định thời gian là 0.5ms. Em sử dụng thạch anh 4M, PIC16F677A, trình biên dịch CCS.
          Em khai báo timer1 như thế này
          SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_1);
          SET_TIMER1(0xEC77); //0xEC77 = 60535
          Vậy thời gian tràn của timer 1 là: (65535 - 60535)*1us = 5000*1us = 5ms

          còn timer2 là

          setup_timer_2 ( T2_DIV_BY_4,249,5); // (249+1)*4*5*1us = 250*4*5*1us = 5000*1us =5ms

          Và em kết hợp với đếm ngắt 200 lần tức 5ms *200 = 1s
          Khi mô phỏng, em thấy
          Lúc đầu viết chung trên 1 chương trình thì em thấy timer chạy gần 1s so với thời gian mô phỏng hơn trong khi timer2 chạy trễ hơn thời gian mô phỏng và trể hơn timer1 đến 1s lận
          sau đó em tách 2 chương trình ra riêng biệt thì vẫn vậy. Em đã làm sai chổ nào vậy? Em đã tra nhiều rồi mà thấy ích ai sài timer2 nên cũng chưa tìm ra được. Mong anh chị chỉ dẫn dùm em.
          mình dùng microc không dùng ccs

          Comment


          • #6
            có ai dùng microc không. mình muốn làm một con robot cam tay ma lập trình kém quá.

            Comment


            • #7
              cho mình hỏi cách lập trình cho pic16f887. cho timer chạy từ 0 đến 50ms thì đọc dữ liệu rồi putc(), tiếp tục chạy đến 100ms thì đọc rồi putc(), cứ tiếp tục đến 150ms, 200ms,.... bạn nào giúp mình với.

              Comment


              • #8
                Bạn đã sửa đc lỗi này chưa giúp mình với. hàm set_timer1 không hoạt động gì,
                Nguyên văn bởi Ultra Xem bài viết
                Em sử dụng timer1 và timer2 để định thời gian là 0.5ms. Em sử dụng thạch anh 4M, PIC16F677A, trình biên dịch CCS.
                Em khai báo timer1 như thế này
                SETUP_TIMER_1(T1_INTERNAL|T1_DIV_BY_1);
                SET_TIMER1(0xEC77); //0xEC77 = 60535
                Vậy thời gian tràn của timer 1 là: (65535 - 60535)*1us = 5000*1us = 5ms

                còn timer2 là

                setup_timer_2 ( T2_DIV_BY_4,249,5); // (249+1)*4*5*1us = 250*4*5*1us = 5000*1us =5ms

                Và em kết hợp với đếm ngắt 200 lần tức 5ms *200 = 1s
                Khi mô phỏng, em thấy
                Lúc đầu viết chung trên 1 chương trình thì em thấy timer chạy gần 1s so với thời gian mô phỏng hơn trong khi timer2 chạy trễ hơn thời gian mô phỏng và trể hơn timer1 đến 1s lận
                sau đó em tách 2 chương trình ra riêng biệt thì vẫn vậy. Em đã làm sai chổ nào vậy? Em đã tra nhiều rồi mà thấy ích ai sài timer2 nên cũng chưa tìm ra được. Mong anh chị chỉ dẫn dùm em.

                Comment


                • #9
                  con này ở đây ít ưng dụng quá mà cho vào sine thì quá tốt mỗi tội giá mắc 60k

                  Comment

                  Về tác giả

                  Collapse

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

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

                  Collapse

                  Đang tải...
                  X