View Single Post
Old 20-04-2006, 05:20 PM   #15
ntc
Đệ tử 8 túi
 
ntc's Avatar
 
Tham gia ngày: Oct 2005
Nơi Cư Ngụ: HCM city
Bài gửi: 264
:
Send a message via Yahoo to ntc
Hì. Nhớ.

Bộ nhớ chương trình của PIC6F877A có dung lượng 8K và được chia làm 4 page.

Để mã hóa hết bộ nhớ chương trình, thì bộ đếm chương trình PC (Program Counter) cần có dung lượng 13 bit (8 K = 2exp13).

Các lệnh GOTO và CALL chỉ có thể gọi và nhảy trong vòng 2 K (trong trường hợp này nó là một page bộ nhớ chương trình, vì có 4 page, mỗi page 2 K => 8 K) bởi vì trong cách mã hóa lệnh của PIC dòng 16F cho các lệnh GOTO và CALL, thì 3 bit đầu dùng cho opcode (opcode dùng để mã hóa lệnh), 11 bit còn lại dùng cho tham số của các lệnh này. Việc cấu trúc như vậy giúp đảm bảo rằng mỗi lệnh của PIC sẽ được mã hóa bằng một số lượng bit nhất định, trong trường hợp của PIC dòng 16F là 14 bit.

Do tham số của các lệnh GOTO và CALL chỉ là 11 bit, cho nên vùng nhớ chương trình mà các lệnh GOTO và CALL có thể chuyển đến chỉ giới hạn trong vòng 2exp11 = 2 K.

Coi như giải quyết xong vấn đề về lệnh CALL và GOTO. Mình giải quyết tiếp vấn đề truy xuất bộ nhớ chương trình.

Địa chỉ truy xuất bộ nhớ chương trình nằm trong thanh ghi PC 13 bit và bao gồm 2 thanh ghi, PCL và PCH.

PCL là thanh ghi 8 bit. Nó nằm trong bộ nhớ dữ liệu luôn. Như vậy nó cho phép các thao tác như thanh ghi bình thường (đọc, ghi, xóa, ...). Một ứng dụng cho việc truy xuất này là kĩ thuật bảng. Bạn đọc lại cái TUT về kĩ thuật bảng của anh Hiệp hay của mình để nắm rõ hơn.

PCH chứa các bit cao của PC. Nhưng PC chỉ sử dụng 5 bit thấp (cộng lại là 13 bit). Thanh ghi này không cho phép các thao tác thông thường, vì nó không nằm trong bộ nhớ dữ liệu. Việc truy xuất nó phải thông qua thanh ghi PCLATH. Thanh ghi PCLATH nằm trong bộ nhớ dữ liệu.

Lệnh GOTO hay CALL sẽ lấy 3 bit thấp của thanh ghi PCH, và 8 bit của thanh ghi PCL làm tham số điều khiển (tổng cộng 11 bit).

Vấn đề còn lại nằm ở 2 bit 4 và 5 của thanh ghi PLH. Khi được reset, mặc định các bit này mang giá trị 0. Như vậy nếu chỉ dùng các lệnh GOTO hay CALL, ta chỉ có thể nhảy đi nhảy lại trong page 0 của bộ nhớ chương trình. Muốn chuyển đến các page khác, ta phải điều chỉnh giá trị trong các bit này.

Ví dụ:
Chuyển đến Page 1: PCLATH<5:4> = 01.
Chuyển đến Page 2: PCLATH<5:4> = 10.
Chuyển đến Page 3: PCLATH<5:4> = 11.

Thực chất của việc điều khiển này là để diều chỉnh lại giá trị trong bộ đếm chương trình thôi. Muốn truy xuất đến vũng nhớ có địa chỉ cao thì phải điều khiển giá trị địa chỉ của nó. Do giới hạn điều chỉnh của các lệnh GOTO và CALL mà ta cần thêm các thao tác bổ trợ này.

Vấn đề về bộ nhớ Flash. Nó cho phép ta truy cậo trực tiếp bằng phần mềm. Bạn tham khảo thêm datasheet của PIC để biết các thao tác truy xuất như thế nào. Việc truy xuất bộ nhớ chương trình đòi hỏi các yêu cầu khắc khe, các lệnh điều khiển cũng phải gộp chung lại thành một khối lệnh. Trong datasheet có hướng dẫn đó.

Một trong những ứng dụng rất hưu ích của việc ghi lên bộ nhớ chương trình là Tiny Bootloader. Firmware Tiny Bootloader thực hiện công việc này để bố trí lại bộ nhớ chương trình, cũng như ghi chương trình mới lên bộ nhớ chương trình mà không cần thông qua mạch nạp.

Tất nhiên ta cũng có thể sử dụng bộ nhớ chương trình với vai trò như EEPROM. Vấn đề là cách đọc và ghi lên nó. Còn EEPROM ngoài được truy xuất dựa trên các phương thức giao tiếp với nó.

__________________

ntc vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn