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.
Thông báo
Collapse
No announcement yet.
dem tu 0 den 9999
Collapse
X
-
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
-
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à okThiế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
-
Nguyên văn bởi teddy78 Xem bài viếtMì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.
Comment
-
Nguyên văn bởi teddy78 Xem bài viếtMì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.
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
-
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
-
Nguyên văn bởi teddy78 Xem bài viếtThanks 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 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
-
Nguyên văn bởi teddy78 Xem bài viếtThanks 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.
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
-
Nguyên văn bởi teddy78 Xem bài viếtThanks 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.
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
-
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
Bài viết mới nhất
Collapse
-
bởi nhathung1101Muốn đặt gì thì cũng phải có thông tin cơ bản. Việc nhỏ thế này mà phải dấu giếm thì người lớn không thèm làm đâu.
Cho bạn 3 ngày, không là sẽ xóa.-
Channel: Đặt hàng
Hôm qua, 22:02 -
-
Trả lời cho Hỏi cách điều chế xungbởi nhathung1101Schmit Trigger là chuẩn với điều kiện rise > 0,8V.
Bí thì dùng vi với tích gì đó, miễn đừng nói phân kẻo chó ở đây lại sủa nhặng.-
Channel: Kỹ thuật điện tử tương tự
Hôm qua, 21:57 -
-
bởi trungautMình cần đặt hàng thiết kế chế tạo mạch nghịch lưu 3 pha để cài đặt các thuật toán điều khiển động cơ FOC, DTC, ... Xin liên hệ trungaut@gmail.com để bàn chi tiết. Xin cảm ơn diễn dàn đăng tin!
-
Channel: Đặt hàng
Hôm qua, 14:27 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi tuyennhanCách ly dây điện vào , bộ nguồn và đèn khỏi khung xe thì có rò thật cũng không lo bị giật .
-
Channel: Điện tử dành cho người mới bắt đầu
21-12-2024, 08:56 -
-
Trả lời cho Hỏi cách điều chế xungbởi thetungBạn cho qua cái Tờ ri gơ Sờ mít ấy ......
-
Channel: Kỹ thuật điện tử tương tự
16-12-2024, 11:26 -
-
Trả lời cho Hỏi cách điều chế xungbởi nguyendinhvanCó gì mà khó ?
Răn cưa vuông đây
...-
Channel: Kỹ thuật điện tử tương tự
15-12-2024, 23:36 -
-
Trả lời cho hỏi về tụ điệnbởi ndp62Chữ " VENT" không phải là tên hãng sx tụ đâu ,vó thế là 1 ký hiệu liên quan tụ lowesr ?
-
Channel: Điện thanh
15-12-2024, 18:24 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi bqvietTrừ trường hợp công suất (rất) thấp, hầu như tất cả các loại nguồn xung thông thường đều có tụ nhỏ 1 - 10nF nối giữa sơ cấp và thứ cấp, để thoát nhiễu và để chống hiện tượng tương tự tĩnh điện. Vụ này đã thảo luận vài...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 22:02 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi namlangnhoE thử 3 cái nguồn nó đều giống nhau. Nên e làm tiếp địa luôn.
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 19:58 -
-
Trả lời cho Thắc mắc về nguồn tổ ong 12vbởi mèomướpDạ chú sắm con át chống giật và thay nguồn tổ ong khác cho an toàn ạ. Đa phần nguồn xung đều xả nhiễu của bên thứ cấp về điện lưới qua 1 con tụ nên cảm giác tê sẽ khó xác định rõ ràng là do rò điện hay là nó vốn vậy...
-
Channel: Điện tử dành cho người mới bắt đầu
14-12-2024, 18:51 -
Comment