PDA

View Full Version : Các chế độ định địa chỉ cho vi điều khiển PIC


thiennp
24-06-2008, 10:51 AM
Mình mới tìm hiểu về PIC nên chưa hiểu lắm về các chế độ định địa chỉ cho PIC. Các bạn có thể giải thích cho mình hiểu về các chế độ định địa chỉ cho PIC được không. Bao gồm cả chế độ truy xuất bộ nhớ dữ liệu và bộ nhớ chương trình. Mình xin chân thành cảm ơn.

david
24-06-2008, 11:18 AM
Đọc kỹ cấu trúc bộ nhớ trong datasheet là công việc đầu tiên khi tìm hiểu một loại VDK !

thiennp
25-06-2008, 12:33 AM
Mình đọc rồi nó có chế độ định địa chỉ trực tiếp, gián tiếp, tức thì đ/v bộ nhớ dữ liệu, còn đ/v bộ nhớ chương trình có 2 chế độ định địa chỉ là trực tiếp và gián tiếp nhưng mình ko hiểu lắm về cơ chế nó làm như thế nào, mong các bạn giải thích cụ thể và lấy ví dụ cho mình dễ hiểu

phamminhtuan
25-06-2008, 02:05 AM
Mình mới tìm hiểu về PIC nên chưa hiểu lắm về các chế độ định địa chỉ cho PIC. Các bạn có thể giải thích cho mình hiểu về các chế độ định địa chỉ cho PIC được không. Bao gồm cả chế độ truy xuất bộ nhớ dữ liệu và bộ nhớ chương trình. Mình xin chân thành cảm ơn.

Mình đọc rồi nó có chế độ định địa chỉ trực tiếp, gián tiếp, tức thì đ/v bộ nhớ dữ liệu, còn đ/v bộ nhớ chương trình có 2 chế độ định địa chỉ là trực tiếp và gián tiếp nhưng mình ko hiểu lắm về cơ chế nó làm như thế nào, mong các bạn giải thích cụ thể và lấy ví dụ cho mình dễ hiểu

PIC (ở đây nói đến PIC6F877A quen thuộc) có vùng nhớ RAM nhiều hơn 256 byte, do vậy việc định địa chỉ sử dụng 1 byte địa chỉ là không đủ, dĩ nhiên là trỏ tới địa chỉ 0x1FF thì không thể dùng 1 byte để chứa địa chỉ đó, trong khi đó, bus địa chỉ sử dụng chỉ có 7 bit, tối đa là 8 bit cho bus địa chỉ gián tiếp. Và giải pháp định địa chỉ cho PIC này là 9 bit địa chỉ cho vùng RAM rộng đến 512 byte. Tuy nhiên, 2 bit cao nhất không nằm trong bus địa chỉ, bus địa chỉ chỉ có 7 bit (truy xuất trực tiếp) hay 8 bit (truy xuất gián tiếp) mà nằm ở thanh ghi trạng thái STATUS, là RP0 và RP1
http://lh5.ggpht.com/phamminhtuan.04/SGE21qX9jWI/AAAAAAAABA4/Ya1Blb8uYnM/ScreenShot002.jpg?imgmax=512

2 bit này chia toàn bộ vùng nhớ ra làm 4 bank tương ứng với giá trị của nó. Vậy có nghĩa là với 7 bit địa chỉ kia, nếu giả sử có giá trị là 0x0D, [Xem hình nhé] với 2 bit RP1:RP01 = 00 thì bạn đang truy xuất đến thanh ghi PIR2, còn RP1:RP0 = 01, thì bạn đang truy xuất đến PIE2, còn RP1:RP0 = 10 thì bạn đang truy xuất đến EEADR, tương tự "11" thì truy xuất đến EECON2.

Bạn yên tâm là cho dù RP1:RP0 có bằng bao nhiêu đi nữa thì việc truy xuất đến các thanh ghi STATUS, PCL, FSR, PCLATH, INTCON đều được cả, nhìn hình là rõ ngay thôi.

Còn về truy xuất địa chỉ gián tiếp thì dùng thanh ghi FSR thì bạn quan tâm đến bit IRP của thanh ghi STATUS, nếu là 0 thì 8 bit của FSR trỏ đến 256 byte của 2 bank đầu là bank 0 và bank1, nếu IRP là 1 thì FSR trỏ đến 256 byte của 2 bank sau. [Xem hình nhé]
http://lh6.ggpht.com/phamminhtuan.04/SGE21tZmZAI/AAAAAAAABAw/nfD6M3_Xi8Q/ScreenShot001.jpg?imgmax=512

thiennp
25-06-2008, 09:18 PM
Thanks bạn, mong các bạn sẽ tiếp tục đóng góp ý kiển để làm rõ vấn đề hơn nữa

vu4096
21-08-2010, 01:04 AM
Xin chào
Còn nếu bộ nhớ chương trình ở page1, page2, page3 thì chúng ta không thể sử dụng địa chỉ trực tiếp được mà phải sử dụng địa chỉ gián tiếp. Vậy thì đối với việc định địa chỉ gián tiếp như vậy thì ta làm cách nào để chuyển dử liệu thì thanh ghi này sang thanh ghi kia.
Ví dụ như chuyển nội dung thanh ghi A sang thanh ghi B đối với chế độ định địa chỉ trực tiếp thì
MOVF A , W
MOVWF B
Còn đối với chế độ gián tiếp thì:
MOVLW ĐỊA CHỈA
MOVWF FSR
MOVF INDF , W
Vì phải dùng thanh ghi W làm trung gian để trỏ địa chỉ cho FSR thì chúng ta không thể nào thực hiện thao tác này được.
bạn nào biết xin chỉ dùm. cám ơn