![]() |
|
Tài trợ cho PIC Vietnam |
||||||||
| PIC - Thiết kế và Ứng dụng Ý tưởng cho các sản phẩm sử dụng PIC/dsPIC và các sản phẩm của Microchip |
![]() |
|
|
Ðiều Chỉnh | Xếp Bài |
|
|
|
|
#1 |
|
Đệ tử 1 túi
Tham gia ngày: Jun 2006
Bài gửi: 20
: |
- 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 !!! |
|
|
|
|
|
#2 |
|
PIC Bang chủ
|
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
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
|
#3 | |
|
Đệ tử 1 túi
Tham gia ngày: Jun 2006
Bài gửi: 20
: |
Trích:
Thân ! ![]() thay đổi nội dung bởi: falleaf, 24-06-2006 lúc 11:08 PM. |
|
|
|
|
|
|
#4 |
|
PIC Bang chủ
|
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
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
|
#5 | |
|
Đệ tử 1 túi
Tham gia ngày: Jun 2006
Bài gửi: 20
: |
Trích:
- 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 !!! |
|
|
|
|
|
|
#6 | |
|
PIC Bang chủ
|
Trích:
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
__________________
Công ty TNHH Thương mại và Giao nhận R&P store.hn@rpc.vn - store.hcm@rpc.vn Học PIC như thế nào? |
|
|
|
|
|
|
#7 |
|
Đệ tử 1 túi
Tham gia ngày: Jun 2006
Bài gửi: 20
: |
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 ! thay đổi nội dung bởi: falleaf, 08-07-2006 lúc 08:46 PM. |
|
|
|
![]() |
|
|