PSP và ứng dụng
Trang 1Với sự tham gia của khối PSP, các chức năng giao tiếp của vi điều khiển PIC trở nên hoàn thiện hơn, giống như một máy tính, với các cổng nối tiếp và một cổng song song. Ta
có thể tạm so sánh các khối giao tiếp nối tiếp của PIC như cổng COM hoặc cổng USB của máy tính, còn khối giao tiếp song song 8 bit PSP có thể so sánh như cổng LPT (cổng song song) của máy tính.
Một điểm tương đồng giữa PSP và các giao tiếp nối tiếp khác trong vi điều khiển PIC,
đó là PSP cũng là giao tiếp theo mô hình master‐ slave. Một master được phép điều khiển các giao tiếp với một hoặc nhiều slave. master có nhiệm vụ đưa ra các yêu cầu giao tiếp, ví
dụ như giao tiếp với slave nào, nội dung giao tiếp, định hướng chiều dữ liệu (đọc hay ghi
dữ liệu), … và slave có nhiệm vụ đáp ứng các yêu cầu đó của master. Tùy theo phương thức giao tiếp, ta có các qui định riêng về cách “ra lệnh” của master, cách đáp ứng của slave cũng như cách truyền nhận dữ liệu.
PSP cũng có các yêu cầu riêng về hoạt động giao tiếp. Tuy nhiên, có một điểm cần lưu ý
ở đây, là PSP của vi điều khiển PIC chỉ hoạt động được ở vai trò của một slave. Các hoạt động giao tiếp trên PSP sẽ được điều khiển hoàn toàn bởi một master.
Trên đây là một vài điểm sơ lược về PSP. Trong phần tiếp theo ta sẽ đi sâu vào cấu tạo
và hoạt động của PSP, cũng như xây dựng một số ứng dụng cơ bản cho PSP.
Trang 2
1.1 Cấu tạo phần cứng của PSP trong vi điều khiển PIC16F877A
PSP được tích hợp trong khá nhiều vi điều khiển PIC. Tùy theo vi điều khiển mà cách
bố trí các chân chức năng và các thanh ghi điều khiển cho PSP trong một vi điều khiển có thể khác nhau, tuy nhiên về bản chất, cấu tạo của PSP là không đổi. Trong bài này, vi điều khiển PIC16F877A được lựa chọn để tìm hiểu và xây dựng các ứng dụng cho PSP.
0.
Khi được cho phép hoạt động ở chế độ PSP, các chân điều khiển nêu trên sẽ không còn
được cho phép hoạt động ở chế độ I/O (port D) hoặc chế độ I/O Analog (port E) nữa. Lúc này, port D và port E sẽ được điều khiển bởi các thiết bị ngoại vi khác (một vi điều khiển
khác đóng vai trò là một master chẳng hạn) để truyền nhận dữ liệu song song 8 bit. Vai trò
cụ thể của chúng như sau:
‐ Port D là ngõ xuất nhập dữ liệu và hoàn toàn được điều khiển bởi khối PSP. Vai trò của thanh ghi TRISD trong trường hợp này sẽ được bỏ qua.
‐ Port E là các chân điều khiển và phải được thiết lập các chế độ hoạt động thích hợp,
đó là chế độ ngõ vào Digital. Chế độ này được điều khiển bởi thanh ghi TRISE và thanh ghi ADCON1.
Bên cạnh các chân điều khiển, PSP còn được hỗ trợ ngắt PSP và các bit trạng thái dùng
để điều khiển hoạt động của khối. Các thành phần hỗ trợ này được trình bày trong bảng sau(ta chỉ quan tâm tới các bit điều khiển liên quan tới PSP):
Thanh
ghi
Địa chỉ
TRISE
89h
6 OBF: Output Buffer Full status bit OBF = 1 : Có dữ liệu ở bộ đệm ngõ ra
Trang 35 IBOV : Input Buffer OVerflow detect bit IBOV = 1 : bộ đệm dữ liệu ngõ vào bị tràn IBOV = 0 : bộ đệm dữ liệu ngõ vào không bị tràn
4 PSPMODE : Parallel slave Port MODE PSPMODE = 1 : cho phép khối PSP hoạt động PSPMODE = 0 : không cho phép khối PSP hoạt động
2 :0 Các bit điều khiển hướng truy xuất của PORT E.
TRISE<2 :0> = 1 : Input TRISE<2 :0> = 0 : Output
Chứa cờ ngắt các ngắt ngoại vi
Bit Chức năng PIR1 0Ch
7
PSPIF : Parallel Slave Port Interrupt Flag bit PSPIF = 1 : Xảy ra ngắt PSP
PSPIE = 0 : Không cho phép ngắt ngoại vi PSP ADCON1 9Fh Chứa các bit điều khiển ADC. Cần thiết lập các giá trị thích hợp cho
thanh ghi này để các cổng I/O của port E là Digital input
1.2 Quá trình truyền nhận dữ liệu qua PSP
Ở chế độ PSP, port D đóng vai trò là nơi đọc và ghi dữ liệu được điều khiển bởi một master. Để thực hiện được cả hai vai trò là truyền và nhận dữ liệu, port D được bố trí hai
bộ chốt dữ liệu nhập và xuất tách biệt với nhau. Các chốt dữ liệu này được điều khỉển trực
tiếp bởi các chân điều khiển RD*, WR* và CS*. Tùy theo mức logic trên các chân điều
khiển này mà quá trình đọc hay ghi dữ liệu được tiến hành.
Ta sẽ dựa vào giản đồ xung để tìm hiểu quá trình truyền nhận dữ liệu của PSP. Trước tiên là quá trình ghi dữ liệu lên PSP:
Trang 4chuyển trạng thái từ mức logic 0 lên mức logic 1 và ngắt ngoại vi PSP (nếu đã được cho
phép trước đó bằng cách set bit PSPIE trong thanh ghi PIE1) sẽ được kích hoạt. Bit IBF (thanh ghi TRISE) chuyển lên mức logic 1 dùng để báo hiệu rằng dữ liệu bộ đệm ngõ vào
đã đầy. Bit PSPIF chuyển lên mức logic 1 dùng để chỉ thị trạng thái ngắt PSP. Bit PSPIF
phải được xóa bằng chương trình để nhận biết được trường hợp xảy ra ngắt tiếp theo.
Trong khi bit IBF chỉ được xóa khi dữ liệu từ buffer đệm được đọc vào. Trong trường hợp
dữ liệu cũ chưa được đọc vào mà dữ liệu mới đã muốn ghi lên PSP, bit IBOV sẽ chuyển lên mức logic 1.
Xét quá trình đọc dữ liệu từ PSP:
Hình 2: Giản đồ xung quá trình đọc dữ liệu từ PSP.
Trang 5
Giản đồ xung quá trình đọc dữ liệu từ PSP có thể phức tạp hơn so với giản đồ xung của quá trình ghi dữ liệu. Tuy nhiên nếu để ý phân tích kĩ, ta vẫn có thể hình dung được
‐ Thứ hai, khi dữ liệu chưa được đọc, buffer đệm đã có sẵn dữ liệu nên bit OBF sẽ ở mức logic 1. Khi dữ liệu được đọc, buffer đệm rỗng nên mức logic của OBF sẽ bằng
Ta sẽ xây dựng các ứng dụng này theo từng bước, từ thiết kế phần cứng đến viết chương trình.
Trang 6Dựa trên một vài ý tưởng như vậy, ta có thể xây dựng mạch nguyên lí cho ứng dụng
như hình 3.
Trong mạch ứng dụng ở hình 3, PSP của PIC16F877A slave sẽ được điều khiển bởi các
chân RE2 :RE0 của PIC16F877A master. Các chân dữ liệu của slave được nối với các chân của port D. Như vậy khối PSP của cả 2 PIC master và slave đều được nối chung với nhau
(xét trên quan điểm cấu tạo phần cứng của PIC16F877A). Tuy nhiên vai trò của mỗi PIC là
hoàn toàn khác biệt, đó là PIC master sẽ điều khiển PSP của PIC slave. Như vậy PIC slave được cho phép hoạt động ở chế độ PSP, còn PIC master sẽ không được cho phép hoạt động
ở chế độ PSP.
Thực chất ta hoàn toàn có thể sử dụng các port điều khiển khác của master để điều khiển PSP slave (dùng Port B và Port A chẳng hạn) mà không nhất thiết phải là port D và port E.
Ngoài ra, ta chỉ sử dụng một PSP slave nên việc điều khiển chân CS* (Chip Select) là không cần thiết và có thể nối trực tiếp chân CS* của PSP slave xuống mass. Trong trường hợp nhiều PSP slave được sử dụng, chân CS* được dùng để lựa chọn việc PSP slave nào
được cho phép truy xuất. Ở đây, do yêu cầu của ứng dụng là chỉ mang tính chất tìm hiểu
phương thức hoạt động của PSP, và để ứng dụng mang tính tổng quát cao hơn, chân CS*
vẫn sẽ được điều khiển.
Trang 7RD1 RD6
11
12 13
14
15 16 17 18
19 20 21 22
23 24 25 26
27 29 30
31 32
33 34 35 36 37 38 39 40
MCLR/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+
RA4/TOCKI/C1OUT RA5/AN4/SS/C2OUT RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
VDD
VSS OSC1/CLKI
OSC2/CLKO
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3
RC4/SDI/SDA RC5/SD0 RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD6/PSP6 RD7/PSP7
VSS VDD
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
30 pF
D1 SW1
31 32
33 34 35 36 37 38 39 40
MCLR/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+
RA4/TOCKI/C1OUT RA5/AN4/SS/C2OUT RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
VDD
VSS OSC1/CLKI
OSC2/CLKO
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3
RC4/SDI/SDA RC5/SD0 RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
VSS VDD
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
D3
4 MHz
RD4
0 D7
0
D4 R8
sẽ được kích hoạt, đồng thời quá trình đọc dữ liệu của master cũng đã kết thúc. Đây chỉ
mới là những phản ứng của phần cứng PSP khi được điều khiển bởi master, mà chưa có sự can thiệp của chương trình. Như vậy, một khi PSP slave đã có sẵn dữ liệu ở buffer đệm thì
mọi thao tác truy xuất sẽ hoàn toàn được điều khiển bởi master, và công việc của PSP slave, đơn giản chỉ là chuẩn bị dữ liệu tiếp theo cho master, và công việc này tốt nhất nên
Trang 8được tiến hành trong chương trình ngắt (ngay sau khi master kết thúc thao tác đọc dữ
liệu). Công việc chuẩn bị dữ liệu mới này sẽ được hỗ trợ bởi các bit OBF và PSPIF.
Dựa trên những phân tích như trên, ta dã có thể viết được chương trình cho cả hai vi điều khiển. Các chương trình cụ thể như sau :
Trang 10CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF
BCF PIR1,PSPIF ; nê’u co’, xo’a co*` nga*’t và ba*’t ‐dầu ; xu* ? li’ nga*’t
BSF STATUS,RP0 ; thanh ghi TRISE na*`m o*? BANK 1
; ‐duo*.c –dọc chu*a ??
Trang 11MOVLW bʹ00010111ʹ ; RE2:RE0 la` ca’c ngo~ va`o MOVWF TRISE ; cho phe’p PSPMODE MOVLW 0x06 ; Ta^’t ca ? ca’c cha^n la` Digital I/O
Trang 138 9 10
11
12 13
14
15 16 17
19 20 22
23 24 25 26
27 28 29 30
31 32
33 35 36 37 38 39 40
MCLR/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+
RA4/TOCKI/C1OUT RA5/AN4/SS/C2OUT RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
VDD
VSS OSC1/CLKI
OSC2/CLKO
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RC4/SDI/SDA
RC5/SD0 RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
VSS VDD
RB0/INT RB1 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
D7
RD1 RE0
31 32
33 35 36 37 38 39 40
MCLR/VPP RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+
RA4/TOCKI/C1OUT RA5/AN4/SS/C2OUT RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
VDD
VSS OSC1/CLKI
OSC2/CLKO
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RC4/SDI/SDA
RC5/SD0 RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
VSS VDD
RB0/INT RB1 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
RD6
D2 D3
30 pF
R4
R8 0
Hoạt động của PSP slave lần lượt được tiến hành như sau. Khi nhận được tín hiệu yêu
cầu ghi dữ liệu của master (WR* và CS* ở mức logic 0), dữ liệu lập tức được đưa vào buffer đệm. Khi nhận được tín hiêu kết thúc thao tác ghi dữ liệu (một trong hai chân WR* hoặc CS* trở về mức logic cao), bit IBF và PSPIF được set, ngắt ngoại vi (nếu được cho
phép trước đó) sẽ được kích hoạt. Nhiệm vụ của phần cứng PSP đến đây là kết thúc. Công
việc còn lại của chương trình điều khiển là đọc dữ liệu từ bộ đệm vào và xử lí dữ liệu đó.
Trong trường hợp của ứng dụng này, ta sẽ đọc dữ liệu đó vào và xuất ra port B của slave
để kiểm tra xem dữ liệu nhận được hay chưa, và nhận được đúng hay sai. Thao tác này tốt nhất cũng nên được tiến hành trong chương trình ngắt (ngay khi dữ liệu vừa được nhận vào), như vậy sẽ tránh được trường hợp tràn bộ đệm. Hiện tượng này xảy ra khi dữ liệu cũ
Trang 14chưa được đọc vào mà dữ liệu mới đã chuẩn bị ghi lên. Bit chỉ thị trạng thái này là IBOV (thanh ghi TRISE).
Trang 15Trang 18
‐ Nếu nút “READBUT” được ấn, master sẽ đọc dữ liệu từ PSP slave, sau đó xuất dữ liệu nhận được ra các LED ở PORT B. Sau mỗi lần đọc, giá trị đọc từ PSP slave sẽ tăng lên một đơn vị.
Trang 1930 pF
0
RD2 RD6
30 pF
10 K READBUT
0
RD1 RD5
RE2 RE0
31 32
33 34 35 36 37 38 39 40 MCLR/VPP
RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+
RA4/TOCKI/C1OUT RA5/AN4/SS/C2OUT RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
VDD
VSS OSC1/CLKI
OSC2/CLKO
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3
RC4/SDI/SDA RC5/SD0 RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
VSS VDD
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
11
12 13
14
15 16 17 18
19 20 21 22
23 24 25 26
27 28 29 30
31 32
33 34 35 36 37 38 39 40 MCLR/VPP
RA0/AN0 RA1/AN1 RA2/AN2/VREF-/CVREF RA3/AN3/VREF+
RA4/TOCKI/C1OUT RA5/AN4/SS/C2OUT RE0/RD/AN5 RE1/WR/AN6 RE2/CS/AN7
VDD
VSS OSC1/CLKI
OSC2/CLKO
RC0/T1OSO/T1CKI RC1/T1OSI/CCP2 RC2/CCP1 RC3/SCK/SCL
RD0/PSP0 RD1/PSP1 RD2/PSP2 RD3/PSP3
RC4/SDI/SDA RC5/SD0 RC6/TX/CK RC7/RX/DT
RD4/PSP4 RD5/PSP5 RD6/PSP6 RD7/PSP7
VSS VDD
RB0/INT RB1 RB2 RB3/PGM RB4 RB5 RB6/PGC RB7/PGD
Giải thuật của các chương trình trong ứng dụng này sẽ được trình bày dưới các luu đồ sau:
Trang 20GOI CHUONG TRINH
CON readPSP
XUAT DU LIEU DOC DUOC
RA PORT B
WRITEBUT DUOC AN??
TANG GIA TRI THANH GHI DATAOUT
GOI CHUONG TRINH
CON writePSP
Trang 21Trong đó chương trình con “writePSP” dùng để xuât giá trị chứa trong thanh ghi
“DATAOUT” ra PSP slave. Chương trình con “readPSP” dùng để đọc dữ liệu từ PSP vào
và lưu dữ liệu đọc được vào trong thanh ghi ”DATAIN”.
Đối với chương trình cho slave, chương trình chính chỉ thực hiện các thao tác khởi tạo, phần việc còn lại được thực hiện trong chương trình ngắt. Lưu đồ giải thuật chương trình ngắt như sau:
START INTERRUPT
PSPIF = 1??
IBF = 1 ??
DOC DU LIEU VAO THANH GHI DATAIN
XUAT RA PORT B
OBF = 0 ??
TANG GIA TRI THANH GHI DATAOUT
DUA VAO BUFFER DEM
N
N
Trang 22
;‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐
Trang 24GOTO loop
wait2 ; do*.i cho –de^’n khi nu’t a^’n CALL delay_50ms ; ‐duo*.c tha? ra
Trang 25Trang 29
PSP cho phép truyền nhận dữ liệu 8 bit cho phép một tốc độ truyền dữ liệu cao, bên cạnh đó phương thức giao tiếp cũng rất đơn giản và dễ sử dụng.
Tuy nhiên, có thể nhận thấy một số điểm hạn chế của PSP như sau:
‐ Số lượng chân điều khiển nhiều: để thực hiện giao tiếp bằng PSP, ta cần đến 8 chân
dữ liệu và 3 chân điều khiển. Điều này gây ra nhiều hạn chế khi số lượng chân điều khiển của một thiết bị ngoại vi là có giới hạn, đồng thời gây tốn kém khi cần nối dài đường truyền dữ liệu.
‐ Độ tin cậy của thông tin không cao: việc truyền nhận dữ liệu được diễn ra mà
không có được sự kiểm soát của các thiết bị truyền nhận. master hay slave không thể biết được rằng dữ liệu có được truyền đến đầu bên kia hay không, và không có sự phản hồi về thông tin của thiết bị truyền nhận. Điều này cũng gây nhiều khó khăn trong quá trình truyền nhận dữ liệu, đặc biệt là khi khoảng cách đường truyền được nối dài.