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

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

    đây là 1 phần code mình muốn hỏi.
    câu lệnh set_timer0(value) khi mình thay value =0 hay =250 thì thấy xung ra RD0 không thay đổi là sao nhỉ

    #int_timer0
    void interrupt_timer0()
    {
    set_timer0(250);

    ++count;
    if(count >= 100000/h)
    {
    count=0;
    b=~b;
    RD0=b;

    }
    }

    // chuong trinh chinh
    void main()
    {set_tris_b(0); // 0=out....1=in
    set_tris_c(0);
    set_tris_d(0b11111110);



    enable_interrupts(INT_TIMER0);
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
    enable_interrupts(GLOBAL);
    set_timer0(250);// T_dinhthi = 2*(255 - 250)*0.2us = 2us

    anh em giúp với đang càn gấp

  • #2
    với thạch anh 20MHz thì công thức trên đúng ko ạ

    Comment


    • #3
      set_timer0(250); //(256-250)*(4/20000000) = 1.5us
      p/s : (4/20000000)s là time 1 chu kỳ máy

      Comment


      • #4
        Mọi người xem giùm em đoạn chương trình này sai đoạn nào, em đang tự mày mò tìm hiểu vể pic 16f877a, em dang tìm hiểu về timer0 ,chương trình em viết sử dụng timer0 để tạo thoi gian sáng 2 led 7 đoạn đếm từ 00-99 ( em ko dung hàm delay)
        #include <16F877A.h>
        #fuses NOWDT,PUT,XT,NOPROTECT
        #use delay(clock=4000000)
        #byte PORTB = 0x06
        #int_timer0
        int maled[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
        int sll=0,hc,hdv;
        //Chuong trinh chinh
        void main(void)
        {
        int so=25;hc=so/10,hdv=so%10;
        set_tris_c(0);
        set_tris_d(0);
        enable_interrupts(int_timer0);
        setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); // ti le chia 1:32//
        enable_interrupts(global);// cho phep ngat toan cuc//
        set_timer0(0);
        while(true)
        {

        }
        }
        void interrupt_timer0()
        {
        set_timer0(0);//256-t/=6--->t=5000us
        sll++;
        if(sll == 1)
        {
        output_high(pin_c1);
        output_low(pin_c0);
        output_D(maled[hc];
        }
        else
        {
        sll=0;

        output_high(pin_c0);
        output_low(pin_c1);
        output_D(maled[hdv];
        }
        }

        Comment


        • #5
          Nguyên văn bởi truong401 Xem bài viết
          đây là 1 phần code mình muốn hỏi.
          câu lệnh set_timer0(value) khi mình thay value =0 hay =250 thì thấy xung ra RD0 không thay đổi là sao nhỉ

          #int_timer0
          void interrupt_timer0()
          {
          set_timer0(250);

          ++count;
          if(count >= 100000/h)
          {
          count=0;
          b=~b;
          RD0=b;

          }
          }

          // chuong trinh chinh
          void main()
          {set_tris_b(0); // 0=out....1=in
          set_tris_c(0);
          set_tris_d(0b11111110);



          enable_interrupts(INT_TIMER0);
          setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
          enable_interrupts(GLOBAL);
          set_timer0(250);// T_dinhthi = 2*(255 - 250)*0.2us = 2us

          anh em giúp với đang càn gấp
          (256 - 250)* 2 = 12 Tcy.
          Tràn ngắt rồi bạn ơi.

          Comment


          • #6
            Nguyên văn bởi doituquan Xem bài viết
            Mọi người xem giùm em đoạn chương trình này sai đoạn nào, em đang tự mày mò tìm hiểu vể pic 16f877a, em dang tìm hiểu về timer0 ,chương trình em viết sử dụng timer0 để tạo thoi gian sáng 2 led 7 đoạn đếm từ 00-99 ( em ko dung hàm delay)
            #include <16F877A.h>
            #fuses NOWDT,PUT,XT,NOPROTECT
            #use delay(clock=4000000)
            #byte PORTB = 0x06
            #int_timer0
            int maled[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x9 0};
            int sll=0,hc,hdv;
            //Chuong trinh chinh
            void main(void)
            {
            int so=25;hc=so/10,hdv=so%10;
            set_tris_c(0);
            set_tris_d(0);
            enable_interrupts(int_timer0);
            setup_timer_0(RTCC_INTERNAL|RTCC_DIV_32); // ti le chia 1:32//
            enable_interrupts(global);// cho phep ngat toan cuc//
            set_timer0(0);
            while(true)
            {

            }
            }
            void interrupt_timer0()
            {
            set_timer0(0);//256-t/=6--->t=5000us
            sll++;
            if(sll == 1)
            {
            output_high(pin_c1);
            output_low(pin_c0);
            output_D(maled[hc];
            }
            else
            {
            sll=0;

            output_high(pin_c0);
            output_low(pin_c1);
            output_D(maled[hdv];
            }
            }
            Chưa thấy đoạn chương trình bạn đếm biến "so" từ 0 đến 99 và tách ra "hc" và "hdv". Đoạn này đặt trong while(true).
            Phần timer xuất dữ liệu, khi tắt led thì phải xuất dữ liệu ra led rồi mới bật led lên. Chưa thấy đoạn code tắt led => xuất hiện kiểu "bóng ma Tu la"
            Thuật toán hiển thị :
            Tắt hoàn toàn các LED > Xuất dữ liệu led x > Bật led x > Tắt hoàn toàn led > Xuất dữ liệu led y > Bật led y >....

            Comment


            • #7
              Nguyên văn bởi duong_act Xem bài viết
              Chưa thấy đoạn chương trình bạn đếm biến "so" từ 0 đến 99 và tách ra "hc" và "hdv". Đoạn này đặt trong while(true).
              Phần timer xuất dữ liệu, khi tắt led thì phải xuất dữ liệu ra led rồi mới bật led lên. Chưa thấy đoạn code tắt led => xuất hiện kiểu "bóng ma Tu la"
              Thuật toán hiển thị :
              Tắt hoàn toàn các LED > Xuất dữ liệu led x > Bật led x > Tắt hoàn toàn led > Xuất dữ liệu led y > Bật led y >....
              ui, em nhầm, chỉ hiển thị số 25 thôi anh ạ, còn đang bị đuối ở đoạn này, làm được bài này mới làm dc đếm từ 00-99,hic, anh có thể nói cụ thể hơn được ko ạ, phần chương trình xuất ra là fai ở trong hàm while() hả anh

              Comment


              • #8
                Chương trình xử lý số thì đặt trong while(true) còn phần xuất đặt ở timer.
                Ví dụ nhé :
                Hàm ngắt timer 0 để xuất :
                Code:
                #int_rtcc
                void display()
                {
                     output_c(0x00); // Tắt các LED
                     if(sll==0)
                          {
                               output_d(maled[hc]);
                               output_hign(pin_C0);
                          }
                      else
                          {
                               output_d(maled[hdv]);
                               output_hign(pin_C1);
                          }
                      sll++;
                      if(sll>1) sll=0;
                }
                Hàm while(true):
                Code:
                while(true)
                {
                     hc = so / 10 % 10;
                     hdv=so%10;
                     so++;
                     if(so>99) so=0;
                     delay_ms(1000);

                Comment


                • #9
                  anh dương có thể nói rõ giúp em được không ạ.em phải làm sao để khắc phục hiện tượng này

                  Comment


                  • #10
                    Nguyên văn bởi truong401 Xem bài viết
                    anh dương có thể nói rõ giúp em được không ạ.em phải làm sao để khắc phục hiện tượng này
                    Bạn không up toàn bộ code và không giải thích bạn đang làm cái gì thì rất khó.

                    Comment


                    • #11
                      Nguyên văn bởi duong_act Xem bài viết
                      Chương trình xử lý số thì đặt trong while(true) còn phần xuất đặt ở timer.
                      Ví dụ nhé :
                      Hàm ngắt timer 0 để xuất :
                      Code:
                      #int_rtcc
                      void display()
                      {
                           output_c(0x00); // Tắt các LED
                           if(sll==0)
                                {
                                     output_d(maled[hc]);
                                     output_hign(pin_C0);
                                }
                            else
                                {
                                     output_d(maled[hdv]);
                                     output_hign(pin_C1);
                                }
                            sll++;
                            if(sll>1) sll=0;
                      }
                      Hàm while(true):
                      Code:
                      while(true)
                      {
                           hc = so / 10 % 10;
                           hdv=so%10;
                           so++;
                           if(so>99) so=0;
                           delay_ms(1000);
                      cảm ơn anh dương nhiều lắm, em đã hiểu rồi ạ, ở diễn đàn mình không có nút thaks hả anh,hì

                      Comment


                      • #12
                        cảm ơn anh Dương

                        đây là chưong trình đã chỉnh sữa theo như anh Duơng đã hướng dẫn, hiển thị số 25 dùng timer0
                        #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;
                        int a=25,sll,hc,hdv;
                        #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=a/10,hdv=a%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_d(0x00);
                        set_tris_c(0x00);
                        enable_interrupts(int_timer0);
                        setup_timer_0(RTCC_INTERNAL|RTCC_DIV_2);
                        enable_interrupts(global);
                        set_timer0(6);
                        while(1)
                        {

                        }
                        }
                        Last edited by doituquan; 11-11-2013, 17:07.

                        Comment


                        • #13
                          Anh em ai hiểu bài toán này giải thích cho mình với, tks all
                          . 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)

                          Comment


                          • #14
                            Nguyên văn bởi doituquan Xem bài viết
                            Anh em ai hiểu bài toán này giải thích cho mình với, tks all
                            . 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)
                            Quét = timer 0 thì OK rồi ko nói nữa.
                            Thời gian 1 phút được định thời bằng timer 1 :
                            - 1 biến sẽ được tăng từ 0 đến 1 giá trị sau mỗi lần timer 1 tràn và 1 ngắt xảy ra. Công việc ở đây là đặt thời gian tràn cho timer 1 và tính số lần nó tràn khi được 1 phút. Cái này sử dụng ngắt timer 1.
                            Số lần nhấn nút:
                            - Khi timer1 chưa đếm đủ 1 phút thì mỗi ngắt ngoài xảy ra sẽ tăng số đếm lên 1. Việc tách hàng chục, đơn vị có thể đặt tại đây cũng có thể đặt trong while(true).
                            ______________
                            PS : Trong mọi trường hợp, nếu không cần thiết nên hạn chế dùng ngắt và cực hạn chế số lượng ngắt. Khi dùng ngắt thì trong hàm ngắt phải giảm tối đa số lệnh để thời gian thực thi ngắt là nhỏ nhất. Ngắt có ưu điểm là được ưu tiên đáp ứng nhanh nhưng nếu không kiểm soát được nó có thể nó sẽ chạy không như mong muốn. Có thể nó sẽ "lạc đường" - khi thực hiện xong chương trình ngắt rồi nó không biết nó đang đi đến đâu, không biết phải làm cái gì nữa

                            Comment


                            • #15
                              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 ạ
                              #include<16f877a.h>
                              #FUSES NOWDT,PUT,XT,NOPROTECT
                              #use delay(clock=4000000)


                              #int_timer0
                              void ngat_timer0()
                              {
                              set_timer0(0);


                              {
                              output_b(0x00);


                              }
                              }
                              void main()
                              {

                              set_tris_b(0x00);


                              enable_interrupts(int_timer0);

                              setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);
                              enable_interrupts(global);
                              set_timer0(0);
                              while(1)
                              {
                              output_b(0xff);

                              }
                              }

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              • mèomướp
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi mèomướp
                                Dạ hông dám làm thì chắc chắn sẽ mãi ko thể làm được đâu ạ. Nguồn xung dân dụng vài kw giờ rất nhìu ạ, sạc ô tô điện, máy hàn, lò vi sóng, âm ly... tùy chất lượng mà độ phức tạp sẽ khác nhau ạ. Và cái giá phải trả về kinh tế...
                                hôm nay, 13:11
                              • tuyennhan
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi tuyennhan
                                Sửa dạng này thì chuyên còn không dám chắc khộng cháy nổ với linh kiện bán ngoài chợ nói gì khộng chuyên .
                                hôm nay, 09:25
                              • tuyennhan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi tuyennhan
                                Đúng rồi chọn mua theo tai . ca thì phải toàn dải nhạc thì chỉ cao và thấp thé nên loa ca thì nghe nhạc không hay và ngược lại .
                                Muốn ca và nhạc đều hay thì phải dúng 2 giàn , còn nếu chỉ có 1 thì phải chỉnh sửa lại sao cho ca và nhạc đều được không quá dở ....
                                hôm nay, 09:10
                              • Ng.Phuong.5
                                Vấn đề in lỗ khoan ra pdf ở Orcad 9.2
                                bởi Ng.Phuong.5
                                Vấn đề cũ: khi in mạch ra pdf và bấm chọn Keep Drill Holes Open, in ra thì pdf trắng đen các lỗ chân linh kiện như nhau. Mặc dù có linh kiện phần Drill là 1mm, có linh kiện thì là 3mm. Cho em hỏi cách sửa phần này ở Orcad 9.2 với ạ.
                                Mấy con...
                                Hôm qua, 19:44
                              • viettinh
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi viettinh
                                Bác nói đúng quá. Cơ mà muốn mua hàng chính hãng, hàng thương hiệu mà tai lại hợp hàng tầu mới khổ chứ.
                                Đang tính mua cái loa tầu nữa cột đằng sau loa này, Loa sony chỉ để hát nhép thôi, có dc k các bác ...
                                Hôm qua, 18:12
                              • nguyendinhvan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi nguyendinhvan
                                Theo tôi thì khi hpj sản xuất ra cái loa đó, đã có nhiều chuyên gia kỹ thuật hiệu chỉnh, tính toán các phần tử kỹ lưỡng rồi.
                                Bây giờ tính toán hiệu chỉnh lại cần có đội ngũ tương đương với nhà sản xuất.
                                Cách đơn giản...
                                Hôm qua, 00:04
                              • mèomướp
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi mèomướp
                                Dạ cháu có ý tốt muốn động viên chú ấy ngâm cứu khoa học thôi ạ. Về phần kiểm tra dao động thì chú ấy chưa biết thì sẽ tìm hiểu được là cần những gì ạ, chắc chắn là khi hướng dẫn phần ấy các cô chú nào đó sẽ lưu ý cần loại sò công suất ra tránh cháy nổ rồi ạ....
                                08-01-2025, 19:02
                              • tuyennhan
                                Trả lời cho Sửa bộ nguồn DC 60V 45A
                                bởi tuyennhan
                                Chủ thớt hỏi có kiểm tra được dao động mà không cấp nguồn thì rõ trình ở mức nào mà mèo còn xúi ngâm cứu nữa ác vậy ....
                                08-01-2025, 15:43
                              • tuyennhan
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi tuyennhan
                                Loa bass đấu trực tiếp không qua phân tần để thành loa toàn dải xem có thoát tiếng khộng , nếu không thoát cần phải sửa lại mạch cs hay âm sắc nếu đủ trình còn nếu thoát ca hay nhưng chưa vừa ý vì bass kém chăc thì đấu lại như cũ và đấu thêm loa mid treble bên ngoài .
                                08-01-2025, 15:28
                              • mèomướp
                                Trả lời cho Cần tư vấn cải thiện chất âm thanh loa SoNy.
                                bởi mèomướp
                                Dạ loa tép bé xíu như ngón chân cái thôi ạ. Thiếu gì chỗ để đâu. Quan trọng là gắn thêm nó loa nghe ok hay ko thôi ạ...
                                08-01-2025, 11:44
                              Đang tải...
                              X