namqn |
27-01-2008 02:23 AM |
Trích:
Nguyên văn bởi wave_zx
(Post 14142)
theo như bài trên thì khi porta đã xuất ra là 0x00 thì đèn sẽ sáng. như vậy lúc này giá trị ở porta là 0x00 rồi, thế nhưng tại sao việc đọc lại sẽ là 0xff được ạ.port đã được định nghĩa là output rồi thì tại sao khi đọc lại lấy giá trị từ ngoài truyền vào.
Mong anh giải thích giùm em.cảm ơn anh đã trả lời.
|
Đọc thanh ghi PORTx luôn luôn đọc giá trị ở chân I/O của PIC (nếu như đã thiết lập đúng chế độ làm việc cho port đó). Ví dụ ở trên của tôi chỉ là 1 trong những khả năng có thể xảy ra (xuất 0x00 ra PORTA rồi COMF PORTA ngay sau đó, với tần số thực thi lệnh rất cao). Giải thích như sau: giả sử trước đó PORTA là 0xFF, sau đó lệnh xuất 0x00 ra PORTA được thực thi, rồi lệnh COMF PORTA được thực thi. Nhưng vì tần số thực thi lệnh rất cao, và chân I/O cũng như mạch ngoài nối vào có một điện dung nhất định, nên khi xuất 0x00 ra PORTA thì bộ đệm ra của PIC đang kéo chân I/O từ mức Vdd về 0V, trong khi đó lệnh COMF PORTA đã được thực thi tiếp đó. Lệnh COMF này sẽ đọc trạng thái của các chân I/O của PORTA, lúc này vẫn chưa giảm về 0 V, và có thể được hiểu là mức '1', tức là PORTA có thể được đọc về là 0xFF, sau đó lệnh COMF sẽ lấy complement của giá trị 0xFF, rồi ghi ra thanh ghi đệm ngõ ra của PORTA, tức là ghi 0x00. Dẫn đến kết quả thực thi lệnh COMF PORTA vẫn là xuất 0x00 ra PORTA. Cho nên mới có nhận định của bạn leduy173 rằng lệnh COMF PORTA có vẻ không thay đổi được trạng thái của PORTA. Đây chỉ là một trong những khả năng có thể xảy ra thôi.
Tóm lại, với các PIC16 (PIC12, và PIC10), hãy dùng một ô nhớ trung gian khi muốn thao tác trạng thái của thanh ghi PORTx.
Thân,
|