Hôm trước trên yaho! chat có bác hỏi mình vừa ý là để mình thử thao tác với con cảm biến nhiệt độ 1 dây DS18b20 vừa là để đánh đố xem mình sẽ điều khiển nó ra sao để khỏi bị hiện tượng rung giật gì đó. "Rảnh rỗi sinh nông nổi" thừa thời gian thì cũng muốn thử xem sao, thế là lao vào. Bác ý có gợi ý qua đọc thông tin của con đó tốn rất nhiều ms chú làm thế nào đọc thông tin và hiển thị ra LED 7 đoạn "ý là không bị giật", vì khi đọc thông tin của DS18B20 thấy thiên hạ đồn phải tránh để chuơng trình bị ngắt nếu không đọc thông tin sẽ bị sai, mà mình lập trình thì chỉ quen mỗi cái trò dùng timer để quét, nếu không cho dùng ngắt thì coi như chặt tay mình . Dạo trên LED thì cũng có khá nhiều thông tin và dự án về con này "dạng open source" mình cũng lấy về xem, và quả là họ toàn phải disable interrupt rồi mới tiến hành đọc thông tin từ DS18, do vậy hầu hết người ta khuyên nên dùng LCD hoặc dùng IC chốt dữ liệu để tránh bị giật khi hiển thị, và 1 điều mình vô cùng ghét đó là chuơng trình của họ tiêu tốn rất nhiều CPU load(tiêu tốn năng lực xử lý của CPU máy tính nhưng cũng chính là VSL đang chạy với tốc độ rất "xót ruột"). Tìm datasheet của DS18 thì nắm được 1 thông tin vô cùng thú vị:
vậy ra đây chính là lý do bị tiêu tốn rất nhiều thời gian đối với DS18 đó là do thời gian chuyển đổi từ giá trị nhiệt độ sang dạng số hóa của DS18 rất cao, với chế độ 9bit thì mất khoảng "93.75ms" với chế độ 12bit thì mất gần 1s ~=750ms. Thảo nào thấy nhiều code khi bắt đầu chạy 1 cái là họ config ngay cho DS18 chạy ở chế độ 9 bit. Có điều nắm được thông tin này thì đối với mình thì đã bắt đầu manh nha nghĩ ra cách để khắc phục tình trạng trễ.
Do thời gian chuyển đổi là lớn nhất nên làm thế nào đó chia việc đọc DS18 thành 2 công đoạn 1 công đoạn là chỉ đặt DS18 ở trạng thái convert sau đó ta chuyển sang làm việc khác, sau 1 khoảng thời gian nhất định nào đó thì mình quay lại đọc tiếp, lúc này mới là đọc giá trị nhiệt độ. Hoặc sẽ dựa và DQ vì thấy datasheet bảo rằng trong quá trình convert DQ=0 khi convert hoàn thành thì DQ=1 vậy là có thể dùng chính DQ để tạo ra 1 cái ngắt ngoài cho chuơng trình của mình vậy là cơ bản mình đã có thể loại bỏ đựoc việc đợi DS18 convert dứoi đây mình có đính kèm project bằng mô phỏng để mọi người cùng tham khảo và góp ý. Do cách đọc làm 1 phase mình đã thử và làm việc cũng khá ok có điều lỡ xóa mất rồi, giờ chỉ còn cách dùng ngắt ngoài còn hàm đọc theo kiểu 2 phase thì mình có để lại đó nhưng không có code sử dụng cách đó, nếu ai đó cần thì mình có thể demo lại cho.
đây là hình mô phỏng của em nó với cpu Load ~=20% khá nhẹ mà hình như do máy tính đang chạy ở chế độ tiết kiệm điện nên chip chạy tốc độ thấp -> CPU load còn hơi cao
Đèn LED mình đặt ở đây để theo dõi quá trình đọc nhiệt độ. Mà cái này còn mắc mớ cái phần nhiệt độ âm, nếu ai đó có làm mạch thí nghiệm với cách này thì có thể đưa thắc mắc lên đây để tìm hướng giải quyết nhé do mình ko có điều kiện làm mạch thực nên chỉ mô phỏng chay đựoc đến vậy thôi.
vậy ra đây chính là lý do bị tiêu tốn rất nhiều thời gian đối với DS18 đó là do thời gian chuyển đổi từ giá trị nhiệt độ sang dạng số hóa của DS18 rất cao, với chế độ 9bit thì mất khoảng "93.75ms" với chế độ 12bit thì mất gần 1s ~=750ms. Thảo nào thấy nhiều code khi bắt đầu chạy 1 cái là họ config ngay cho DS18 chạy ở chế độ 9 bit. Có điều nắm được thông tin này thì đối với mình thì đã bắt đầu manh nha nghĩ ra cách để khắc phục tình trạng trễ.
Do thời gian chuyển đổi là lớn nhất nên làm thế nào đó chia việc đọc DS18 thành 2 công đoạn 1 công đoạn là chỉ đặt DS18 ở trạng thái convert sau đó ta chuyển sang làm việc khác, sau 1 khoảng thời gian nhất định nào đó thì mình quay lại đọc tiếp, lúc này mới là đọc giá trị nhiệt độ. Hoặc sẽ dựa và DQ vì thấy datasheet bảo rằng trong quá trình convert DQ=0 khi convert hoàn thành thì DQ=1 vậy là có thể dùng chính DQ để tạo ra 1 cái ngắt ngoài cho chuơng trình của mình vậy là cơ bản mình đã có thể loại bỏ đựoc việc đợi DS18 convert dứoi đây mình có đính kèm project bằng mô phỏng để mọi người cùng tham khảo và góp ý. Do cách đọc làm 1 phase mình đã thử và làm việc cũng khá ok có điều lỡ xóa mất rồi, giờ chỉ còn cách dùng ngắt ngoài còn hàm đọc theo kiểu 2 phase thì mình có để lại đó nhưng không có code sử dụng cách đó, nếu ai đó cần thì mình có thể demo lại cho.
đây là hình mô phỏng của em nó với cpu Load ~=20% khá nhẹ mà hình như do máy tính đang chạy ở chế độ tiết kiệm điện nên chip chạy tốc độ thấp -> CPU load còn hơi cao
Đèn LED mình đặt ở đây để theo dõi quá trình đọc nhiệt độ. Mà cái này còn mắc mớ cái phần nhiệt độ âm, nếu ai đó có làm mạch thí nghiệm với cách này thì có thể đưa thắc mắc lên đây để tìm hướng giải quyết nhé do mình ko có điều kiện làm mạch thực nên chỉ mô phỏng chay đựoc đến vậy thôi.
Comment