Thông báo

Collapse
No announcement yet.

dem tu 0 den 9999

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

  • dem tu 0 den 9999

    Mình đang làm 1 bài mãi mà không được. Mình muốn đếm từ 0 đến 9999 trên led 7 thanh (không dùng nút bấm, nếu có nút bấm thì mình đã làm được rồi) 1 hoặc 2 s tự động tăng số. Nhưng nếu dùng lệnh delay_ms(1000) thì led cứ nhấp nháy, Mình muốn hỏi mọi người xem cái chỗ trễ 1 s đó mình phải dùng mẹo gì để led không nhấp nháy.

  • #2
    dùng ngắt timer.
    nên dùng ngắt để hiện thị ra led 7 đoạn.như vậy thì tần số quét led se ổn định.sẽ ko bị nháy
    email:trangonthuocthom@gmail.com

    Comment


    • #3
      thanks bác. Bác có thể viết rõ thuật toán dùm mình không. Ví dụ như là mình phải viết những hàm nào,hàm ngắt timer thực hiện công việc j.

      Comment


      • #4
        Hi,
        Nói đơn giản là thế này dùng ngắt Timer, 2 Timer thì đơn giản hơn 1 Timer. Timer thứ nhất sẽ ngắt với tần số bằng tần số quét LED, mỗi lần ngắt thì đọc nội dung trong ô nhớ chứa giá trị cần hiển thị của LED thứ n, lần ngắt tiếp theo sẽ hiễn thị ô nhớ n+1 trên LED thứ n+1. Khi n bằng với số LED cuối cùng thì reset lại n=0 để ngắt tiếp theo quay về hiển thị LED đầu tiên. Ngắt Timer thứ hai thì tạo interval 1s hay 2s tùy thích, khi đủ thời gian trễ thì cập nhật thông tin vào các ô nhớ cần hiễn thị. Nếu dùng 1 Timer thì dùng thêm biến đếm trong ngắt quét LED luôn, khi đủ thời gian delay thì cập nhật ô nhớ. Chương trình chính chỉ việc setup các Timer rồi đi ngủ. Nhớ là phải cho CPU đi ngủ nhé chứ để cho nó chạy không không vậy thì chỉ có sinh viên mới làm thế.
        Thân ái.
        Đường đến những ngày vinh quang không còn xa
        Con đường chúng ta... chúng ta đã chọn.

        Comment


        • #5
          Nói như các bác trên nói là chuẩn đấy, dùng times là tốt nhất. Còn nếu chưa biết cách dùng time thì bạn có thể dùng thêm một biến phụ. Nếu chu kỳ quét leb của bạn là 1ms thì cho biến phụ đó tăng 1000 lại tăng giá trị hiển thị một lần xong lại quy 0 biến phụ. Thế là ok
          Thiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.

          Comment


          • #6
            Nguyên văn bởi teddy78 Xem bài viết
            Mình đang làm 1 bài mãi mà không được. Mình muốn đếm từ 0 đến 9999 trên led 7 thanh (không dùng nút bấm, nếu có nút bấm thì mình đã làm được rồi) 1 hoặc 2 s tự động tăng số. Nhưng nếu dùng lệnh delay_ms(1000) thì led cứ nhấp nháy, Mình muốn hỏi mọi người xem cái chỗ trễ 1 s đó mình phải dùng mẹo gì để led không nhấp nháy.
            Chào anh em đang cần cái code có nút nhấn mà anh nói anh có the cho em tham khảo được không. Cảm ơn anh

            Comment


            • #7
              Nguyên văn bởi teddy78 Xem bài viết
              Mình đang làm 1 bài mãi mà không được. Mình muốn đếm từ 0 đến 9999 trên led 7 thanh (không dùng nút bấm, nếu có nút bấm thì mình đã làm được rồi) 1 hoặc 2 s tự động tăng số. Nhưng nếu dùng lệnh delay_ms(1000) thì led cứ nhấp nháy, Mình muốn hỏi mọi người xem cái chỗ trễ 1 s đó mình phải dùng mẹo gì để led không nhấp nháy.
              Hi teddy78,

              Vấn đề của bạn rất đơn giản, bạn nên tổ chức chương trình như thế này:
              - Chương trình chính bạn cho chạy một hàm quét LED 7 thanh để luôn hiển thị ra ngoài giá trị của một biến đếm kiểu integer (0-65535) nhưng chỉ cần quét 4 số thôi vì giá trị của bạn chỉ hiển thị đến 9999. Hãy tổ chức chương trình hiển thị này với tham số đầu vào là giá trị của biến đếm.
              - Tiếp đó bạn hãy setup một timer bất kì cứ 1s hoặc 2s bạn tăng biến đếm đó một lần (thời gian này có thể thay đổi tùy ý). Sau khi tăng bạn hãy thêm các điều kiện khác để giới hạn giá trị của biến đếm luôn trong dải 0-9999.

              Với cách làm này bạn hãy yên tâm là chương trình rất đơn giản và không bao giờ LED nhấp nháy.

              Bạn thử xem nhé, chúc thành công.
              For a better world

              Comment


              • #8
                Thanks mọi người nhiều. Cho mình hỏi (hơi ngớ ngẩn):
                1, Khi delay thì vi điều khiển không làm gì cả, còn mình dùng timer thì vi điều khiển vẫn hoạt động như thường phải không?
                2, Mình đã nghĩ đến ý tưởng của Toan.Lv từ trước nhưng mình không biết rõ làm sao để setup timer sao cho đúng như ý mình ấy.Mình dùng codeVision thì phải chỉnh thông số ở cửa sổ Wizard cho timer 0 như thế nào.
                3,Proteus có mô phỏng "ngon" cái timer không nhỉ?
                Mong mọi người chỉ giáo thêm!Many thanks.

                Comment


                • #9
                  Nguyên văn bởi teddy78 Xem bài viết
                  Thanks mọi người nhiều. Cho mình hỏi (hơi ngớ ngẩn):
                  1, Khi delay thì vi điều khiển không làm gì cả, còn mình dùng timer thì vi điều khiển vẫn hoạt động như thường phải không?
                  2, Mình đã nghĩ đến ý tưởng của Toan.Lv từ trước nhưng mình không biết rõ làm sao để setup timer sao cho đúng như ý mình ấy.Mình dùng codeVision thì phải chỉnh thông số ở cửa sổ Wizard cho timer 0 như thế nào.
                  3,Proteus có mô phỏng "ngon" cái timer không nhỉ?
                  Mong mọi người chỉ giáo thêm!Many thanks.
                  Hi,
                  Khi delay thì CPU làm việc delay, khi dùng ngắt thì CPU không có việc gì thì đi ngủ để tiết kiệm năng lượng.
                  Câu 2 và câu 3 thì không biết vì tui chưa làm việc với AVR bao giờ cả.
                  Thân ái.
                  Đường đến những ngày vinh quang không còn xa
                  Con đường chúng ta... chúng ta đã chọn.

                  Comment


                  • #10
                    Nguyên văn bởi teddy78 Xem bài viết
                    Thanks mọi người nhiều. Cho mình hỏi (hơi ngớ ngẩn):
                    1, Khi delay thì vi điều khiển không làm gì cả, còn mình dùng timer thì vi điều khiển vẫn hoạt động như thường phải không?
                    2, Mình đã nghĩ đến ý tưởng của Toan.Lv từ trước nhưng mình không biết rõ làm sao để setup timer sao cho đúng như ý mình ấy.Mình dùng codeVision thì phải chỉnh thông số ở cửa sổ Wizard cho timer 0 như thế nào.
                    3,Proteus có mô phỏng "ngon" cái timer không nhỉ?
                    Mong mọi người chỉ giáo thêm!Many thanks.
                    khi mô phỏng trong proteus bạn cứ an tâm là OK,nếu ko tin thì bạn có thể dùng osilocope của nó để xem.
                    nếu bạn quét có 4 led thì nên để 5ms quét 1 led.dảm bảo với bạn là OK.
                    khi cấu hình cho timer0 thì bạn chọn clock cho timer0.vi dụ Tclk = 31.250Khz,giá trị dưa vào TCNT0 = 99.khi dó ~5ms timer0 ngắt 1 lần.
                    ví dụ với AT16,chỉ có ngắt Time0
                    // Timer 0 overflow interrupt service routine
                    interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                    {
                    // Place your code here
                    TCNT0 = 99;
                    // code quet led
                    }
                    // Timer/Counter 0 initialization
                    // Clock source: System Clock
                    // Clock value: 31.250 kHz
                    // Mode: Normal top=FFh
                    // OC0 output: Disconnected
                    TCCR0=0x04;
                    TCNT0=99;
                    OCR0=0x00;

                    //cho phep ngắt tràn timer0
                    // Timer(s)/Counter(s) Interrupt(s) initialization
                    TIMSK=0x01;
                    email:trangonthuocthom@gmail.com

                    Comment


                    • #11
                      Nguyên văn bởi teddy78 Xem bài viết
                      Thanks mọi người nhiều. Cho mình hỏi (hơi ngớ ngẩn):
                      1, Khi delay thì vi điều khiển không làm gì cả, còn mình dùng timer thì vi điều khiển vẫn hoạt động như thường phải không?
                      2, Mình đã nghĩ đến ý tưởng của Toan.Lv từ trước nhưng mình không biết rõ làm sao để setup timer sao cho đúng như ý mình ấy.Mình dùng codeVision thì phải chỉnh thông số ở cửa sổ Wizard cho timer 0 như thế nào.
                      3,Proteus có mô phỏng "ngon" cái timer không nhỉ?
                      Mong mọi người chỉ giáo thêm!Many thanks.
                      To teddy,

                      1. Delay thực chất là bạn bắt CPU giết thời gian bằng những việc làm vô nghĩa kiểu như đếm lên, đếm xuống. Trong hàm delay CPU sẽ rất bận (chứ không phải là không làm gì cả) và chẳng làm được gì khác đâu. Nếu bạn có tác vụ thăm dò (kiểu như giám sát phím bấm) thì đừng dùng hàm delay, vì nếu sự kiện xảy ra trong thời gian CPU delay thì bạn sẽ không phát hiện được. Ngắt timer thì khác, khi dùng ngắt timer CPU nó chuyển cái việc vô nghĩa đó cho thằng timer làm còn nó thì rảnh tay và có thể làm việc khác.
                      2. Setup timer trong AVR để tạo ra độ trễ thời gian bạn làm thế này. Trong phần winzar bạn sẽ chọn: system clock, chế độ overflow hoặc CTC, căn cứ vào tốc độ clock để tính giá trị nạp vào thanh ghi. Ví dụ nếu chọn tốc độ là 7200Hz (còn tùy vào thạch anh ngoài bạn dùng) thì 1s nó đếm 7200 lần --> một lần đếm mất 1/7200s --> bạn muốn thời gian delay là bao lâu thì tính ra số lần đếm (ví dụ 10ms thì nó phải đếm 72 lần). Giá trị nạp vào thanh ghi thì tùy chế độ. CTC thì là 72 còn overflow thì là (256-72).

                      Với bài của bạn:
                      - Hàm quét led dùng hàm delay bình thường đảm bảo quét LED với tần số > 24Hz
                      - Timer setup để 10ms ngắt một lần --> sau 100 lần ngắt đủ 1s, 200 lần ngắt đủ 2s. Trong hàm ngắt timer cần dùng 2 biến đếm. Biến thứ nhất đếm số lần ngắt timer, biến thứ 2 là giá trị hiển thị ra ngoài. Khi biến đếm số lần ngắt = 100 (nghĩa là đủ 1s) thì tăng biến đếm giá trị hiển thị ra ngoài một lần.

                      Thân,
                      For a better world

                      Comment


                      • #12
                        To kitty511: Nếu dùng bút bấm thì gắn nó vào ngắt ngoài, hàm ngắt ngoài thì mình tăng biến đếm thôi. Làm timer mới khó chứ ngắt ngoài dễ mà

                        Comment


                        • #13
                          Cho em hỏi thêm. Mạch đếm thường dùng để đếm sản phẩm, phòng khi mất điện du liệu bị mất mình có thể lưu dữ liệu được không các anh. Nếu được thì mình dùng hàm gì trong c ah. Vi dụ : mạch đếm đến 123 bị mất điện. khi có điện lại thì là 123 và đếm tiếp chứ không bì reset về 000.

                          Comment


                          • #14
                            Hehe, mình làm được rồi,cám ơn mọi người!

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...
                            X