PDA

View Full Version : Học PIC qua những thực nghiệm cụ thể


LMT
28-05-2006, 04:52 PM
Minh mới bắt đầu tìm hiểu về vi điều khiển thông qua việc học PIC. Cách học của mình chắc cũng giống như nhiều bạn khác. Đọc qua lí thuyết --> viết code --> cho chạy trên mạch thực tế. Mình nghĩ nếu có một góc để tập trung những thực nghiệm đã làm thì những bài viết ấy sẽ mang tính tham khảo rất có ích cho những người mới bắt đầu học PIC. Hy vọng những bạn mới học PIC ủng hộ, post lên những thực nghiệm mà mình đã làm. Và những senior giàu kinh nghiệm cũng bỏ chút thời gian ghé mắt xem bọn junior đã làm gì để chỉ dẫn cụ thể, rút kinh nghiệm cho junior.

LMT
28-05-2006, 05:13 PM
Chattering, hay còn gọi hiện tượng "bị dội" là một điều rất cần chú ý khi làm thực nghiệm. Khi mình học về interrupt thông qua bit thứ 0 của portB. Mình làm một bài tập cụ thể như sau: cứ mỗi lần bật-tắt switch (được nối với RB_0) thì 5 cái LED (được nối với portA) sẽ thay đổi kiểu chiếu sáng theo một quy luật nhất định nào đấy.

-Về "quy luật nhất định nào đấy" thì mình sử dụng kỹ thuật tham chiếu bảng để thay đổi giá trị của portA.
-Để mỗi lần bật-tắt switch thì thay đổi giá trị portA mình sử dụng interrupt bằng RB0.

Mục đích của thực nghiệm này là học về interrupt qua RB0 và kỹ thuật tham chiếu bảng.

Mình đã viết chương trình và debug thử trên máy tính. Kết quả rất tốt. Sau đó mình lắp mạch cụ thể và cho chạy thì khi mỗi lần bật-tắt switch thì portA cũng thay đổi giá trị nhưng không theo quy luật mình đã định trước. Mình đã tham khảo kỹ PIC_tutorial bằng tiếng Việt (down được trên diễn đàn này, cái tutorial này hình như của bác nào dịch từ tutorial tiếng Anh, ở phần cuối tutorial này vẫn còn nguyên tiếng Anh) về phần interupt bằng RB0. Thậm chí còn copy y chang code, làm một cái mạch giống y chang như trong tutorial nhưng kết quả chạy trên mạch vẫn loạn xạ ngầu.

Hic,hic, mệt quá, đi ăn cơm. Trong lúc ngồi gặm gạo luộc, nghĩ ngợi lung tung... Rõ ràng là debug trên máy tính đúng như mong đợi. Nhưng chạy trên mạch sai, chứng tỏ mạch có vấn đề. Vậy tại sao mình làm một mạch y chang như trong hướng dẫn vẫn bị sai???........... Ơ-rê-ca, chỉ có thể là nó - chattering. Chính vì chattering mà khi bất-tắt switch, giá trị của RB0 biến đổi loạn xạ làm số lần interupt tăng loạn xạ luôn.

Vậy xử lí chattering như thế nào? Mình sử dụng SR-flip-flop để trị thằng này.
219

Và tất nhiên, trị xong chattering xong chẳng còn vấn đề gì.

Mình có nghe nói có thể xử lí chattering bằng phần mềm nhưng không rõ cụ thể như thế nào. Mong bác nào biết chỉ bảo cho

Ngoài ra, một kinh nghiệm xương máu nữa là liên quan đến RA4. Thằng RA4 khác với mấy thằng RAx hay RBx khác. Đó là do trong cấu tạo PIC, ở mấy pin của các port đã có sẵn một FET đóng vai trò như một điện trở kéo lên. Riêng ở pin RÃ thì không có cái FET này nên khi nối RÃ với LED thông qua một điện trở thích hợp và set cho RA4 bằng 1, LED sẽ không sáng. Do vậy, cần mắc thêm một điện trở kéo lên ngay tại pin của RA4 để giải quyết vấn đề này.

Nhưng có một điều mình vẫn chưa biết là chức năng TOCKI của RA4 là gì và được sử dụng như thế nào. Mong các bác chỉ bảo

namqn
28-05-2006, 08:27 PM
Theo tôi, học theo cách này có hiệu quả nhất về thời gian cũng như kinh nghiệm thực tế.

Hiện tượng 'dội' của nút nhấn/công tắc thường được gọi trong tiếng Anh bằng từ bouncing, và kỹ thuật khắc phục được gọi là debouncing.

Để thực hiện bằng phần mềm, mỗi khi bạn vào ngắt do có tác động vào RB0, bạn dùng một đoạn chương trình để chờ một khoảng thời gian nào đó, sau đó kiểm tra lại trạng thái của chân RB0, nếu trạng thái lúc này là ổn định (nghĩa là sau hai lần đọc liên tiếp, cách nhau một khoảng thời gian nào đó, mà trạng thái là giống nhau) thì bạn có thể xem như nút nhấn/công tắc đã hết dội và có thể thực hiện các thao tác kế tiếp. Tất nhiên đây là một cách khá trực quan, nếu yêu cầu xử lý phức tạp hơn thì chúng ta sẽ cần những thuật toán hiệu quả hơn.

Đối với chân RA4, datasheet thường có nêu rõ từng chức năng khác nhau của chân. Rõ ràng trong datasheet có ghi RA4 khi là ngõ ra sẽ có kiểu OD (open drain-cực máng hở). Còn chức năng T0CKI là ngõ vào cho Timer 0, trong trường hợp bạn muốn dùng một nguồn clock ngoài làm clock cho Timer 0, có thể dùng để đếm các sự kiện bên ngoài.

Thân,