![]() |
|
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 |
Đệ tử 6 túi
Tham gia ngày: Oct 2008
Nơi Cư Ngụ: HCM
Bài gửi: 137
: |
Ngoài cách kiểm tra dữ liệu sẽ nạp vào 01 ô nhớ (nếu >=256) thì cho tách dữ liệu.
thì còn có cách nào khác biết 1 ô nhớ bị tràn không bạn(ví dụ như bật một cờ báo nào đó chẳng hạn- mình dùng ccs - c nha!)?để mình có thể kiểm tra nếu tràn thì tự động cho tách dữ liệu. |
![]() |
![]() |
![]() |
#2 | |
Trưởng lão PIC bang
|
Trích:
Lấy ví dụ, giả sử chúng ta dùng một biến kiểu unsigned int32 (lưu trữ trong 4 byte) để lưu giá trị của một đại lượng nào đó. - Nếu giá trị của đại lượng đó >= 16777216, thì chắc chắn byte cao nhất của biến sẽ khác 0x00, - Nếu giá trị của đại lượng đó nằm giữa 65536 và 16777216 (65536 <= giá trị < 16777216) thì chắc chắn byte cao thứ nhì của biến sẽ khác 0x00, byte cao nhất sẽ bằng 0x00, - Nếu giá trị của đại lượng đó nằm giữa 256 và 65536 (256 <= giá trị < 65536) thì chắc chắn byte thấp thứ nhì của biến sẽ khác 0x00, byte cao nhất và cao thứ nhì sẽ bằng 0x00, - Nếu giá trị của đại lượng đó <= 255 thì chắc chắn byte thấp nhất của biến sẽ khác 0x00, các byte cao hơn sẽ bằng 0x00. Dữ liệu đã nằm sẵn ở các byte của biến, bạn có thể dùng hàm make8() của CCS C để lấy chúng ra và ghi vào EEPROM bất kỳ lúc nào. Khả năng tràn số chỉ xảy ra khi bạn thực hiện phép toán số học trên biến, và PIC có cờ C trong thanh ghi STATUS cho biết phép toán số học gần nhất có tạo ra việc nhớ/mượn. Khi đã xảy ra tràn số thì bạn không thể so sánh để phát hiện đâu. Ví dụ, bạn dùng một byte để lưu giá trị. Giả sử hiện thời giá trị là 200. Sau khi bạn cộng nó với 100, về lý thuyết thì bạn có kết quả là 300, nhưng vì 1 byte không thể biểu diễn được 300, nên bạn chỉ nhận được giá trị 0x2C (44 thập phân) trong byte đó, và bit thứ 9 đã được chuyển vào cờ C trong thanh ghi STATUS. Lúc này, xuất hiện việc tràn số do kết quả của phép cộng. Byte nhớ của bạn sẽ không bao giờ chứa được giá trị >= 256, do đó phép so sánh >= 256 của bạn sẽ luôn luôn cho kết quả false. Nếu bạn dùng biến có độ dài 2 byte để lưu giá trị, thì với phép cộng trên, byte thấp sẽ là 0x2C, còn byte cao sẽ là 0x01, và không xảy ra sự tràn số. Các dữ liệu đã nằm sẵn ở các byte tương ứng, không cần phải tách dữ liệu bằng cách so sánh giá trị xem có >= 256 hay không. 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 |
|
![]() |
![]() |
![]() |
Ðiều Chỉnh | |
Xếp Bài | |
|
|