![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 | |
Trưởng lão PIC bang
|
Trích:
Như tôi đã nói ở post trên, có thời gian trễ giữa thời điểm xuất hiện xung và việc diễn ra các thao tác. Cụ thể: khi xuất hiện xung thứ nhất, vài chu kỳ máy sau trình phục vụ ngắt ngoài mới được thực hiện, và mất thêm vài chu kỳ máy nữa cho việc lưu các thanh ghi cần được lưu (việc này trình biên dịch tự làm) rồi mới đến các lệnh thực sự. Khi xuất hiện xung thứ hai, tương tự như vậy, cũng mất một khoảng thời gian nữa mới đến việc thực thi các lệnh mà bạn muốn thực hiện cho trường hợp này, bên trong chương trình phục vụ ngắt. Thời gian trễ ở trường hợp thứ nhất và trường hợp thứ hai có thể khác nhau. Điều quan trọng hơn nữa, thứ tự thực hiện lệnh cho các trường hợp sẽ ảnh hưởng rất lớn đến sai lệch của kết quả. Bạn nên chỉnh lại thứ tự thực hiện như sau (cho trình phục vụ ngắt ngoài): - Ngắt ngoài khi có xung thứ nhất đến: gọi hàm set_timer0(0); gọi hàm enable_interrupts(INT_TIMER0); gán i = 0; - Ngắt ngoài khi có xung thứ hai đến: biến_tạm = get_timer0(), diasble_interrupts(INT_TIMER0); thời gian cần đo = i*256 + biến_tạm; [đơn vị us] Tuy nhiên, tôi cho rằng phương pháp sau tốt hơn: 1. Khởi tạo timer0 và cho phép ngắt timer0, nhưng timer0 chưa chạy; xóa thanh ghi timer0 2. Giả thiết bạn dùng PIC16/PIC18, chương trình phục vụ ngắt sẽ kiểm tra ngắt ngoài trước rồi mới kiểm tra ngắt timer0 3. Ngắt ngoài khi có xung thứ nhất đến: bật timer0 bằng hợp ngữ; gán i = 0; 4. Ngắt ngoài khi có xung thứ hai đến: đọc thanh ghi timer0 vào biến_tạm bằng hợp ngữ; tắt timer0; xóa thanh ghi timer0; thời gian cần đo = i*256 + biến_tạm; [đơn vị us] 5. Phần code phục vụ ngắt timer0 chỉ tăng i 6. Nếu thời gian đo được luôn lớn hơn hay nhỏ hơn thời gian thực tế, bạn có thể bù sai lệch này trong công thức tính thời gian cần do. Cần nhớ: Thứ tự viết code là quan trọng, vì bạn đo thời gian, mà các lệnh cũng cần thời gian để thực thi. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#2 | |
Đệ tử 2 túi
Tham gia ngày: Jun 2006
Bài gửi: 27
: |
Trích:
Thêm một câu hỏi nữa ![]() 1. Các xung làm nguồn ngắt ngoài có độ rộng (rỗng) 0,5 us đến 1 us. Không biết các ngắt ngoài có đáp ứng được không nhỉ (tôi chọn kích hoạt ngắt theo sườn lên). Mô phỏng trên proteus thì vẫn xử lý được, chưa thử thực tế ![]() 2. Hai xung (mà chương trình cần đo khoảng cách thời gian giữa chúng) không nằm cùng một kênh (một đường tín hiệu). Đây là lý do tôi không thể dùng timer như một counter mà phải dùng đến ngắt ngoài và sẽ phải dùng đến 2 ngắt ngoài cho 2 xung. 16f877a lại chỉ có một ngắt ngoài. Liệu có thể dùng một chân ngắt của PortB làm ngắt ngoài được không ? Lưu ý là độ rộng xung chỉ có từ 0,5 - 1 us , thằng ngắt ngoài thì còn khả dĩ nhưng liệu thằng ngắt cổng B có đáp ứng được không nhỉ ? Hay phải dùng đến PIC18 -> đắt ![]() Hai vấn đề này có vẻ hơi lạc với chủ đề đề cập ban đầu nhưng lại là những câu hỏi mang tính thực tế ![]() ![]() Thanhks ! |
|
![]() |
![]() |
![]() |
#3 | |
Trưởng lão PIC bang
|
Trích:
2. Một cổng OR 2 ngõ vào đơn giản sẽ giúp tôi dồn 2 tín hiệu đó vào một chân ngắt ngoài. Không nhất thiết phải dùng vi mạch logic, mà vài linh kiện rời vẫn có thể thực hiện chức năng này. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#4 | |
Đệ tử 2 túi
Tham gia ngày: Jun 2006
Bài gửi: 27
: |
Trích:
![]() ![]() 1. Namqn có thể chỉ giúp một vài sơ đồ mạch kéo dãn độ rộng xung sử dụng đc trong trường hợp này (với yêu cầu sườn trước của xung sau mạch hiệu chỉnh không được giữ chậm quá nhiều so với xung đầu vào) 2. Cái này theo tôi hơi khó, vì độ rộng của xung chỉ có từ 0,5 - 1 us có nghĩa là thời gian ngõ vào ở mức "1" rất nhỏ -> lại trở lại vấn đề tìm được các linh kiện rời or IC có thời gian đáp ứng đủ nhỏ là rất khó khăn. Nếu có thể Namqn chỉ giùm tôi luôn ![]() Thanks ! |
|
![]() |
![]() |
![]() |
#5 | |
Trưởng lão PIC bang
|
Trích:
2. Các vi mạch logic như 74HC32 (4 mạch OR 2 ngõ vào) có thời gian trễ lan truyền khoảng 20 ns ở nguồn 5 V, có lẽ không gặp vấn đề gì với xung của bạn. Không rõ bạn đã thử dùng các vi mạch loại này chưa mà bảo rằng không tìm được các IC có thời gian đáp ứng đủ nhỏ. Thân,
__________________
Biển học mênh mông, sức người có hạn. Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau: http://www.picvietnam.com/forum/showthread.php?t=1263 |
|
![]() |
![]() |
![]() |
#6 | |
Đệ tử 2 túi
Tham gia ngày: Jun 2006
Bài gửi: 27
: |
Trích:
![]() Quả thật chưa thử bao giờ, để xem thị trường ngoài Bắc có con này không đã ! Thanks ! |
|
![]() |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|