PDA

View Full Version : tính độ giữ chậm


bachelor1979
10-06-2006, 06:18 PM
hi !
tôi cần tính độ giử chậm của 1 xung so với 1 xung chuẩn với các đặc điểm sau:
biên độ các xung khoảng 100V, độ rộng cỡ mikros
xung cần đo trôi dần về xung chuẩn (tức là dộ giữ chậm sẽ giảm dần sau mỗi chu kỳ)
chu kỳ lặp lại của xung chuẩn cỡ vài s
tôi định dùng các bộ định thời và ngắt ngoài của PIC để đo, sau đó gửi dữ liệu tới PC qua RS232 để xử lý.
Ý tưởng là thế nhưng bắt tay vào làm mới thấy khó, các bác nào có kinh nghiệm và quan tâm thì giúp tôi với nhé !

namqn
10-06-2006, 07:09 PM
Bạn có thể cho biết từ gốc tiếng Anh của 'độ giữ chậm' hay không?
Xung chuẩn là dạng xung gì?

Thân,

bachelor1979
11-06-2006, 09:52 AM
độ giữ chậm là "timedelay" nó là khoảng thời gian tính từ lúc có xung chuẩn đến lúc xuất hiện xung cần đo, xung chuẩn là xung có chu kỳ lặp lại cố định dùng để đo timedelay, nó ko có gì đặc biệt đâu. Mong các bác chỉ giáo giúp, có gì ko hiểu về bài toán cứ hỏi em xin trả lời ngay !
Thân

lhmai
11-06-2006, 02:21 PM
Đó có phải là đo độ lệch phase giữa xung cần đo và xung chuẩn ? Với độ rộng xung cỡ micro giây thì sai số sẽ rất lớn nếu dùng PIC với thạch anh 20Mhz, vì khi đó 1 chu kỳ máy đã là 200ns. Nhảy đến được phần xử lý trong ngắt có khi phải mất cả us rồi. Theo tôi, cần dùng các linh kiện khác tách ra 1 xung có độ rộng bằng độ lệch pha, giữ lại, rồi mới đưa vào uC để tính ra số và truyền đi, không nên đưa trực tiếp các xung vào PIC.

namqn
11-06-2006, 05:54 PM
Còn nhiều yếu tố cần được xác định trước khi có thể đề xuất một giải pháp.

Giả thiết là bạn chỉ phát xung chuẩn và xung cần đo ở dạng sóng vuông. Độ chính xác của thời gian trễ (time delay) cần thiết là bao nhiêu? Bạn có thể phát xung chuẩn nhanh hơn (khoảng vài miligiây một xung chẳng hạn) hay không?

Sau cùng, tôi nhắc lại một ý mà tôi thường đề cập khi trả lời các câu hỏi dạng này: bạn nên cho biết bài toán gốc, đừng hỏi cách thực hiện một điều gì đó mà bạn cho là giải pháp của bài toán.

Thân,

bachelor1979
23-06-2006, 10:27 PM
Còn nhiều yếu tố cần được xác định trước khi có thể đề xuất một giải pháp.

Giả thiết là bạn chỉ phát xung chuẩn và xung cần đo ở dạng sóng vuông. Độ chính xác của thời gian trễ (time delay) cần thiết là bao nhiêu? Bạn có thể phát xung chuẩn nhanh hơn (khoảng vài miligiây một xung chẳng hạn) hay không?

Sau cùng, tôi nhắc lại một ý mà tôi thường đề cập khi trả lời các câu hỏi dạng này: bạn nên cho biết bài toán gốc, đừng hỏi cách thực hiện một điều gì đó mà bạn cho là giải pháp của bài toán.

Thân,
Mấy lần đăng nhập mà ko post được bài, ko hiểu lỗi tại sao, hôm nay mới post được may quá !!!!!!!!!!!!!!!!!
OK, tôi xin trình bày bài toán gốc cho bạn namqn được rõ:
nguyên lý hoạt động của một đài radar nhìn vòng (gọi tắt là VIKO) có thể được tóm tắt một cách cơ bản như sau.
- 1 xung thăm dò (chính là xung chuẩn) được phát lên không gian với chu kỳ lặp lại 10 giây (tương ứng với 6 vòng quét/1 phút)
- Khi gặp mục tiêu cần phát hiện (máy bay, tên lửa, ...) sẽ có 1 xung phản xạ từ chúng ngược trở về VIKO (tất nhiên gặp những mục tiêu tàng hình thì ... chịu )
- trong điều kiện lý tưởng (môi trường đồng nhất, đẳng hướng, ...) có thể coi vận tốc lan truyền sóng điện từ xấp xỉ vận tốc ánh sáng c, gọi t là thời gian tính từ lúc phát xung thăm dò đến lúc nhận được xung phản xạ (chính là độ giữ chậm mà bạn namqn đã từng hỏi) ta có thể tính được cự ly tức thời từ mục tiêu tới VIKO theo công thức sau: d = t*c/2
- dựa trên những điều này VIKO sẽ tạo ra được một điểm dấu mục tiêu trên màn hình để người quan sát có thể xác định được hướng xuất hiện của mục tiêu (gọi là góc phương vị) và khoảng cách từ mục tiêu tới vị trí quan sát (vị trí đặt VIKO)
Giá thành của 1 VIKO là rất lớn (tất nhiên !!!!!) và để phục vụ cho các mục đích nhỏ hơn (luyện tập, kiểm tra, ...) người ta đã có các thiết bị tạo giả ra các xung thăm dò và xung phản xạ (tất nhiên chỉ dừng ở mức tạo giả phần thị tần - không tạo giả phần cao tần, và như vậy là đủ cho bài toán của chúng ta). Nhiệm vụ của tôi (và các bạn !!!) là phải xử lý thông tin nhận được từ các xung đó và hiển thị lên PC như một màn hình VIKO (mô phỏng màn hình VIKO trên PC)
Hãy tạm gác sang 1 bên phần xử lý sơ bộ xung đầu vào (tức là hạn mức biên độ từ 100V xuống còn 5V, kéo dãn độ rộng và sửa dạng xung cho vi điều khiển có thể xử lý được mà vẫn giữ được độ chính xác của sườn lên - tương ứng với thông số về độ giữ chậm, ...) - tin tôi đi, nội việc này thôi đã đủ làm chúng ta đau đầu rồi !!! Các bạn hãy giúp tôi nhận được thông tin về độ giữ chậm từ các xung phản xạ so với xung chuẩn (không phải chỉ 1 xung phản xạ mà là nhiều xung xuất hiện 1 cách ngẫu nhiên - tương ứng với việc có hay không có của các mục tiêu, và độ giữ chậm này có thể giảm dần or tăng dần - tương ứng với việc mt bay vào or bay ra)
Bài toán của tôi là như vậy đấy bạn namqn và các bạn à ! Một số giải pháp tôi đã đề cập ở các bài trước, các bạn có cao kiến gì hãy chỉ giáo cho tôi nhé !
Thân !

falleaf
23-06-2006, 11:47 PM
Nguyên tắc quãng đường = thời gian * vận tốc/2, người ta còn gọi là flying time, và phương pháp định vị người ta gọi là TOF = Time Of Flight. Có lẽ vì bạn dùng từ timedelay = độ giữ chậm thì anh Nam không hiểu.

Nguyên tắc này nói một cách sơ lược, đó là thời điểm t_0, chúng ta phát một xung đi (xem chỉ là cạnh xung thôi, không quan tâm độ rộng). Sóng siêu âm, điện từ, hoặc gì gì đó, sẽ bay trong không gian hoạt động với vận tốc v_{moitruong}^{loaisong}. Như vậy, tổng thời gian đi về của xung này, chính là 2 lần thời gian bay của sóng từ điểm đầu đến điểm cuối (vì còn phải dội ngược về). Nguyên tắc, nếu ta đo được thời gian bay của sóng, thì chúng ta xác định được quãng đường theo công thức:

quangduong = \frac{1}{2}\Delta t v_{moitruong}^{loaisong}

Về bài toán của bạn, thực chất không có gì khác bài toán siêu âm, tuy nhiên, một vấn đề rất nghiêm trọng, đó là thời gian bay của sóng của bạn quá nhanh (bằng vận tốc ánh sáng). Do vậy, VIKO thực sự làm việc gì?

VIKO thực hiện giống như trên cái thước ban-me, có nghĩa là nó phát ra xung liên tục ở một độ phân giải nhất định, sau đó đến khi nào có sự trùng lặp sóng, thì nó xác định được độ phân giải đó. Bởi vì thực tế, không thể phát hiện được độ sai lệch thời gian khi sóng chuyển động với vận tốc ánh sáng. Đây là một giải pháp khá hay, dùng giải pháp của thước ban-me cơ để đo thời gian :) Không biết F hiểu như vậy có đúng không :).

Oki, việc đơn giản, đó là bạn nhận xung về. Chính xác là bạn cần phải dùng ngắt ngoài để xử lý thôi, nhưng một lưu ý rằng, độ rộng xung của bạn rất nhỏ, nó bắt cạnh lên, chúng ta quan tâm ở đó đã.

Ngắt xảy ra trong PIC chiếm khoảng 20 - 30 dòng lệnh, nếu viết tối ưu code và phụ thuộc chương trình, sẽ có thể giảm nữa. Tổng cộng riêng xử lý ngắt hết khoảng 5 - 10us.

Như vậy, đây sẽ là sai số chủ yếu mà bạn cần phải tính đến. Nói chung, giải pháp dùng ngắt của bạn hoàn toàn không có gì không được cả. Dùng ngắt đọc cạnh lên của xung là oki, còn phần cạnh xuống, không biết bạn có cần đọc không, vì mình không biết chi tiết và nguyên lý chính xác của nó như thế nào. Nhưng mà nếu phải đọc cạnh xuống nữa, thì cái này thật là khó.

Nếu phải đọc cạnh xuống nữa, thì phải thực hiện như sau:
Ngắt cạnh lên
enable lại ngắt ngoài (dùng ngắt trong ngắt để lưu lại giá trị cạnh xuống), sau đó xử lý cả hai. Đây là giải pháp.
Bạn xem bài viết về xử lý ngắt trong ngắt bên dientuvietnam, box Vi điều khiển PIC, bài viết những câu đố vui...

Còn vấn đề xử lý ngắt như thế nào, tuỳ vào bạn muốn viết chương trình bằng MPASM hay C?

Có bài hướng dẫn của F bên phần Học PIC trong 1 ngày, để viết ngắt cho PIC trong MPASM.

Thuật toán của bạn sẽ phải được thực hiện như sau:

Đặt timer = 0;
Phát xung (nhớ tính toán lại thời gian thực chính xác khi xung được phát đi);
Chờ tín hiệu phản hổi trên chân RB0 (ngắt ngoài);
Nếu có ngắt
đọc timer;
giá trị timer chính là giá trị TOF
Nếu không (không có vật cản)
thoát;

Chỉ đơn giản vậy thôi. Còn việc xử lý chi tiết của hệ thống bạn thế nào, thực tình F không biết cái hệ thống VIKO nó ra sao, như thế nào, nguyên lý hoạt động thể nào, chỉ dựa vào mô tả của bạn để đoán ra nguyên lý hoạt động. Nếu có thể, bạn mô tả nguyên lý hoạt động và có hình ảnh minh hoạ rõ hơn, chúng ta sẽ có bài toán hay đó, vì làm một cái thước ban-me để đo thời gian đúng là một ý tưởng hay, chỉ không biết độ phân giải của nó là cỡ nào thôi.

Chúc vui

PS> Về việc bạn đăng nhập không thành công, nhớ thông báo cho F qua email, và bạn thử chọn nút ghi nhớ user, pw rồi đăng nhập, F nghĩ như vậy sẽ thành công.
Goodluck

bachelor1979
24-06-2006, 01:48 PM
- Về việc đăng nhập ko thành công, cám ơn ADMIN đã hướng dẫn, tôi sẽ thử theo cách của bạn, có lẽ tại tôi sử dụng mạng công cộng (INTERNET TRÀ ĐÁ !!!) nên đôi khi mạng cũng hơi bị đơ 1 chút (điều này khi còn ở VN chắc F cũng đã biết).
- Về bài toán tính TOF: Thuật toán để tính TOF của 1 xung phản xạ cơ bản đúng như F đã trình bày (chỉ xử lý cạnh lên thôi, ko cần xử lý cạnh xuống). Nhưng trong bài toán của tôi ko chỉ có 1 xung phản xạ mà có thể nhiều hơn, và quan trọng là CHÚNG NẰM CÙNG TRÊN 1 KÊNH, có nghĩa là nếu tôi dùng 1 chân nào đó (chân số 1 của PIC chẳng hạn) để làm chân nhận tín hiệu ngắt ngoài của xung phản xạ, tương tự chân 0 nhận tín hiệu ngắt của xung chuẩn và phát triển chương trình theo thuật toán mà F đã trình bày thì sẽ xuất hiện các trường hợp sau:
1 Phát xung chuẩn (xung thăm dò) -> kích hoạt chương trình ngắt tại chân 0 chương trình này sẽ set time = 0.
2 Nhận được xung phản xạ 1 -> kích hoạt chương trình ngắt tại chân 1, chương trình này sẽ read time, TOF1 = giá trị time đọc được
3 Chấm hết ko có gì xảy ra ở chân 1 nữa -> dễ quá đợi đến khi có xung chuẩn xuất hiện tại chân 0 (sau 10 giây nữa) quay trở lại bước 1
4 Lại nhận được xung phản xạ 2 tại chân 1 -> làm gì tiếp đây ? Theo tôi lúc này chương trình ngắt tại chân 1 (gọi tắt Là CTN1) và chg trình ngắt chân 0 (CTN0) sẽ phải thay đổi, cụ thể là cần thêm 1 cái biến counter toàn cục (tạm gọi là C), CTN0 sẽ set C = 0, CTN1 sẽ tăng C lên 1 và kiểm tra, nếu C = 1 -> TOF1 = giá trị time đọc được, nếu C = 2 -> TOF2 = TOF1 + giá trị time đọc được, nếu C = n -> TOFn = TOF(n-1) + readtime(), tất nhiên n <7
- Như F nói thời gian xử lý ngắt khoảng 5-10us, OK quá đủ để tính TOF, tuy nhiên sẽ là ko đủ nếu các xung phản xạ quá gần nhau (tức là các mục tiêu bay sát nhau) khi này có lẽ CTN1 chỉ xử lý được với TOF1, đây là 1 vấn đề mà tôi chưa giải quyết được.
- Thêm 1 vấn đề nữa, TOF giảm dần từ vài ms tới 0 (khi TOF = 0 và mục tiêu là 1 quả tên lửa không đối đất thì... BÙM... VIKO và hệ thống phòng không xung quanh nó sẽ biến mất trên bản đồ địa chính !!!) nhưng độ phân giải của các xung phản xạ lại tăng dần (khi các mục tiêu ở xa VIKO thì độ phân giải cỡ vài us và sẽ tăng dần khi chúng bay dần vào đài VIKO), thế thì cần phải cho bộ định thời hoạt động trong chế độ nào đây ? 16 bit hay 8 bit ?
Hay là bỏ cách tư duy này đi, nhưng tôi chưa nghĩ ra cách nào hay hơn cả ! F và các bạn giúp tôi với nhé !!!
Thân !!!

falleaf
24-06-2006, 10:06 PM
Vậy bạn có thể cung cấp hình vẽ giản đồ xung sơ bộ để F và các bạn khác hiểu rõ hơn về bài toán của bạn được không, vì bạn dùng một số từ tiếng Việt về xung chuẩn, xung mẫu... nhưng F lại không hiểu rõ về thiết bị của bạn, nên rất khó hiểu các từ tiếng Việt này. Kể cả khi từ tiếng Anh, dùng trong một ngữ cảnh nào đó, phải thuộc chuyên ngành mới biết. Vậy tốt nhất bạn nên vẽ giản đồ xung ra cho mọi người xem nhé. Nên vẽ màu sắc khác nhau, mô tả bằng hình là trực quan nhất.

Chúc vui

bachelor1979
24-06-2006, 10:40 PM
Vậy bạn có thể cung cấp hình vẽ giản đồ xung sơ bộ để F và các bạn khác hiểu rõ hơn về bài toán của bạn được không, vì bạn dùng một số từ tiếng Việt về xung chuẩn, xung mẫu... nhưng F lại không hiểu rõ về thiết bị của bạn, nên rất khó hiểu các từ tiếng Việt này. Kể cả khi từ tiếng Anh, dùng trong một ngữ cảnh nào đó, phải thuộc chuyên ngành mới biết. Vậy tốt nhất bạn nên vẽ giản đồ xung ra cho mọi người xem nhé. Nên vẽ màu sắc khác nhau, mô tả bằng hình là trực quan nhất.

Chúc vui
OK giản đồ xung được đính kèm dưới đây , F và các bạn lưu ý là T = const còn TOF giảm dần sau mỗi chu kỳ , nói theo chuyên nghành của tôi là các xung phản xạ trôi dần về xung chuẩn !
Thân !

http://i32.photobucket.com/albums/d28/picvietnam/timedelay.jpg

falleaf
24-06-2006, 11:14 PM
Mọi người chú ý khi post hình thì dùng photobucket.com để post hình và lưu trữ hình trên đó nhé, như vậy sẽ thuận tiện hơn cho việc theo dõi.

Như vậy, mình muốn hỏi thêm, giả sử như không nhận được xung phản xạ thì thôi, nhưng nếu nhận được xung phản xạ thứ nhất, thì phải chờ bao nhiêu xung phản xạ phía sau nữa? Và khoảng cách giữa những xung phản xạ này thực ra sẽ rất ngắn, vì nó bay với tốc độ ánh sáng. Như vậy, với tốc độ của vi điều khiển, liệu có đáp ứng được tốc độ đọc này không?

Giả sử bắt được hết các xung phản xạ, yên tâm, có giải pháp để bắt được hết, nhưng mà vấn đề độ phân giải là quan trọng, cho nên giới hạn giữa hai xung liên tiếp, gần nhất là bao nhiêu? Xa nhất là bao nhiêu? (trong thực tế), và tối đa có thể có bao nhiêu xung phản xạ sẽ thu được (con số mong đợi, hoặc tối đa hoặc tối thiểu để tính toán xử lý).

Chúc vui

bachelor1979
25-06-2006, 11:04 AM
Mọi người chú ý khi post hình thì dùng photobucket.com để post hình và lưu trữ hình trên đó nhé, như vậy sẽ thuận tiện hơn cho việc theo dõi.

Như vậy, mình muốn hỏi thêm, giả sử như không nhận được xung phản xạ thì thôi, nhưng nếu nhận được xung phản xạ thứ nhất, thì phải chờ bao nhiêu xung phản xạ phía sau nữa? Và khoảng cách giữa những xung phản xạ này thực ra sẽ rất ngắn, vì nó bay với tốc độ ánh sáng. Như vậy, với tốc độ của vi điều khiển, liệu có đáp ứng được tốc độ đọc này không?

Giả sử bắt được hết các xung phản xạ, yên tâm, có giải pháp để bắt được hết, nhưng mà vấn đề độ phân giải là quan trọng, cho nên giới hạn giữa hai xung liên tiếp, gần nhất là bao nhiêu? Xa nhất là bao nhiêu? (trong thực tế), và tối đa có thể có bao nhiêu xung phản xạ sẽ thu được (con số mong đợi, hoặc tối đa hoặc tối thiểu để tính toán xử lý).

Chúc vui
- Khoảng cách giữa các xung phản xạ trên thực tế nhỏ nhất cỡ vài us, điều này tôi ko nói chính xác được vì còn tùy thuộc vào khoảng cách giữa các mục tiêu và quỹ đạo chuyển động của chúng, nếu chương trình ngắt có độ dài từ 5-10us thì có thể chấp nhận được (thực tế với khoảng cách xung 5us thì hoặc là các mục tiêu bay rất sát nhau, hoặc là chúng đang ở rất xa, trường hợp thứ nhất ít khi xảy ra vì khi đó các mục tiêu rất dễ đâm vào nhau hoặc dễ bị bắn theo kiểu "xuyên táo" nên ko mấy khi mục tiêu cơ động gần nhau như vậy, còn trường hợp thứ hai với cự ly xa như vậy thì việc xác định đó là mục tiêu tốp hay xác định nhầm là 1 mục tiêu đơn ko quan trọng lắm)
- Số lượng các xung phản xạ dao động từ 0 (khi ko có mục tiêu) đến 6 (ở bài trước tôi đã nói rồi mà n < 7), n sẽ ko cố định mà có thể thay đổi (bạn cứ hình dung: giả sử ban đầu có 6 mục tiêu (tối đa) bay vào -> có 6 xung phản xạ, sau đó tùy tình huống có thể 1 mục tiêu phát nhiễu hoặc cơ động vòng ra(tức là bay ra khỏi vùng quan sát được của VIKO) -> số lượng xung phản xạ giảm đi) nói chung tối đa là 6 xung
- Khoảng cách gần nhất giữa các xung là 5us (cứ cho là như vậy đi để bài toán đỡ phức tạp hơn) còn khoảng cách xa nhất là 10s (nếu nhìn vào giản đồ xung bạn sẽ thấy điều này - bởi vì nếu khoảng cách đó vượt quá 10s nó sẽ bị lầm sang chu kỳ sau và trên thực tế không có xung phản xạ nào như vậy cả)
- Để F và các bạn dễ hình dung hơn tôi sẽ post lên đây chương trình mô phỏng VIKO của tôi, tất nhiên vẫn đang trong giai đoạn test và các mục tiêu là giả
Thân !!!

falleaf
25-06-2006, 07:15 PM
- Khoảng cách giữa các xung phản xạ trên thực tế nhỏ nhất cỡ vài us, điều này tôi ko nói chính xác được vì còn tùy thuộc vào khoảng cách giữa các mục tiêu và quỹ đạo chuyển động của chúng, nếu chương trình ngắt có độ dài từ 5-10us thì có thể chấp nhận được (thực tế với khoảng cách xung 5us thì hoặc là các mục tiêu bay rất sát nhau, hoặc là chúng đang ở rất xa, trường hợp thứ nhất ít khi xảy ra vì khi đó các mục tiêu rất dễ đâm vào nhau hoặc dễ bị bắn theo kiểu "xuyên táo" nên ko mấy khi mục tiêu cơ động gần nhau như vậy, còn trường hợp thứ hai với cự ly xa như vậy thì việc xác định đó là mục tiêu tốp hay xác định nhầm là 1 mục tiêu đơn ko quan trọng lắm)
- Số lượng các xung phản xạ dao động từ 0 (khi ko có mục tiêu) đến 6 (ở bài trước tôi đã nói rồi mà n < 7), n sẽ ko cố định mà có thể thay đổi (bạn cứ hình dung: giả sử ban đầu có 6 mục tiêu (tối đa) bay vào -> có 6 xung phản xạ, sau đó tùy tình huống có thể 1 mục tiêu phát nhiễu hoặc cơ động vòng ra(tức là bay ra khỏi vùng quan sát được của VIKO) -> số lượng xung phản xạ giảm đi) nói chung tối đa là 6 xung
- Khoảng cách gần nhất giữa các xung là 5us (cứ cho là như vậy đi để bài toán đỡ phức tạp hơn) còn khoảng cách xa nhất là 10s (nếu nhìn vào giản đồ xung bạn sẽ thấy điều này - bởi vì nếu khoảng cách đó vượt quá 10s nó sẽ bị lầm sang chu kỳ sau và trên thực tế không có xung phản xạ nào như vậy cả)
- Để F và các bạn dễ hình dung hơn tôi sẽ post lên đây chương trình mô phỏng VIKO của tôi, tất nhiên vẫn đang trong giai đoạn test và các mục tiêu là giả
Thân !!!

Dựa theo những gì bạn nói, chúng ta chắc chắn phải sử dụng ngắt trong ngắt để thực hiện vấn đề này.

Chúng ta có một số ràng buộc cần phải thực hiện. Giải sử, với 5us, chúng ta có thể thực hiện khoảng 20 lệnh (không dùng thạch anh tốc độ cao hơn), nhưng giả sử dùng dsPIC tốc độ cao hơn thì chúng ta có thể bớt đi một chút nguy hiểm, nhưng F cứ giả sử là như vậy đã để chúng ta giải quyết bài toán.

Giải pháp 1, chúng ta giảm bớt những câu lệnh trong chương trình ngắt ngoài:

Timer_temp[i] = timer
i = i+1;

Cái này dùng để giữ giá trị ngắt ngoại lại thôi, có nghĩa là chúng ta không xử lý gì cả, chỉ giữ lại giá trị để gần tới hết chu kỳ chúng ta mới xử lý, và truyền về máy tính để xử lý (chu kỳ 10s), giả sử đến 9.5 giây chúng ta mới xử lý.

Rồi, đoạn chương trình vào ngắt, giả sử chúng ta viết chương trình chỉ trong 1 page, và các lệnh vào ngắt có thể bỏ bớt những dòng lệnh thừa. Giảm tối đa được số lệnh vào và ra ngắt còn khoảng 10 lệnh, thay vì khoảng 20 lệnh như chuẩn, tức là chúng ta mất 2us ở đây.

Như vậy, về mặt nguyên tắc, nếu hai xung gần nhau nhất là 5us, thì đảm bảo xử lý được.

Cách làm như sau:

Chương trình ngắt:
Đoạn vào ngắt;
TIMERHIGH[i] = TIMER1H;
TIMERLOW[i] = TIMER1L;
i = i+1;
Đoạn kết thúc ngắt;

Như vậy, sau khi gần hết chu kỳ, chúng ta gửi mảng giá trị Timer[i] = TIMERHIGH[i]_TIMERLOW[i] (word 16 bit, kết nối lại) về cho máy tính xử lý. Còn lại, đảm bảo trong vòng chương trình ngắt, chỉ xử lý tối đa khoảng 2,3us thôi.

Trong đó, thời gian TOF = Timer[1] - đoạn vào ngăt; vì thời điểm đầu quay về.
delay[i] = Timer[i+1] - Timer[i]

Còn các đoạn sau thì chúng ta biết rõ là nó vào ngắt rồi

Như vậy luôn luôn đảm bảo.

Vấn đề tiếp theo. Đó là may mắn khi mà timer chưa tràn. Chúng ta phải xử lý vấn đề khi timer tràn nữa.

Như vậy, chúng ta phải bật một cái ngắt cho timer tràn nữa, nhưng luôn luôn ưu tiên ngắt ngoài. Lưu ý ở đây, timer bắt buộc setup ở tỉ lệ 1:1 so với tốc độ máy.

Cho nên, chỉ vài lệnh, thì timer không thể tràn 2 lần được, vì timer 1bit. Giả sử có 6 lần vào ngắt (6 xung nhận về, nếu đủ 6 xung thì thôi, không cho phép ngắt ngoài nữa). Tổng thời gian tối đa: 30 (lệnh trong ngắt ngoài) x 6 = 300. Trong khi đó, 16bit lưu được số lớn hơn nhiều. Thành ra cái này hoàn toàn không sợ. Chỉ sợ là giữa hai xung bất kỳ, có khi timer sẽ bị tràn.

Khi này chúng ta xử lý như sau:

Chương trình ngắt:

Đoạn vào ngắt;
Nếu là ngắt ngoài, thực hiện chương trình ngat1:
Nếu là ngắt timer, thực hiện chương trình ngat2:

ngat1:
TIMERHIGH[i] = TIMER1H;
TIMERLOW[i] = TIMER1L;
i = i+1;

ngat2: chỗ này lưu ý, phải enable ngắt ngoài
timer_counter = timer_counter + 1;
temp[i] = i; để biết là lúc nào thì thì cờ tràn, sau này mới xử lý được

Đoạn kết thúc ngắt;

Như vậy, rõ ràng, neu như trong đoạn này mà ngắt ngoài xảy ra, chúng ta sẽ gặp vấn đề. bị mất một số chu kỳ nếu như ngắt xảy ra. Do vậy, chỗ này phải sử dụng kỹ thuật ngắt trong ngắt.

Phần ngắt trong ngắt, bạn có thể xem cách xử lý ở dientuvietnam.
Viết MPASM thì sẽ đơn giản hơn. Lúc này đặt lại cờ GIE, nếu như ngắt xảy ra thì nó sẽ tự động nhảy lại về chương trình ngắt.

Chúc vui

bachelor1979
08-07-2006, 06:42 PM
Cảm ơn F, tôi sẽ nghiên cứu bài toán theo hướng gợi ý của bạn và sẽ có phản hồi sau (dạo này bận quá ko lên thường xuyên được).
Còn khá nhiều vấn đề phức tạp khác liên quan tới bài toán này và tôi sẽ còn phải nhờ đến các bạn giúp đỡ nhiều !
Thân !