Bài giảng Vi xử lý (Phần 2)

pdf 99 trang phuongnguyen 2910
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Vi xử lý (Phần 2)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_vi_xu_ly_phan_2.pdf

Nội dung text: Bài giảng Vi xử lý (Phần 2)

  1. 100 Bài giảng số 5: Truyền dữ liệu đồng bộ và khơng đồng bộ (USART)( Số tiết: 3) III.1. Mục tiêu: - Truyền nhận dữ liệu đồng bộ, khơng đồng bộ: Giới thiệu USART, Thanh ghi TXSTA, RCSTA, bộ tạo tốc độ baud USART, chế độ bất đồng bộ, chế độ chủ đồng bộ, chế độ tớ đồng bộ. - Bộ thu và phát radio. -truyền thong nối tiếp PIC tới PIC, mạch giao tiếp RS232C PIC tới PC. III.2. Đồ dung và phương tiện dạy học: -Phấn trắng, bảng, khăn, bút long, micro cĩ dây(hay khơng dây), máy tính, và đèn chiếu (hay máy chiếu). III.3. Giáo trình và tài liệu tham khảo: Giáo trình Vi xử lí của trường Đại học cơng nghiệp Tp. HCM. D.W. Smith, PIC in practice: a project-based approach, Elsevier, 2nd edition, 2006. Trương Trác, Chip đơn 16C84 và ứng dụng của chúng. Hồ Trung Mỹ, Vi xử lí, NXB ĐHQG Tp. HCM, 2003. Tài liệu về vi điều khiển PIC của bọ mơn Điện tử cơng nghiệp. Datasheet c ủa PIC 16F84 v à 16F877A. Website: Myke Predko, Programming and customizing the PIC microcontroller, 3rd edition, Tab Electronics, McGrawHill, 2008(Ebook). Douglass V.Hall, Microprocessors and interfacing: Programming and Hardware, 2nd ed., Macmillan/McGraw-Hill, 1992. III.4.Nội dung bài giảng: Nội dung chi tiết : xem bài giảng chi tiết. Phương pháp giảng dạy: thuyết trình, nêu vấn đề và đàm thoại trao đổi với sinh viên. Chương 5: Truyền dữ liệu đồng bộ và khơng đồng bộ 1. Giới thiệu USART: USART viết tắt cho Universal Aynchronous Asynchronous Receiver Transmitter (Bộ thu phát bất đồng bộ đồng bộ đa năng) và cho phép vi điều khiển PIC giao tiếp với một tầm rộng các thiết bị khác từ chip nhớ riêng biệt và LCD hiển thị tinh thể lỏng, tới máy tính! Điều này bao gồm gửi hay nhận gĩi dữ liệu 8 bit hay 9 bit (nghĩa là 1 byte hay 1 byte cộng them bit chẵn lẻ). Bit chẵn lẻ là bit phụ gửi kèm với dữ liệu mà giúp kiểm tra lỗi. Nếu cĩ 1 số lẻ số 1 trong byte dữ liệu (thí dụ b’00110100’), bit parity sẽ là 1 và nếu cĩ một số chẵn số 1 (thí dụ b’00110011’) thì bit parity sẽ là 0. Trong bài giảng này, nếu cĩ lỗi (ví dụ lật bit) diễn ra đâu đĩ trong giữa lúc gửi 1 byte và nhận nĩ bit parity sẽ khơng cịn khớp loại dữ liệu. Bên nhận sẽ biết rằng cĩ gì đĩ sai sĩt và nĩ yêu cầu gửi lại byte. Nếu cĩ 2 bit lỗi xảy ra trong một việc truyền, bit parity sẽ
  2. 101 xuất hiện đúng, tuy nhiên cĩ thể hai lỗi diễn ra là nhỏ hơn, và vì vậy điều này thường bị bỏ qua. Chế độ USART cĩ 2 chế độ (mode) chính: hoạt động đồng bộ và bất đồng bộ. Trong hoạt động bất đồng bộ, chân phát (TX-transmitter) từ 1 thiết bị được nối với chân thu (RX-Receiver) của thiết bị kia và dữ liệu được hốn đổi (được gọi là song cơng-full duplex). Trong chế độ đồng bộ, xung clock (CK) và đường dữ liệu (DT) là chia xẻ giữa một số thiết bị (một là chủ (master) và một hay nhiều tớ (Slaves)). Chủ chịu trác nhiệm tạo ra xung clock. Trong cả hai trường hợp, tốc độ tại đĩ dữ liệu được gửi bởi bộ phát (và tại đĩ nĩ được mong đợi bởi bộ thu) được biết đến như là tốc độ baud. Cĩ hai thanh ghi để kiểm sốt việc nhận và phát dữ liệu: RCSTA và TXSTA. Dữ liệu mà được đọc thành cơng được lưu vào thanh ghi RCREG, và dữ liệu mà được gửi đi nên được đặt trong thanh ghi TXREG. Tốc độ baud được đặt sử dụng thanh ghi SPBRG (cĩ bảng them vào trong datasheet minh họa làm thế nào chọn tốc độ baud cho trước tần số dao động). Trong chế độ bất đồng bộ, USART lấy kí tự 8 bit hay 9 bit để gửi, và them 1 bit bắt đầu (start bit) (1 zero,0) ở đầu, và bit dừng (1 bit) vào cuối để tạo nên chuỗi 10 hay 11 bit. Điều này được chuyển vào thanh ghi dịch mà quay bit vào chân phát (TX) như hình 5.1 Mơđun nhận sẽ lien tục kiểm tra trạng thái của chân thu RX, mà sẽ bình thường là mức cao. Nếu nĩ dị thấy chân RX xuống mức thấp (bit start), nĩ sẽ làm them 3 mẫu trong giữa bit (cho phép lên và xuống chậm các lần) và lấy giá trị chính của ba . Nếu giá trị chính là 0, nĩ khẳng định đây thực sự là bit bắt đầu và tiến hành lấy mẫu các bit tuần tự với 3 mẫu ở giữa mỗi bit. Thời gian của mẫu này được chỉ ra bởi tốc độ baud. Khi nĩ đạt đến cái là bit dừng, nĩ phải đọc một (1), ngược lại nĩ sẽ khẳng định kí tự thu được đĩng khung tồi và đăng kí một lỗi. Nhớ rằng với thiết lập phù hợp trong TXSTA và RCSTA, tất cả điều này được thực hiện cho bạn bởi mơđun USART. Byte để gửi b’00101101’ Thanh ghi dịch 1 0 0 1 0 1 1 0 1 0 TX pin Điện áp trên TX time 1 0 1 1 0 1 0 0 Start bit Stop bit
  3. 102 Hình 5.1. Bạn cĩ thể dung chế độ bất đồng bộ để giao tiếp với port nối tiếp RS232 trên máy tính PC. Cách đơn giản để gửi byte thong qua port nối tiếp của PC là thong qua một chương trình đi kèm Microsoft Windows được gọi là Hyper Terminal (Start MenuỈProgramsỈAccessoriesỈCommunications). Bạn cĩ thể tạo ra một kết nối với cổng nối tiếp (ví dụ COM 1), chọn tốc độ baud, số bit, thiết lập parity Khi Hyper Terminal kết nối với port nối tiếp, bất kì kí tự mà bạn gõ sẽ được gửi (như là mã ASCII) thong qua port nối tiếp. Kí tự mà được nhận được hiển thị lên màn hình. Cả hai chế độ đồng bộ và bất đồng bộ hỗ trợ đặc tính được biết như là dị tìm địa chỉ mà cho phép một số thiết bị được kết nối. Khi gửi dữ liệu, một byte địa chỉ phải được gửi đi đầu tiên để nhận diện nơi nhận dự định. 2.Thanh ghi TXSTA: thanh ghi điều khiển và trạng thái phát, địa chỉ 98H. R/W-0 R/W-0 R/W-0 R/W-0 U-0 R/W-0 R-1 R/W-0 CSRC TX9 TXEN SYNC - BRGH TRMT TX9D Bit 7 bit 0 Bit 7 CSRC: bit chọn nguồn xung clock. chế độ bất đồng bộ: khơng quan tâm. chế độ đồng bộ: 1= chế độ chủ (xung clock được tạo ra bên trong từ BRG). 0=chế độ tớ (xung clock từ nguồn bên ngồi). Bit 6 TX9: bit cho phép truyền 9 bit. 1=chọn sự truyền 9 bit. 0= chọn sự truyền 8 bit. Bit 5 TXEN: bit cho phép truyền (phát). 1= cho phép truyền (phát). 0= cấm phát. Chú ý: SREN/CREN đè lên TXEN trong chế độ đồng bộ. Bit 4 SYNC : bit chọn chế độ USART. 1= chế độ đồng bộ. 0= chế độ bất đồng bộ. Bit 3 : khơng dung, đọc là 0. Bit 2 BRGH: bit chọn tốc độ baud cao. chế độ bất đồng bộ: 1=tốc độ cao. 0=tốc độ thấp. chế độ đồng bộ: khơng được dung trong chế độ này. Bit 1 TRMT: bit trạng thái thanh ghi dịch phát. 1=TSR (thanh ghi dịch phát) trống. 0=TSR đầy. Bit 0 TX9D: bit thứ 9 của dữ liệu phát, cĩ thể là bit chẵn lẻ (parity bit). Chú thích: R=bit cĩ thể đọc W=bit cĩ thể ghi U=bit khơng dung , đọc là 0. -n=giá trị tại POR ‘1’ =bit được bật ‘0’=bit bị xĩa x= bit chưa biết.
  4. 103 3.Thanh ghi RCSTA: thanh ghi điều khiển và trạng thái nhận , địa chỉ 18H. R/W-0 R/W-0 R/W-0 R/W-0 R/W-0 R-0 R-0 R-x SPEN RX9 SREN CREN ADDEN FERR OERR RX9D Bit 7 bit 0 Bit 7 SPEN: bit cho phép port nối tiếp. 1= cho [phép port nối tiếp (cấu hình RC7/RX/DT và RC6/TX/CK như là các chân cổng nối tiếp). 0=port nối tiếp bị cấm. Bit 6 RX9: bit cho phép nhận 9 bit. 1=chọn sự nhận 9 bit. 0= chọn sự nhận 8 bit. Bit 5 SREN: bit cho phép nhận đơn. chế độ bất đồng bộ: khơng quan tâm. chế độ đồng bộ-chủ: 1=cho phép nhận đơn lẻ. 0= cấm nhận đơn lẻ. bit này bị xĩa sau khi việc nhận hồn thành. chế độ đồng bộ-tớ: khơng quan tâm Bit 4 CREN: bit cho phép nhận lien tục. chế độ bất đồng bộ: 1= cho phép nhận lien tục. 0= cấm nhận lien tục. chế độ đồng bộ: 1=cho phép nhận lien tục cho tới khi bit CREN bị xĩa (CREN đè SREN). 0= cấm nhận liên tục. Bit 3 ADDEN: bit cho phép dị địa chỉ. chế độ bất đồng bộ 9 bit (RX9=1): 1=cho phép dị tìm địa chỉ, cho phép ngắt và nạp bộ đệm nhận khi RSR được bật (=1). 0= xĩa dị tìm địa chỉ, tất cả các byte được nhận và bit thứ 9 cĩ thể đượ dung như bit parity (chẵn lẻ). Bit 2 FERR: bit lỗi khung . 1= lỗi khung (cĩ thể được cập nhật bằng cách đọc thanh ghi RCREG và nhận byte hợp lệ kế tiếp). 0= khơng cĩ lỗi khung Bit 1 OERR: bit lỗi overrun (chạy quá). 1= lỗi overrun (cĩ thể được xĩa bằng cách xĩa bit CREN). 0=khơng cĩ lỗi overrun. Bit 0 RX9D: bit thứ 9 của nhận dữ liệu (cĩ thể là bit parity nhưng phải được tính bởi phần dẻo(firmware) của người sử dụng). 4.Bộ tạo tốc độ baud USART: Bộ tạo tốc độ baud hỗ trợ cả chế độ bất đồng bộ và đồng bộ của USART. Nĩ là bộ tạo tốc độ baud 8 bit. Thanh ghi SPBRG (địa chỉ 99H) điều khiển chu kì của bộ định thì 8
  5. 104 bit chạy tự do. Trong chế độ bất đồng bộ bit BRGH (TXSTA ) cũng kiểm sốt tốc độ baud. Trong chế độ đồng bộ, bit BRGH bị bỏ qua. Cơng thức tốc độ baud: SYNC BRGH=0 (low speed) BRGH=1(high speed) 0 tốc độ baud (bất đồng Tốc độ bộ)=Fosc/(64(X+1)) baud=Fosc/(16(X+1)) 1 tốc độ baud(đồng N/A bộ)=Fosc/(4(X+1)) X: giá trị trong SPBRG (0 đến 255). 5.Chế độ bất đồng bộ USART: a.Bộ phát bất đồng bộ USART: Sơ đồ khối bộ phát bất đồng bộ được minh họa ở hình: Hình 5.2: Sơ đồ khối phát bất đồng bộ USART. Trong mode này, USART sử dung dạng NRZ (Non-Return –to-Zero)chuẩn (một bit bắt đầu(start), 8 hay 9 bit dữ liệu, và một bit dừng(stop)). Dạng dữ liệu thong dụng nhất là 8 bit. Một bộ tạo tốc độ baud 8 bit cĩ sẵn trên chip cĩ thể được dung để tạo tần số tốc độ baud chuẩn từ tần số thạch anh của hệ thống. USART phát và nhận bit LSB trước tiên. Bộ phát và thu là độc lập chức năng nhưng sử dụng chung dạng dữ liệu và tốc độ baud. Bộ tạo tốc độ baud tạo ra xung clock , hoặc là x16 hay x64 của tốc độ dịch bit phụ thuộc vào bit BRGH (TXSTA ). Chẵn lẻ (parity) khơng được hỗ trợ bởi phần cứng nhưng cĩ thể hiện thực bằng phần mềm (và được lưu như là bit dữ liệu thứ 9). Mode bất đồng bộ bị dừng trong khi Sleep. Mode bất đồng bộ được chọn bằng cách xĩa bit SYNC (TXSTA ). Mơđun bất đồng bộ USART gồm cĩ các phần tử quan trọng sau đây: .Bộ tạo tốc độ baud. .Mạch lấy mẫu. .Bộ phát bất đồng bộ . . Bộ thu bất đồng bộ. Khi thiết lập sự phát bất đồng bộ, bạn theo các bước sau: . Khởi động thanh ghi SPBRG cho tốc độ baud phù hợp. Nếu tốc độ baud tốc độ cao là mong muốn thì ta bật (lên 1) bit BRGH. . Cho phép port nối tiếp bất đồng bộ bằng cách xĩa bit SYNC và bật bit SPEN. . Nếu ngắt là mong muốn, thì ta bật bit cho phép TXIE. . Nếu sự truyền 9 bit là mong muốn , thì ta bật bit truyền TX9. . Cho phép truyền bằng cách bật bit TXEN mà sẽ bật bit TXIF. . Nếu sự truyền 9 bit được chọn, bit thứ 9 sẽ được nạp bào bit TX9D. . Nạp dữ liệu vào thanh ghi TXREG (bắt đầu truyền).
  6. 105 .Nếu dùng ngắt, đảm bảo rằng GIE và PEIE (bit 7 và 6) của thanh ghi INTCON được bật. Các thanh ghi được dung trong phát bất đồng bộ USART: Hình: Thanh ghi 16F87x được dung trong phát bất đồng bộ. b. Bộ thu bất đồng bộ USART: Sơ đồ khối bộ thu được minh họa ở hình: Hình 5.3: Sơ đồ khối thu USART. Dữ liệu được nhận trên chân RC7/RX/DT và lái khối phục hồi dữ liệu. Khối khơi phục dữ liệu thực chất là bộ dịch tốc độ cao, hoạt động ở 16x tốc độ baud, trong khi bộ dịch nối tiếp thu chính hoạt động ở tốc độ bit hay Fosc. Khi thiết lập sự thu bất đồng bộ , bạn theo các bước sau: . Khởi động thanh ghi SPBRG cho tốc độ baud phù hợp. Nếu tốc độ baud tốc độ cao được chọn, thì ta bật bit BRGH . Cho phép port nối tiếp bất đồng bộ bằng cách xĩa bit SYNC và bật bit SPEN. .Nếu ngắt là mong muốn, thì ta bật bit cho phép RCIE. . Nếu sự nhận 9 bit là mong muốn, thì ta bật bit RX9.
  7. 106 . Cho phép nhận bằng cách bật bit CREN. .Bit cờ RCIF được bật (=1) khi sự nhận hồn thành và ngắt sẽ tạo ra nếu bit cho phép RCIE được bật. . Đọc thanh ghi RCSTA để nhận bit thứ 9 (nếu cho phép) và xác định xem cĩ lỗi nào xảy ra trong quá trình nhận (thu). . Đọc dữ liệu nhận 8 bit bằng cách đọc thanh ghi CRREG. .Nếu cĩ lỗi xảy ra, xố lỗi bằng cách xĩa bit cho phép CREN. . Nếu dung ngắt, đảm bảo rằng GIE và PEIE (bit 7 và 6) của thanh ghi INTCON được bật. c. Thiết lập mode 9 bit với dị tìm địa chỉ. Khi thiết lập một sự thu bất đồng bộ với dị tìm địa chỉ cho phép: . . Khởi động thanh ghi SPBRG cho tốc độ baud phù hợp. Nếu tốc độ baud tốc độ cao được chọn, thì ta bật bit BRGH . Cho phép port nối tiếp bất đồng bộ bằng cách xĩa bit SYNC và bật bit SPEN. .Nếu ngắt là mong muốn, thì ta bật bit cho phép RCIE. . Bật bit RX9 để cho phép sự nhận 9 bit . .Bật ADDEN để cho phép dị tìm địa chỉ. . Cho phép nhận bằng cách bật bit CREN. .Bit cờ RCIF được bật (=1) khi sự nhận hồn thành và ngắt sẽ tạo ra nếu bit cho phép RCIE được bật. . Đọc thanh ghi RCSTA để nhận bit thứ 9 (nếu cho phép) và xác định xem cĩ lỗi nào xảy ra trong quá trình nhận (thu). . Đọc dữ liệu nhận 8 bit bằng cách đọc thanh ghi CRREG để xác định xem nếu thiết bị đang được định địa chỉ. .Nếu cĩ lỗi xảy ra, xố lỗi bằng cách xĩa bit cho phép CREN. . Nếu thiết bị được định địa chì, xĩa bit ADDEN để cho phép byte dữ liệu và byte địa chỉ được đọcvào bộ đệm thu và ngắt CPU. Các thanh ghi được dung trong thu bất đồng bộ USART: Hình: Thanh ghi được dung trong thu bất đồng bộ. 6. Chế độ chủ đồng bộ. Trong mode chủ đồng bộ, dữ liệu được truyền theo cách bán song cơng (half- duplex)(nghĩa là phát và thu khơng diễn ra cùng một thời điểm).Khi phát dữ liệu, sự nhận (thu) bị cấm và ngược lại. Mode đồng bộ đưa vào bằng cách bật bit, SYNC(TXSTA ). Hơn nữa, bit cho phép SPEN (RCSTA ) được bật (=1) để cấu
  8. 107 hình chân RC6/TX/CK và RC7/RX/DT tới đường CK (clock) và DT (dữ liệu-data) tương ứng. Mode chủ chỉ ra rằng bộ xử lí phát clock chủ trên đường CK. Mode chủ được đưa vào bằng cách bật bit CSRC (TXSTA ). a.Phát chủ đồng bộ USART Sơ đồ khối bộ phát USART được minh họa ở hình: Hình 5.4: Sơ đồ khối thu USART. b.Thu chủ đồng bộ USART 7. Chế độ tớ đồng bộ USART a.Phát tớ đồng bộ USART b.Thu tớ đồng bộ USART. 8. Bộ thu phát radio: Hệ thống truyền dữ liệu radio: +5V B0 10K 470 A0 B0 TX RX A0 16F877A 16F877A
  9. 108 Hình 5.4: Hệ thống truyền dữ liệu radio. Phần này mơ tả chi tiết việ sử dụng mođun thu và phát radio 418 Mhz (RT1-418 và RR3-418). Chúng khơng cần bản quyền để hoạt động và cĩ nhiều thay đổi cho phép. Bộ phát chỉ cĩ 3 kết nối, 2 nguồn cung cấp và 1 ngõ vào dữ liệu, anten phát được tích hợp vào đơn vị. Bộ thu cĩ 4 kết nối, 2 nguồn cung cấp, 1 anten vào và 1 ngõ ra. Anten thu chỉ cần là mẫu dây dài 25 cm. Sơ đồ mạch cơ bản của hệ thống radio được minh họa ở hình 5.4. Vi điều khiển tạo ra dữ liệu và sau đĩ chuyển xung dữ liệu tới bộ phát. Bộ thu nhận xung dữ liệu và vi điều khiển giải mã thong tin và xử lí nĩ. Hệ thống radio-vi điều khiển cĩ thể đo nhiệt độ bên ngồi và gửi nhiệt độ này để hiển thị trên đơn vị bên trong. Phần sau được trích dẫn từ sách Microcontroller programming the microchip PIC của tác giả Julio Sanchez, Maria P. Canton. Mạch truyền thong nối tiếp PIC tới PIC: Thực tế, hệ thống được yêu cầu cho một PIC đọc dữ liệu và gửi nối tiếp kết quả tới một PIC khác mà xuất dữ liệu cĩ thể xem như hai mạch độc lập. Một mạch được dung để đọc trạng thái 8 cơng tắc DIP và gửi dữ liệu nối tiếp tới một mạch PIC khác mà hiển thị kết quả. Hình sau minh họa 2 mạch dựa trên PIC.
  10. 109 Hình 5.5: Mạch truyền thong nối tiếp PIC tới PIC. Thanh ghi dịch : 74HC165 là thanh ghi dịch song song ra nối tiếp và 74HC164 là thanh ghi dịch nối tiếp ra song song. IC thu phát RS-232C: dung IC Max 232 và phiên bản nâng cấp Max202. IC Max 233 và Max 203 khơng yêu cầu tụ ngồi. Mạch giao tiếp RS-232C PIC tới PC: Để minh họa truyền nối tiếp với giao thức RS232C, chúng ta phát triển mạch gồm bàn phím 4x4 và LCD hiển thị 20 ký tự trên 2 dịng. Ký tự được ấn trên bàn phím và được chuyển thành mã ASCII cho tập hợp số hexa, nghĩa là các số 0-9 và chữ A đến F. Khi một phím được nhấn, mã ASCII tương ứng được hiển thị trên LCD và truyền thong qua port nối tiếp tới ứng dụng PC. Ký tự được nhận thong qua đường truyền nối tiếp là được hiển thị trên LCD. Hình 5.6: Mạch truyền thong USART với PIC 16F877. Chương trình khởi tạo PIC 16F877:
  11. 110 Đoạn chương trình sau minh họa sự khởi tạo mơđun UART trong PIC 16F877 cho tốc độ truyền 2400 baud, 8 bit dữ liệu, khơng cĩ bit chẵn lẻ và 1 bit dừng. Khơng cĩ ngắt được dung trong thí dụ này. Tốc độ baud được tính như sau: ABR=Fosc/(S*(x+1)) Trong đĩ x là giá trị trong thanh ghi SPBRG, S là 64 nếu bit BRGH trong thanh ghi điều khiển TXSTA bị xĩa, và S=16 nếu bit BRGH=1. Để thiết lập tốc độ 9600 baud sử dụng thạch anh 4 Mhz ở tốc độ baud tốc độ cao (BRGH=1), cơng thức là: 4000000 4000000 = = 9615 baud (sai số 0,16 %). 16(25+ 1) 416 Ở tốc độ thấp (BRGH=0): 4000000 4000000 = = 2403,85 (sai số 0,16%). 64(25+ 1) 1664 ;Thủ tục khởi động USART Initserial BCF STATUS, RP1 BSF STATUS, RP0 ; chọn bank 1 Movlw b’11000000’; bit cho Tx và RX Iorwf TRISC,f; OR vào thanh ghi TRISC Movlw spbrgVal; giá trị trong spbrgVal=25 Movwf SPBRG ; đặt vào bộ tạo tốc độ baud Movlw 0x20; giá trị thiết lập b’00100000’ cho TXSTA Movwf TXSTA;cho phép truyền và tốc độ baud cao BCF STATUS, RP0; bank 0 Movlw 0x90; giá trị thiết lập b’10010000’ cho RXSTA Movwf RCSTA; cho phép port nối tiếp và nhận lien tục. Clrf errorflags; xĩa thanh ghi cờ lỗi cục bộ Return ;Thủ tục phát và nhận USART Chương trình phát khá đơn giản. Chương trình kiểm tra bit TXIF trong thanh ghi PIR1. Nếu bit này là 1, dữ liệu được phát bằng cách lưu byte dữ liệu trong thanh ghi TXREG. Thủ tục sau thực hiện tác vụ được yêu cầu. ;Phát dữ liệu ;Kiểm tra thanh ghi phát trống và phát dữ liệu trong W. SerialSend BCF STATUS, RP1 BCF STATUS,RP0; bank 0 Wait BTFSS PIR1,TXIF; kiểm tra xem bộ phát cĩ bận khơng Goto Wait ; đợi cho tới khi bộ phát khơng bận Movwf TXREG; và phát dữ liệu Return Thu dữ liệu thì phức tạp hơn phát dữ liệu. Một lí do là mã phải được kiểm tra và quản lí nhiều lỗi mà cĩ thể xảy ra trong quá trình nhận (thu). Đoạn chương trình sau minh họa biến cục bộ và xử lí được yêu cầu cho nhận dữ liệu đơn giản. ;biến cục bộ trong bộ nhớ RAM (dữ liệu) của PIC cblock 0x20; bắt đầu khối ;biến truyền thong
  12. 111 newData ; khơng là 0 nếu dữ liệu mới được nhận ascVal errorFlags endc ;thủ tục nhận dữ liệu USART ;thủ tục kiểm tra đường truyền cho nhận dữ liệu và trả giá trị trong W. Lỗi khung và ;Overrun được dị tìm và nhớ trong biến errorFlags. SerialRcv CLRF newData;xĩa thanh ghi nhận dữ liệu mới BCF STATUS,RP1 BCF STATUS,RP0; bank 0 BTFSS PIR1,RCIF;kiểm tra cho dữ liệu nhận. Bit RCIF=0 nếu bộ đệm thu ; trống. Nếu vậy, dữ liệu khơng được nhận Return; và thốt nếu khơng cĩ dữ liệu ;tại thời điểm này, dữ liệu đã được nhận, đầu tiên phải loại bỏ lỗi: lỗi khung và Overun. BTFSC RCSTA,OERR;kiểm tra lỗi Overrun Goro OverErr; bộ kiểm sốt lỗi BTFSC RCSTA,FERR; kiểm tra lỗi khung Goto FrameErr; bộ kiểm sốt lỗi ;tại thời điểm này khơng cịn lỗi, nhận dữ liệu trong thanh ghi RCREG movf RCREG,W; nhận dữ liệu BSF newData,7; bật bit 7 để chỉ ra dữ liệu mới Clrf erroeFlags; xĩa cờ lỗi Return ;bộ kiểm sốt lỗi ;lỗi Overrun được tìm thấy OverErr BSF errorFlags,0; bit 0 là lỗi Overrun errExit BCF RCSTA,CREN; xĩa bit nhận lien tục BSF RCSTA,CREN;bật bit (1) tới sự nhận cho phép lại Return ;Lỗi khung. Bit lỗi khung FERR được bật FrameErr BSF errorFlags,1; bit 1 là lỗi khung Movf RCREG,W; đọc và bỏ dữ liệu xấu Goto errExit IV.Tổng kết bài: -Tĩm tắt các ý chính trong bài. -Chuẩn bị bài mới. V. Câu hỏi và bài tập về nhà: Chương 5: Truyền nối tiếp bất đồng bộ và đồng bộ 1.USART là gì? 2.Giao tiếp RS-232. 3. Thanh ghi điều khiển nhận và phát dữ liệu: RCSTA và TXSTA. 4. Thanh ghi RCREG (lưu dữ liệu được đọc vào) và TXREG (lưu dữ liệu được phát đi), và SPBRG (thiết lập tốc độ baud). 5. Thu và phát radio dung PIC 16F84 hay 16F877A.
  13. 113 Bài giảng số 6: Ngắt ( Số tiết: 3) III.1. Mục tiêu: - Nguồn ngắt. - Thanh ghi điều khiển ngắt. - Chương trình sử dụng ngắt. III.2. Đồ dung và phương tiện dạy học: -Phấn trắng, bảng, khăn, bút long, micro cĩ dây(hay khơng dây), máy tính, và đèn chiếu (hay máy chiếu). III.3. Giáo trình và tài liệu tham khảo: Giáo trình Vi xử lí của trường Đại học cơng nghiệp Tp. HCM. D.W. Smith, PIC in practice: a project-based approach, Elsevier, 2nd edition, 2006. Trương Trác, Chip đơn 16C84 và ứng dụng của chúng. Hồ Trung Mỹ, Vi xử lí, NXB ĐHQG Tp. HCM, 2003. Tài liệu về vi điều khiển PIC của bọ mơn Điện tử cơng nghiệp. Datasheet c ủa PIC 16F84 v à 16F877A. Website: Myke Predko, Programming and customizing the PIC microcontroller, 3rd edition, Tab Electronics, McGrawHill, 2008(Ebook). Douglass V.Hall, Microprocessors and interfacing: Programming and Hardware, 2nd ed., Macmillan/McGraw-Hill, 1992. III.4.Nội dung bài giảng: Nội dung chi tiết : xem bài giảng chi tiết. Phương pháp giảng dạy: thuyết trình, nêu vấn đề và đàm thoại trao đổi với sinh viên. Chương 6: Ngắt Chúng ta đều biết ngắt là gì và chúng ta khơng thích bị ngắt. Chúng ta bận rộn làm điều gì đĩ và điện thoại reng hay ai đĩ bước vào cửa. Nếu chúng t among đợi ai, chúng ta cĩ thể nhìn ra ngồi cửa sổ để xem cĩ ai tới hay khơng hay là chúng ta tiến hành với những gì chúng ta đang làm cho tới khi chuơng cửa reo lên. Cĩ 2 cách nhận ngắt. Thứ nhất khi chúng ta tiếp tục kiểm tra bằng phần mềm gọi là hỏi vịng (polling), thứ hai khi chuơng reo là tương đương ngắt phần cứng. Khi xảy ra ngắt chúng ta cần nhớ nội dung của file là gì, nghĩa là thanh ghi trạng thái STATUS, thanh tích lũy W, TMR0 và thiết lập PORT để mà khi trở về từ ngắt, các thiết lập được lưu trở lại (restored). Nếu chúng ta khơng nhớ các thiết lập, chúng ta khơng thể tiếp tục ở đâu chúng ta rời bỏ, bởi vì ngắt sẽ tắt tất cả ngõ ra và thanh ghi W bị ảnh hưởng tại lần gần nhất. 6.1. Nguồn ngắt
  14. 114 16F84 cĩ 4 nguồn ngắt: . Thay đổi cạnh lên hay cạnh xuống của PORTB,0. .TMR0 tràn từ FFh về 00h. . PORTB bit 4-7 thay đổi. .Ghi dữ liệu EEPROM hồn thành. 16F877A cĩ 15 nguồn ngắt. Ngồi 4 nguồn ngắt nêu trên, các ngắt them vào là: . Chuyển đổi A/D hồn thành. . Ngắt port nối tiếp đồng bộ. . TMR1 tràn. .TMR2 tràn. .Ngắt điều chế độ rộng xung, bắt giữ và so sánh. Những ngắt này cĩ thể được cho phép (enable) hay cấm theo yêu cầu bởi bit cho phép/cấm ngắt. Các bit này cĩ thể được tìm thấy trong thanh ghi điều khiển ngắt INTCON cho 16F84/16F877A. 6.2. Thanh ghi điều khiển ngắt INTCON: Thanh ghi điều khiển ngắt INTCON, file 0Bh được minh họa ở hình 6.1. Bit 7 6 5 4 3 2 1 bit 0 GIE EEIE T0IE INTE RBIE T0IF INTF RBIF Hình 6.1: Thanh ghi điều khiển ngắt INTCON cho 16F84/16F877A. Thanh ghi điều khiển ngắt ghi yêu cầu ngắt riêng rẽ vào bit cờ. Nĩ cũng cĩ bit cho phép ngắt tồn cục và riêng rẽ. Chú ý: bit cờ ngắt riêng rẽ được bật (=1) bất chấp trạng thái của bit mặt nạ tương ứng hay bit GIE. Bit cho phép ngắt tồn cục GIR (INTCON ), cho phép (nếu bật bit lên 1) tất cả các ngắt khơng che (unmasked interrupt) hay cấm (nếu bị xĩa 0) tất cả các ngắt. Bit 6 trong thanh ghi này được gán như là bit cho phép ngắt ngoại vi PEIE(peripheral interrupt enable bit) cho 16f818/819. Trước khi bit cho phép ngắt riêng rẽ cĩ thể chuyển qua ON (bật) thì bit cho phép bgắt tồn cục GIE, bit 7, phải được bật , nghĩa là ‘1’, cho phép tất cả các ngắt khơng che được và GIE=’0’ sẽ xố tất cả các ngắt. Bit 6 EEIE (16F84/16F877A) là bit cho phép ngắt việc ghi dữ liệu eeprom hồn thành. 1=cho phép ngắt. 0= cấm ngắt. Bit 6 PEIE (16F818/19): là bit cho phép khả năng của bit ngoại vi ngồi. Bit 5: T0IE là bit cho phép ngắt TMR0 tràn. 1=cho phép ngắt này. 0=cấm ngắt. Bit 4 INTE là bit cho phép ngắt RB0/INT (bit 0 của PORTB) 1=cho phép n gắt. 0=cấm ngắt Bit 3 RBIE là bit cho phép ngắt thay đổi ở portB (B4-B7). 1=cho phép ngắt. 0=cấm ngắt. Bit 2 T0IF là cờ , mà chỉ ra TMR0 bị tràn để tạo ra một ngắt. 1=chỉ ra TMR0 bị tràn.
  15. 115 0=TMR0 khơng tràn. Bit này phải được xố bằng phần mềm. Bit 1 INTF là bit cờ ngắt RB0/INT mà chỉ ra sự thay đổi trên PORTB,0 1=chỉ ra một sự thay đổi diễn ra. 0=chỉ ra khơng cĩ sự thay đổi. Bit 0 RBIF là bit cờ ngắt thay đổi ở PORTB (B4-B7). 1=chỉ ra rằng một trong bốn chân ngõ vào PORTB, 4-7 cĩ sự thay đổi trạng thái. Bit này phải được xĩa bằng phần mềm. 0=chỉ ra khơng cĩ bit nào ở PORTB,4-7 cĩ thay đổi. Lệnh RETFIE (return from interrupt), trở về từ ngắt, thốt khỏi chương trình phục vụ ngắt, cũng như thiết lập GIE bit, mà cho phép lại ngắt. Cờ ngắt ngoại vi được chứa trong thanh ghi chức năng đặc biệt PIR1 và PIR2. Bit cho phép ngắt tương ứng được chứa trong thanh ghi chức năng đặc biệt , PIE1 và PIE2, và bit cho phép ngắt ngoại vi chứa trong thanh ghi INTCON. Cờ ngắt chân RB0/INT, cờ ngắt thay đổi portB (B4-B7) và cờ ngắt tràn TMR0 được chứa trong thanh ghi INTCON. Khi một ngắt được đáp ứng, bit GIE bị xĩa để cấm các ngắt khác, địa chỉ trở về được cất vào ngăn xếp và thanh ghi bộ đếm chương trình PC được nạp giá trị 0004h. Một khi trong chương trình phục vụ ngắt, nguồn của ngắt cĩ thể được xác định bằng cách bit cờ ngắt. Bit cờ ngắt phải được xĩa bằng phần mềm trước khi cho phép lại ngắt để tránh ngắt đệ qui. Trong phần này, chúng ta xem xét ngắt gây ra bởi cạnh lên hay cạnh xuống của chân PORTB,0. Cho phép ngắt RB0/INT bằng lệnh BSF INTCON,GIE; bit cho phép ngắt tồn cục BSF INTCON,INTE;cho phép ngắt do RB0 6.3. Chương trình sử dụng ngắt: Như là một ví dụ làm thế nào ngắt hoạt động, chúng ta hãy xem xét thí dụ sau: Giả sử chúng ta cĩ 4 led sang tuần tự mỗi 5 giây. Một nút nhấn được nối với B0 hoạt động như một ngắt để mà khi B0 ở logic 0, một chương trình ngắt được gọi. Chương trình ngắt này chớp tất cả 4 led sang (on) và tắt (off) 2 lần trong một giây và trở về chương trình chính giả sử nút nhấn B0 là ở logic 1. Chúng ta dung 16F877A trong ví dụ này. Sơ đồ mạch cho ứng dụng này ở hình 6.2
  16. 116 Xem xét mạch điện sau: 34 680 33 B1 B0 16F877A SW B2 35 680 36 680 B3 37 680 B4 +5V 11 Vcc 22 pF 1 13 MCLR 32Khz 0.1 µF 22pF 14 12 Hình 6.2: Mạch điện chớp tắt 4 led. Một điều cần chú ý từ mạch là chip 16F877A cĩ điện trở kéo lên bên trong ở PORTB nên B0 khơng cần điện trở kéo lên ở cơng tắc SW. Ngắt chúng ta sử dụng là thay đổi trên B0, vì vậy chúng ta quan tâm đến các bit sau trong INTCON: bit 4 INTE, bit cho phép ngắt do RB0/INT và bit 1 INTF, bit cờ minh họa B0 cĩ thay đổi, và dĩ nhiên bit 7 GIE, bit cho phép ngắt tồn cục. Hoạt động của chương trình: Khi B0 tạo ra một ngắt, chương trình rẽ nhánh tới chương trình phục vụ ngắt .ở đâu? vị trí 4 ở bộ nhớ chương trình báo cho vi điều khiển nhảy tới nơi tìm chương trình phục vụ ngắt. Vị trí ơ nhớ số 4 của bộ nhớ chương trình thì được lập trình sử dụng lệnh sau: ORG 4; ghi lệnh kế tiếp vào ơ nhớ 4 ở bộ nhớ chương trình. GOTO ISR;nhảy tới chương trình phục vụ ngắt. Chương trình phục vụ ngắt: Chương trình phục vụ ngắt được viết giống như chương trình con và được minh họa dưới đây: ;chương trình phục vụ ngắt: ISR MOVWF W_TEMP; lưu W SWAPF STATUS,W MOVWF STATUS_T;lưu STATUS MOVF TMR0,W MOVWF TMR0_T; lưu TMR0 MOVF PORTB,W MOVWF PORTB_T; lưu PORTB
  17. 117 MOVLW 0FFh MOVWF PORTB; bật tất cả ngõ ra CALL DELAY1; trì hỗn 1 giây MOVLW 0 MOVWF PORTB; tắt tất cả ngõ ra CALL DELAY1 ; trì hỗn 1 giây MOVLW 0FFh MOVWF PORTB;bật tất cả ngõ ra CALL DELAY1; trì hỗn 1 giây MOVLW 0 MOVWF PORTB;tắt tất cả ngõ ra CALL DELAY1; trì hỗn 1 giây SW_HI BTFSS PORTB,0 GOTO SW_HI; đợi cho nút nhấn ở mức ‘1’ SWAPF STATUS_T,W MOVWF STATUS;phục hồi STATUS MOVF TMR0_T,W MOVWF TMR0;phục hồi TMR0 MOVF PORTB_T,W MOVWF PORTB;phục hồi PORTB MOVF W_TEMP,W;phục hồi W BCF INTCON,INTF;reset cờ ngắt RETFIE ; trở về từ ngắt Hoạt động của chương trình phục vụ ngắt: Chương trình phục vụ ngắt hoạt động theo cách sau: . Khi một ngắt được thự hiện thì cho phép ngắt tồn cục bị xĩa tự động (=’0’, cấm) để tắt tất cả các ngắt khác. Chúng ta khơng muốn bị ngắt khi chúng ta đang bị ngắt. . Thanh ghi W, STATUS, TMR0 và PORTB được lưu trong vị trí tạm W_TEMP, STATUS_T, TMR0_T, và PORTB_T. . Chương trình ngắt được thực thi , led chớp sang và tắt 2 lần. Đây là chuỗi tách biệt hơn trước đây để minh họa ngắt đã ngắt dịng chương trình thong thường. Chú ý là chương trình đã khơng nhìn vào cơng tắc mà đã tạo ra ngắt. . Chúng ta đợi cho tới khi cơng tắc trở về vit trí Hi (mức cao). . Ơ nhớ tạm W_TEMP, STATUS_T, TMR0_T, và PORTB_T được phục hồi vào W, STATUS, TMR0 và PORTB. . Cờ ngắt PORTB,0 ở thanh ghi INTCON là INTF bị xố, sẵn sang chỉ ra ngắt khác nữa. . Chúng ta trở về từ ngắt, bit cho phép ngắt tồn cục tự động được bật lên 1 để cho phép ngắt khác nữa. Chương trình minh họa ngắt: Đoạn mã đầy đủ cho chương trình này được minh họa dưới đây với tên INTFLASH.ASM ;INTFLASH.ASM chớp tắt led dung ngắt bằng nút nhấn trên B0 dùng 16F877A ; Header877.asm điều này thiết lập portA là ngõ vào (1 là vào), portB,0 là ngõ vào, cịn B1-B7 là ngõ ra ( 0 là ra), ;portC là ngõ vào, portE ngõ vào, portD ngõ ra. ;thanh ghi OPTION được thiết lập để chia 256 cho ra xung định thì 1/32 của 1 giây. ;trì hỗn 1 giây và 0,5 giây được đưa vào chương trình con ; ;phần tương đương TMR0 EQU 1; nghĩa là TMR0 là file 1 (ơ nhớ 1)
  18. 118 OPTION_R EQU 81h; thanh ghi OPTION là ơ nhớ 81h. PORTA EQU 5;nghĩa là portA là ơ nhớ 5. PORTB EQU 6;nghĩa là portB là ơ nhớ 6. PORTC EQU 7 PORTD EQU 8 PORTE EQU 9 TRISA EQU 85H; TRISA (chọn I/O portA) là ơ nhớ 85H TRISB EQU 86H; TRISB (chọn I/O portB) là ơ nhớ 86H TRISC EQU 87H TRISD EQU 88H TRISE EQU 89H STATUS EQU 3; nghĩa là STATUS là ơ nhớ 3. ZEROBIT EQU 2; nghĩa là zerobit là bit 2. CARRY EQU 0 INTCON EQU 0BH; thanh ghi điều khiển ngắt GIE EQU 7; bit ngắt tồn cục INTE EQU 4;bit cho phép ngắt B0 INTF EQU 1; cờ ngắt B0 ADCON0 EQU 1Fh;thanh ghi cấu hình A/D 0. ADCON1 EQU 9FH;thanh ghi cấu hình A/D 1. ADRESH EQU 1EH ADRESL EQU 9EH COUNT EQU 20H ;COUNT là ơ nhớ 20H, thanh ghi để đếm sự kiện. TMR0_T EQU 21H; ơ nhớ tạm TMR0 W_TEMP EQU 22H; ơ nhớ tạm W STATUS_T EQU 23H; ơ nhớ tạm STATUS PORTB_T EQU 24H; ơ nhớ tạm PORTB COUNTA EQU 25H;COUNTA là thanh ghi đếm sự kiện ; LIST P=16F87A ; chúng ta đang dùng 16F877A ORG 0 ; địa chỉ bắt đầu là 0 GOTO START; nhảy đến START ORG 4;ghi tới ơ nhớ 4 GOTO ISR;vị trí 4 nhảy tới ISR ; ;Bit cấu hình __CONFIG H’3FF0’ ; chọn dao động LP, WDT off, PUT on, bảo vệ mã bị cấm. ;Phần chương trình con ;trì hỗn 0,1 giây, thực sự 0,099968s DELAYP1 CLRF TMR0; bắt đầu TMR0 LOOPB MOVF TMR0,W; đọc TMR0 vào W SUBLW .3; TIME-3 BTFSS STATUS, ZEROBIT; kiểm tra TIME-3=0 (3-W=0) GOTO LOOPB; time khơng bằng 3 NOP ;them trì hỗn NOP RETLW 0; trở về sau khi time là 3 ;trì hỗn 5 giây. DELAY5 MOVLW .50 MOVWF COUNTA
  19. 119 LOOPC CALL DELAYP1 DECFSZ COUNTA GOTO LOOPC RETLW 0 ;trì hỗn 1 giây DELAY1 MOVLW .10 MOVWF COUNT LOOPA CALL DELAYP1 DECFSZ COUNT GOTO LOOPA RETLW 0 ;chương trình phục vụ ngắt: ISR MOVWF W_TEMP; lưu W SWAPF STATUS,W MOVWF STATUS_T;lưu STATUS MOVF TMR0,W MOVWF TMR0_T; lưu TMR0 MOVF PORTB,W MOVWF PORTB_T; lưu PORTB MOVLW 0FFh MOVWF PORTB; bật tất cả ngõ ra CALL DELAY1; trì hỗn 1 giây MOVLW 0 MOVWF PORTB; tắt tất cả ngõ ra CALL DELAY1 ; trì hỗn 1 giây MOVLW 0FFh MOVWF PORTB;bật tất cả ngõ ra CALL DELAY1; trì hỗn 1 giây MOVLW 0 MOVWF PORTB;tắt tất cả ngõ ra CALL DELAY1; trì hỗn 1 giây SW_HI BTFSS PORTB,0 GOTO SW_HI; đợi cho nút nhấn ở mức ‘1’ SWAPF STATUS_T,W MOVWF STATUS;phục hồi STATUS MOVF TMR0_T,W MOVWF TMR0;phục hồi TMR0 MOVF PORTB_T,W MOVWF PORTB;phục hồi PORTB MOVF W_TEMP,W;phục hồi W BCF INTCON,INTF;reset cờ ngắt RETFIE ; trở về từ ngắt ;Phần cấu hình. START BCF STATUS,6 BSF STATUS,5; trở lại bank 1 MOVLW B’11111111’; 6 bit của port A là I/P (ngõ vào) MOVWF TRISA MOVLW B’00000110’ MOVWF ADCON1; portA là số (digital)
  20. 120 MOVLW B’00000001’ MOVWF TRISB ; PortB,0 là I/P (ngõ vào) MOVLW B’11111111’ MOVWF TRISC; portC l à ngõ vào MOVLW B’00000000’ MOVWF TRISD; PortD là output (ngõ ra) MOVLW B’11111111’; 3 bit của port E là I/P (ngõ vào) MOVWF TRISE MOVLW B’00000111’;bộ chia tỉ lệ trước là /256 MOVWF OPTION_R; timer là 1/32sec, cĩ thể dùng lệnh OPTION BCF STATUS,5 ;trở lại bank 0 BCF STATUS,6 CLRF PORTA ; xĩa PORTA CLRF PORTB ;xĩa PORTB CLRF PORTC ;xĩa PORTC CLRF PORTD ;xĩa PORTD CLRF PORTE ;xĩa PORTE BSF INTCON,GIE; cho phép ngắt tồn cục BSF INTCON, INTE;cho phép ngắt B0 ;chương trình chính bắt đầu BEGIN MOVLW B’00000010’; bật B1 led 1 sáng MOVWF PORTB CALL DELAY5; đợi 5 giây MOVLW B’00000100’ MOVWF PORTB;bật B2, led 2 sáng CALL DELAY5; trì hỗn 5 giây MOVLW B’00001000’ MOVWF PORTB;bật B3 , led 3 sáng CALL DELAY5; trì hỗn 5 giây MOVLW B’00010000’ MOVWF PORTB;bật B4, led 4 sáng CALL DELAY5;trì hỗn 5 giây GOTO BEGIN END; dịng này luơn luơn đặt ở cuối chương trình. 4 led chớp sáng và tắt đủ chậm (khoảng 5 giây) để mà bạn cĩ thể ngắt cách quảng thơng qua B0 mức thấp dùng nút nhấn. Khi trở về từ ngắt, B0 ở mức cao trở lại, chương trình gĩư từ lúc nĩ bỏ đi. IV.Tổng kết bài: -Tĩm tắt các ý chính trong bài. -Chuẩn bị bài mới. V. Câu hỏi và bài tập về nhà: Chương 6: Ngắt 1.Ngắt là gì? Các nguồn ngắt của 16F84 và của 16F877A. 2. Thanh ghi INTCON. 3. Giả sử chúng ta cĩ 4 led chớp(sang và tắt) tuần tự. Một nút nhấn nối với B0 làm việc như 1 ngắt để mà khi B0 là ở logic 0 một chương trình ngắt được gọi. Chương trình ngắt này chớp tất cả 4 led sang(ON) và tắt (OFF) hai lần ở khoảng thời gian 1 giây và trở về chương trình cung cấp nhút nhấn ở B0 là ở logic 1. Hãy viết chương trình trên.
  21. 122 Bài giảng số 7: Bộ chuyển đổi tương tự-số ( Số tiết: 3) III.1. Mục tiêu: - Thực hiện việc đọc A/D. - Cấu hình thiết bị A/D. -Tiêu đề tương tự cho PIC 16F877A. - Thí dụ chuyển đổi A/D: chuyển mạch (switch) cảm biến nhiệt độ. -. Mã chương trình III.2. Đồ dung và phương tiện dạy học: -Phấn trắng, bảng, khăn, bút long, micro cĩ dây(hay khơng dây), máy tính, và đèn chiếu (hay máy chiếu). III.3. Giáo trình và tài liệu tham khảo: Giáo trình Vi xử lí của trường Đại học cơng nghiệp Tp. HCM. D.W. Smith, PIC in practice: a project-based approach, Elsevier, 2nd edition, 2006. Trương Trác, Chip đơn 16C84 và ứng dụng của chúng. Hồ Trung Mỹ, Vi xử lí, NXB ĐHQG Tp. HCM, 2003. Tài liệu về vi điều khiển PIC của bọ mơn Điện tử cơng nghiệp. Datasheet c ủa PIC 16F84 v à 16F877A. Website: Myke Predko, Programming and customizing the PIC microcontroller, 3rd edition, Tab Electronics, McGrawHill, 2008(Ebook). Douglass V.Hall, Microprocessors and interfacing: Programming and Hardware, 2nd ed., Macmillan/McGraw-Hill, 1992. III.4.Nội dung bài giảng: Nội dung chi tiết : xem bài giảng chi tiết. Phương pháp giảng dạy: thuyết trình, nêu vấn đề và đàm thoại trao đổi với sinh viên. Chương 7: Bộ chuyển đổi tương tự-số (ADC) Cho tới nay chúng ta xét ngõ vào như là số ở hoạt động nghĩa là ngõ vào là 0 hay 1. Nhưng giả sử chúng ta đo nhiệt độ, chứ khơng chỉ là nĩng hay lạnh (1 hay 0). Chúng ta cĩ thể yêu cầu: (a)Phát ra buzzer (cịi hụ) nếu nhiệt độ xuống dưới freezing (đơng). (b) Bật lị lên nếu nhiệt độ dưới 18 độ C. (c) Bật quạt lên nếu nhiệt độ trên 25 độ C. (d)Báo động nếu nhiệt độ trên 35 độ C. Giải pháp tốt là sử dụng một ngõ vào nối với bộ chuyển đổi tương tự sang số (ADC) và đo nhiệt độ với A/D. Hình 7.1 minh họa sử mạch cơ bản để đo nhiệt độ. Nĩ gồm cĩ điện trở cố định nối tiếp với thermistor (điện trở nhiệt bán dẫn).
  22. 123 Điện trở của thermistor (tec-mix-to) thay đổi theo nhiệt độ gây ra 1 điện áp tại điểm X ở hình 8.1 +5V Tec-mix-to 0C X 22k 0V Hình 7.1: Mạch đo nhiệt độ. Khi nhiệt độ tăng điện áp tại X tăng. Khi nhiệt độ giảm , điện áp tại X giảm. Chúng ta cần biết quan hệ giữa nhiệt độ của tec-mix-to với điện áp tại X. Cách đơn giản làm điều này là đặt tec-mix-to trong ly nước sơi (100 độ C) và đo điện áp tại X. Khi nước nguội tương ứng việc đọc nhiệt độ và điện áp cĩ thể đo được. Nếu cần thiết, đồ thị của nhiệt độ và việc đọc điện áp được vẽ ra. 7.1. Thực hiện việc đọc A/D. Trong thí dụ trên chúng ta hãy giả sử: . 0 độ C cho đọc điện áp là 0,6V. . 18 độ C cho đọc điện áp là 1,4V. . 25 độ C cho đọc điện áp là 2,4V. . 30 độ C cho đọc điện áp là 3,6V. Vi điều khiển sẽ đọc các điện áp này và chuyển đổi chúng thành số 8 bit trong đĩ 0V là 0 và 5V là 255, nghĩa là việc đọc 51/volt hay độ phân giải là 1/51, nghĩa là 1 bit là 19,6 mV. Như vậy 0độ C=0,6V=đọc là 31 (0,6vx51=30,6) 18 độ C=1,4V=71 (1,4v x 51=71,4) 25 độ C=2,4v= 122 (2,4v x 51=122,4) 30 độ C= 3,6 v= 184(3,6V x 51=183,6) PIC 16C773 và PIC 16C773 cĩ ADC 12 bit và cĩ 4096 điểm nhiệt độ khác nhau. ADC được giới thiệu ở PIC với họ gọi là 16C7X như là 16C71, 16C73 và 16C74. Họ này hiện nay được thay bằng 16F87X như là 16F870, 16F871/872/873/874/876/16F877. Ngồi ra cịn cĩ 16F818/819.
  23. 124 PIC 16F877A cĩ 8 ngõ vào analog AN0, AN1, AN2, AN3, AN4, AN5, AN6, AN7 và AN8 với bộ chuyển đổi tương tự-số (A/D) 10 bit cĩ 8 kênh vào. (PIC 16F877 cĩ ADC 10 bit với 5 kênh vào). 7.2. Cấu hình thiết bị A/D: Để thực hiện đo lường analog thì ta phải cấu hình thiết bị . HEADER877A.ASM phải cĩ phần cấu hình thay đổi để làm cho một số ngõ vào port A là ngõ vào analog, portB được thiết lập ngõ ra. Để cấu hình 16F877A cho đo lường A/D, 3 thanh ghi cần được thiết lập: . ADCON0. .ADCON1. .ADRESH và ADRESL Thanh ghi điều khiển A/D 0: ADCON0, đ ịa ch ỉ 1FH Đầu tiên là thanh ghi A/D, ADCON0 là thanh ghi điều khiển tương tự sang số thứ 0. ADCON0 được dung: . Bật lên chuy ển đ ổi A/D v ới ADCON0, bit 0. Bit này bật chuyển đổi A/D khi nĩ được bật lên 1 và tắt A/D khi nĩ bị xĩa về 0. Khi A/D được bật, nĩ cĩ thể được để ON (bật) suốt thời gian nhưng nĩ lái dịng 90μA, so sánh với phần cịn lại của vi điều khiển mà lái dịng 15μA. . Ra lệnh vi điều khiển thực thi chuyển đổi bằng cách bật bit GO/DONE, bit 2. Khi bit GO/DONE=’1’ thì vi điều khiển thực hiện chuyển đổi A/D. Khi chuyển đổi hồn thành, phần cứng xĩa bit GO/DONE. Bit này cĩ thể được đọc khi kết quả là sẵn sang. . Thiết lập kênh cụ thể (ngõ vào) để thực hiện đo lường. Điều này được thực hiện với 3 bit chọn kênh CHS0, CHS1 và CHS2, bit 3,4, và 5. Bit 7 6 5 4 3 2 1 0 ADCS1 ADSC0 CHS2 CHS1 CHS0 GO/DONE - ADON Hình 7.2: Thanh ghi ADCON0. .Bit 7 và 6, ADCS1 và ADCS0: bit chọn clock chuyển đổi A/D. ADCS2 ADCS1 ADCS0 Tốc độ chuyển đổi (ADCON1) 0 0 0 Fosc/2 0 0 1 Fosc/8 0 1 0 Fosc/32 0 1 1 FRC (clock lấy từ mạch RC A/D bên trong) 1 0 0 Fosc/4 1 0 1 Fosc/16 1 1 0 Fosc/64 1 1 1 FRC
  24. 125 .Bit 5,4 và 3: CHS2, CHS1, và CHS0 :chọn kênh A/D. CHS2 CHS2 CHS0 Chọn kênh A/D 0 0 0 kênh 0, AN0 0 0 1 kênh 1, AN1 0 1 0 kênh 2, AN2 0 1 1 kênh 3, AN3 1 0 0 kênh 4, AN4 1 0 1 kênh 5, AN5 1 1 0 kênh 6, AN6 1 1 1 kênh 7, AN7 Thanh ghi điều khiển A/D 1: ADCON1, đ ịa chỉ 9FH Trong ADCON1, thanh ghi chuyển đổi tương tự-số thứ 1, chỉ cĩ các bit 0,1,2, và 3 được dung. Chúng là cấu hình port, PCFG1, PCFG2 và PCFG3 mà xác định chân nào của port A sẽ là ngõ vào analog và chân nào là số. Thanh ghi ADCON1 được minh họa trong hình 7.3 và ngõ vào analog và ngõ vào số được minh họa ở bảng 7.4. Bit 7 6 5 4 3 2 1 0 ADFM ADCS2 - - PCFG3 PCFG2 PCFG1 PCFG0 Hình 7.3: Thanh ghi ADCON1. Bảng 7.4: Cấu hình port ADCON1. PCFG AN7-5 AN4 AN3 AN2 AN1 AN0 Vref+ Vref- C/R 0000 AAA A A A A A Vdd Vss 8/0 0001 AAA A Vref+ A A A AN3 Vss 7/1 0010 DDD A A A A A Vdd Vss 5/0 0011 DDD A Vref+ A A A AN3 Vss 4/1 0100 DDD D A D A A Vdd Vss 3/0 0101 DDD D Vref+ D A A AN3 Vss 2/1 011x DDD D D D D D - - 0/0 1000 AAA A Vref+ Vref- A A AN3 AN2 6/2 1001 DDD A A A A A Vdd Vss 6/0 1010 DDD A Vref+ A A A AN3 Vss 5/1 1011 DDD A Vref+ Vref- A A AN3 AN2 4/2 1100 DDD A Vref+ Vref- A A AN3 AN2 3/2 1101 DDD D Vref+ Vref- A A AN3 AN2 2/2 1110 DDD D D D D A Vdd Vss 1/0 1111 DDD D Vref+ Vref- D A AN3 AN2 1/2 Bit 7, ADFM : bit chọn khuơn dạng kết quả A/D. 1=chỉnh phải. 6 bit trong số cao nhất của ADRESH là đọc là ‘0’. 0=chỉnh trái. 6 bit trọng số thấp nhất của ADRESH là đọc là ‘0’. Bit 6, ADCS2: bit chọn clock chuyển đổi A/D. A=analog (tương tự) , D= digital (số) C/R=# của kênh vào analog/# của tham chiếu điện áp A/D.
  25. 126 Như đề cập trước đây, vi điều khiển dẽ chuyển đổi một điện áp analog giữa 0 và 5V thành một số giữa 0 và 255. Nhưng giả sử việc đọc analog của chúng ta là, nhiệt độ đi từ 0,6V thể hiện 0 độ C lên tới 3,6V thể hiện 30 độ C. Nĩ cĩ ý nghĩa để cĩ tầm điện áp analog đi từ 0,6V đến 3,6V. Chúng ta cĩ thể thiết lập điều này bằng cách dung 2 điện áp tham chiếu. Một ở thiết lập thấp 0,6V được gọi là Vref-,nối với AN2. Thiết lập kia của 3,6V cho Vref+, nối với AN3. Hai cột bên phải chỉ ra rằng PCFG thiết lập là 1000 sẽ thiết lập cấu hình A/D sử dụng AN3 như là điện áp tham chiếu. Trong ài giảng này, tơi khơng sử dụng điện áp tham chiếu mà dung 5V cho Vdd và 0V cho Vss là tham chiếu. ADRES: Thanh ghi thứ ba là ADRES, thanh ghi kết quả A/D. Đây là các ơ nhớ mà kết quả chuyển đổi A/D được lưu trữ. Nếu nhiều đo lường yêu cầu lưu trữ thì số trong ADRES cần được chuyển tới ơ nhớ người dùng trước khi nĩ bị đè bởi đo lường kế tiếp. PIC 16F877A cĩ A/D 10 bit. 8 bit cao được lưu trong ADRESH và 2 bit thấp hơn được lưu trong ADRESL. Trong bài giảng này, tơi chỉ sử dụng 8 bit và gọi ơ nhớ ADRES (chính là ADRESH). 7.3.Tập tin tiêu đề cho 16F877A: xem chương 4. 7.4.Chuyển đổi A/D. Ví dụ chuyển mạch nhạy cảm nhiệt độ: Để giới thiệu sự làm việc của bộ chuyển đổi A/D, chúng ta sẽ xem xét ví dụ đơn giản, nghĩa là bật led khi nhiệt độ trên 250C và tắt led khi nhiệt độ thấp hơn 250C. Sơ đồ mạch cho chuyển mạch nhiệt độ được minh họa ở hình 7.4. *Lấy việc đọc giá trị A/D: Bộ chuyển đổi A/D được chuyển sang bật (ON) trong tập tin tiêu đề và nĩ tự động nhìn vào kênh 0. Để thực hiện đo lường, bit GO/DONE, bit 2 được bật lên 1 và chúng ta đợi cho tới khi nĩ bị xĩa bằng lệnh: BSF ADCON0,2; thực hiện đo, bật GO/DONE WAIT BTFSC ADCON0,2; đợi cho tới khi GO/DONE bị xĩa GOTO WAIT Việc đo lường này sẽ được đặt ở thanh ghi kết quả A/D, ADRES.
  26. 127 +5V 33 680 B0 16F877A Thermistor 2 A0 +5V 11 Vcc 22 pF 1 13 MCLR 32Khz 0.1 µF 22pF 14 12 Hình 7.4 . *Xác định xem nhiệt độ là trên hay thấp hơn 25 độ C. Giả sử điện áp trên ngõ vào analog, kênh 0, A0 là 2,4V khi nhiệt độ là 25 độ C. Giá trị đọc A/D yêu cầu cho 2,4V là 2,4 x 51=122. Vì vậy chúng ta cần biết khi đọc A/D là trên hay thấp hơn 122, nghĩa là trên hay thấp hơn 25 độ C. Truớc đây chúng ta đã xem xét cách yêu cầu một giá trị bằng giá trị khác bằng cách trừ và xem bit zero trong thanh ghi trạng thái. Cĩ 1 bit khác, bit 0 trong thanh ghi trạng thái được gọi là bit cờ nhớ C, mà chỉ ra kết quả của phép trừ là +ve (dương) hay –ve(âm). Nếu bit cờ C=’1’ (bật) thì kết quả là +ve, nếu bit cờ nhớ C=’0’ (bị xĩa), kết quả là –ve. Vì vậy chúng ta cĩ thể yêu cầu 1 số là lớn hơn hay thấp hơn 1 giá trị định nghĩa trước. Mã cho điều này là: MOVF ADRES,W; chuyển kết quả analog vào W SUBLW .122; thực hiện 122-ADRES, nghĩa là 122-W BTFSC STATUS,CARRY;kiểm tra cờ nhớ C, xĩa nếu ADRES>122, nghĩa là –ve. GOTO TURNOFF; chương trình con tắt led GOTO TURNON; chương trình con bật led Việc đo lường được chuyển từ ADRES vào W, ở đĩ chúng ta cĩ thể trừ nĩ từ 122 (122- W). Chú ý là phép trừ luơn thực hiện giá trị-W. Bit cờ nhớ báo cho ta kết quả A/D là trên hay dưới 122. Chú ý: Nếu kết quả của phép trừ là zero thì bit cờ nhớ cũng là 1. Nĩ phải là 1 hay 0. Là +ve (dương) hay 0 khơng thành vấn đề trong thí dụ này. Chúng ta tìm ra kết quả là bằng hay trên 122, hay kết quả thấp hơn 122.
  27. 128 Khi việc đo lường được thực hiện, chúng ta đi tới một trong hai chương trình con, TURNON và TURNOFF. Các chương trình con này khơng lớn nhưng chúng cĩ thể dễ dàng phức tạp hơn , thậm chí dài hang trăm dịng. 7.5.Mã chương trình: Mã đầy đủ cho chương trình chuyển mạch nhạy cảm nhiệt độ được minh họa ở dưới với tên TEMPSENS.ASM ;TEMPSENS.ASM chương trình này thiết lập PORTA là ngõ vào analog /số. PORTB ; là ngõ ra. Dao động 32 Khz được chọn. Thanh ghi OPTION được thiết lập để chia ; cho xung định thì 32,768 ms. ;chương trình con trì hỗn 1 giây và 0,5 giây. ; ;phần khai báo tương đương TMR0 EQU 1; nghĩa là TMR0 là file 1 (ơ nhớ 1) OPTION_R EQU 81h; thanh ghi OPTION là ơ nhớ 81h. PORTA EQU 5;nghĩa là portA là ơ nhớ 5. PORTB EQU 6;nghĩa là portB là ơ nhớ 6. PORTC EQU 7 PORTD EQU 8 PORTE EQU 9 TRISA EQU 85H; TRISA (chọn I/O portA) là ơ nhớ 85H TRISB EQU 86H; TRISB (chọn I/O portB) là ơ nhớ 86H TRISC EQU 87H TRISD EQU 88H TRISE EQU 89H STATUS EQU 3; nghĩa là STATUS là ơ nhớ 3. ZEROBIT EQU 2; nghĩa là zerobit là bit 2. CARRY EQU 0 ADCON0 EQU 1Fh ADCON1 EQU 9FH ADRES EQU 1EH ADRESL EQU 9EH CHS0 EQU 3 GODONE EQU 2 COUNT EQU 20H; COUNT là ơ nhớ 20H, thanh ghi để đếm sự kiện. ; LIST P=16F87A ; chúng ta đang dùng 16F877A ORG 0 ; địa chỉ bắt đầu là 0 GOTO START; nhảy đến START ; ;Bit cấu hình __CONFIG H’3FF0’ ; chọn dao động LP, WDT off, PUT on, bảo vệ mã bị cấm. ;Phần chương trình con ;trì hỗn 1 giây DELAY1 CLRF TMR0; bắt đầu TMR0 LOOPA MOVF TMR0,W; đọc TMR0 vào W SUBLW .32; TIME-W BTFSS STATUS, ZEROBIT; kiểm tra TIME-W=0 (32-W=0) GOTO LOOPA; time khơng bằng 32 RETLW 0; trở về sau khi time là 32 (TMR0=32). ;trì hỗn 0,5 giây.
  28. 129 DELAY5 CLRF TMR0 ; khởi động TMR0 LOOPB MOVF TMR0,W ; đọc TMR0 vào W SUBLW .16 ;TIME-W BTFSS STATUS,ZEROBIT;kiểm tra TIME-W=0 GOTO LOOPB ; TIME khơng bằng 16 RETLW 0; trở về sau khi time là 16 (TMR0=16). ;phần chương trình con TURNON BSF PORTB,0;bật led trên B0 GOTO BEGIN;trở về chương trình chính TURNOFF BCF PORTB,0;tắt led trên B0 GOTO BEGIN;trở về chương trình chính ;Phần cấu hình. START BCF STATUS,6 BSF STATUS,5; trở lại bank 1 MOVLW B’11111111’; 6 bit của port A là I/P (ngõ vào) MOVWF TRISA MOVLW B’00000100’ MOVWF ADCON1; A0, A1 và A3 là ngõ analog MOVLW B’00000000’ MOVWF TRISB ; PortB là output (ngõ ra) MOVLW B’11111111’ MOVWF TRISC; portC l à ngõ vào MOVLW B’00000000’ MOVWF TRISD; PortD là output (ngõ ra) MOVLW B’11111111’; 3 bit của port E là I/P (ngõ vào) MOVWF TRISE MOVLW B’00000111’;bộ chia tỉ lệ trước là /256 MOVWF OPTION_R; timer là 1/32sec, cĩ thể dùng lệnh OPTION BCF STATUS,6 BCF STATUS,5; trở về bank 0 BSF ADCON0,0; bật A/D lên CLRF PORTA ; xĩa PORTA CLRF PORTB ;xĩa PORTB CLRF PORTC ;xĩa PORTC CLRF PORTD ;xĩa PORTD CLRF PORTE ;xĩa PORTE ;chương trình chính bắt đầu BEGIN BSF ADCON0,2;thực hiện đo lường, bật bit GO/DONE=’1’ WAIT BTFSC ADCON0,2; đợi cho tới khi GO/DONE bị xĩa GOTO WAIT MOVF ADRES,W; chuyển kết quả analog vào W SUBLW .122; thực hiện 122-ADRES, nghĩa là 122-W BTFSC STATUS,CARRY;kiểm tra cờ nhớ C, xĩa nếu ADRES>122. GOTO TURNOFF; chương trình con tắt led GOTO TURNON; chương trình con bật led END; dịng này luơn luơn đặt ở cuối chương trình. IV.Tổng kết bài: -Tĩm tắt các ý chính trong bài.
  29. 130 -Chuẩn bị bài mới. V. Câu hỏi và bài tập về nhà: Chương 7: Bộ chuyển đổi tương tự-số (ADC) 1.Chuyển đổi A/D là gì? 2. Thanh ghi điều khiển tương tự-số: ADCON0, ADCON1 và thanh ghi kết quả A/D : ADRES. 3. Viết chương trình điều khiển bật led khi nhiệt độ trên 25 độ C và tắt led khi nhiệt độ dưới 25 độ C. Hình: Mạch chuyển mạch nhiệt độ . Viết lại chương trình cho PIC 16F84. VI. Rút kinh nghiệm: (về thời gian, nội dung, phương pháp, chuẩn bị) Ngày .tháng năm 2011 Ngày .tháng năm 2011 Bộ mơn Giảng viên soạn
  30. 131 Bài giảng số 8: Bộ nhớ dữ liệu EEPROM. Bắt giữ/so sánh/ điều rộng xung (PWM). MSSP(SPI/I2C) ( Số tiết: 4) I.Ổn định lớp: . II.Kiểm tra bài cũ: III.Tên bài giảng: : Bộ nhớ dữ liệu EEPROM. Bắt giữ/so sánh/ điều rộng xung (PWM). MSSP(SPI/I2C) III.1. Mục tiêu: - Bộ nhớ dữ liệu EEPROM: giới thiệu, thí dụ sử dụng EEPROM - Bắt giữ/So sánh/Điều rộng xung (PWM). - MSSP: SPI/I2C. III.2. Đồ dung và phương tiện dạy học: -Phấn trắng, bảng, khăn, bút long, micro cĩ dây(hay khơng dây), máy tính, và đèn chiếu (hay máy chiếu). III.3. Giáo trình và tài liệu tham khảo: Giáo trình Vi xử lí của trường Đại học cơng nghiệp Tp. HCM. D.W. Smith, PIC in practice: a project-based approach, Elsevier, 2nd edition, 2006. Trương Trác, Chip đơn 16C84 và ứng dụng của chúng. Hồ Trung Mỹ, Vi xử lí, NXB ĐHQG Tp. HCM, 2003. Tài liệu về vi điều khiển PIC của bọ mơn Điện tử cơng nghiệp. Datasheet c ủa PIC 16F84 v à 16F877A. Website: Myke Predko, Programming and customizing the PIC microcontroller, 3rd edition, Tab Electronics, McGrawHill, 2008(Ebook). Douglass V.Hall, Microprocessors and interfacing: Programming and Hardware, 2nd ed., Macmillan/McGraw-Hill, 1992. III.4.Nội dung bài giảng: Nội dung chi tiết : xem bài giảng chi tiết. Phương pháp giảng dạy: thuyết trình, nêu vấn đề và đàm thoại trao đổi với sinh viên. Chương 8: Bộ nhớ dữ liệu EEPROM. Bắt giữ/so sánh/ điều rộng xung (PWM). MSSP(SPI/I2C) 8.1. Giới thiệu Một trong các điểm đặc biệt của 16F84 và 16F877A và một số vi điều khiển khác là bộ nhớ dữ liệu EEPROM. Đây là phần bộ nhớ khơng cĩ trong khơng gian bộ nhớ thong thường. Nĩ là một khối dữ liệu giống file (ơ nhớ) của người dung, nhưng khơng giống ơ nhớ người dung, dữ liệu trong bộ nhớ dữ liệu EEPROM được lưu khi vi điều khiển bị tắt đi, nghĩa là nĩ là bộ nhớ khơng bay hơi. Giả sử chúng ta đang đếm xe vào và ra trong bãi đậu xe và chúng ta mất nguồn tới mạch của chúng ta. Nếu chúng ta lưu trữ số đếm trong EEPROM thì chúng ta cĩ thể nạp ơ nhớ số đếm với dữ liệu này và tiếp tục khơng cĩ mất dữ liệu, khi điện trở lại.
  31. 132 Để truy xuất dữ liệu, nghĩa là đọc và ghi vào ơ nhớ EEPROM, chúng ta phải ra lệnh vi điều khiển. Cĩ 64 byte EEPROM trên 16F84, 128 byte ở 16F818, 256 byte ở 16F819 và 256 byte EEPROM ở 16F877A. Vì vậy chúng ta phải yêu cầu (bảo) vi điều khiển địa chỉ nào chúng ta yêu cầu và chúng ta đọc hay ghi vào nĩ. Khi đọc chúng ta nhận dạng địa chỉ từ 0 đến 3FH ,hay 0Ỉ63 (đối với 16F84) và 0-367 đối với 16F877A dung thanh ghi EEADR. Dữ liệu sau đĩ là dung được trong thanh ghi EEDATA. Khi ghi vào bộ nhớ dữ liệu EEPROM chúng ta phải chỉ ra dữ liệu trong thanh ghi EEDATA và vị trí trong thanh ghi EEADR. Hai ơ nhớ khác được dung để cho phép quá trình, chúng là EECON1 và ECON2, hai thanh ghi điều khiển EEPROM. Thanh ghi EECON1 được minh họa ở hình 8.1. Ngồi ra cĩn cĩ 2 ơ nhớ khác là EEDATH và EEADRH. Khi giao tiếp với khối bộ nhớ chương trình , thanh ghi EEDATA và EEDATH tạo thành một word (từ) 2 byte mà giữ dữ liệu 14 bit cho đọc/ghi và EEADR và EEADRH tạo thành từ 2 byte mà giữ địa chỉ 13 bit của ơ nhớ chương trình được truy xuất. Các thiết bị này cĩ 4 hay 8K từ của bộ nhớ chương trình Flash, với tầm địa chỉ từ 0000h đến 0FFFh cho PIC 16F873A/74A và 0000h tới 1FFFh cho PIC 16F876A/877A. Bộ nhớ dữ liệu EEPROM cho phép đọc một byte. Bộ nhớ chương trình Flash cho phép đọc từng từ và ghi khối 4 từ. Hoạt động ghi bộ nhớ chương trình tự động thực hiện việc xĩa trước khi ghi trên khối 4 từ. Ghi 1 byte vào bộ nhớ dữ liệu EEPROM tự động xĩa ơ nhớ và ghi dữ liệu mới (xĩa trước khi ghi). Thời gian ghi được điều khiển bởi timer trên chip. Điện áp ghi/xĩa được tạo bởi bộ bơm nạp trên chip. Khi thiết bị là bảo vệ mã, CPU cĩ thể tiếp tục đọc và ghi bộ nhớ dữ liệu EEPROM. Tùy thuộc vào thiết lập của bit chống ghi, thiết bị cĩ thể hay khơng thể ghi một số khối của bộ nhớ chương trình, tuy nhiên việc đọc bộ nhớ chương trình là được phép. Khi bảo vệ mã thiết bị lập trình cĩ thể khơng cịn truy xuất bộ nhớ dữ liệu và chương trình. Điều này khơng cấm việc đọc ghi bên trong. Thanh ghi EECON1 (địa chỉ 18CH) Bit 7 6 5 4 3 2 1 0 EEPGD - - - WRERR WREN WR RD Hình 8.1: Thanh ghi EECON 1. Bit 0, RD được bật lên 1 để thực hiện đọc. Nĩ được xĩa bởi vi điều khiển khi việc đọc hồn thành. Bit 1, WR được bật lên 1 để thực hiện việc ghi. Nĩ được xĩa bởi vi điều khiển khi việc ghi hồn thành. Bit 2, WREN (EEPROM write enable) 1= cho phép chu kì ghi. 0=cấm ghi vào EEPROM. Bit 3, WRERR, bit cờ sai EEPROM, đọc là 1 nếu việc ghi khơng hồn thành, đọc là 0 nếu việc ghi hồn thành thành cơng. Bit cờ ngắt, EEIF trong thanh ghi PIR2, được bật lên 1 khi việc ghi hồn thành. Nĩ phải được xĩa bằng phần mềm.
  32. 133 Bit 7, EEPGD (Program /Data EEPROM Select bit)(khơng dung ở 16F84). Bit này cho phép hoặc là bộ nhớ chương trình hay bộ nhớ dữ liệu. 0=chọn bộ nhớ dữ liệu. 1=chọn bộ nhớ chương trình. 8.2. Thí dụ sử dụng EEPROM Như thường lệ, Tơi nghĩ cách tốt nhất để hiểu bộ nhớ này làm việc như thế nào là nhìn vào thí dụ đơn giản sau đây. Giả sử chúng ta muốn đếm sự kiện, người đi vào một tịa nhà, xe đi vào một bãi đậu xe. Như vậy, nếu chúng ta bị mất nguồn tới mạch, thì dữ liệu vẫn cịn lưu giữ. Mạch cho thí dụ này được minh họa ở hình 8.2. EEPROM. Hình 8.2: Mạch đếm nhấn nút. Nút nhấn 1 được dung để mơ phỏng quá trình đếm và 8 led trên PORTB hiển thị số đếm ở dạng nhị phân. (Điều này là cơ hội tốt để thực hành đếm nhị phân). Cơng tắc dĩ nhiên là chống dội. Hãy nhớ ý tưởng của mạch này, chúng ta đang đếm sự kiện và hiển thị số đếm trên PORTB. Nhưng nếu chúng ta bị mất nguồn-khi nguồn cĩ lại chúng ta muốn giá trị đếm như thể khơng cĩ gì xảy ra. Như vậy khi chúng ta chuyển mạch, chúng ta phải di chuyển dữ liệu EEPROM trước đĩ vào ơ nhớ COUNT. Lưu đồ được minh họa ở hình 8.3. Một vài điểm trước khi chúng ta nhìn vào chương trình:
  33. 134 1/Thật là tốt để đảm bảo rằng bộ nhớ dữ liệu EEPROM được reset tại điểm bắt đầu. Điều này được thực hiện bằng cách ghi 00h tới địa chỉ 00h dữ liệu EEPROM khi chúng ta nạp chương trình vào chip. Điều này được thực hiện với cácdịng lệnh sau: ORG 2100H DE 00H 2100H là địa chỉ của bộ nhớ dữ liệu EEPROM đầu tiên, nghĩa là 00H. DE là định nghĩa bộ nhớ dữ liệu EEPROM, vì vậy chúng ta khởi động nĩ với 00h, và dĩ nhiên 2100H là địa chỉ EEPROM đầu tiên. Dữ liệu cĩ thể được ghi vào EEPROM dung MPLAB, với View, EEPROM và ghi dữ liệu trong hộp EEPROM như minh họa trong hình 8.4. 2/Đọc và ghi vào dữ liệu EEPROM khơng thẳng tiến như ơ nhớ người dung, bạn cĩ thể kiểm chứng điều này. Cĩ một khối đoạn mã bạn cần sử dụng- chỉ them nĩ vào chương trình của bạn theo yêu cầu. Khi đọc dữ liệu EEPROM tại địa chỉ 0 tới ơ nhớ COUNT thì CALL READ. Chương trình con được viết trong tiêu đề. Khi ghi ơ nhớ COUNT tới địa chỉ dữ liệu EEPROM thứ 0, bạn hãy CALL WRITE. Di chuyển dữ liệu EEPROM tới COUNT N Nút nhấn được nhấn ? Y INCF COUNT Chuyển COUNT tới PORTB Chuyển COUNT tới dữ liệu EEPROM Hình 8.3. Lưu đồ đếm việc nhấn nút.
  34. 135 Hình 8.4: Ghi dữ liệu EEPROM. *Mã chương trình EEPROM: Chương trình hồn chỉnh EEDATAWR.ASM được minh họa ở dưới đây: ;EEDATAWR.ASM Chương trình này sẽ đếm và hiển thị sự nhấn nút. ;Giá trị đếm được lưu khi ngồn bị mất và tiếp tục khi nguồn cĩ trở lại. ; Header84.asm điều này thiết lập portA là ngõ vào (1 là vào), portB là ngõ ra ( 0 là ra) ;thanh ghi OPTION được thiết lập để chia 256 cho ra xung định thì 1/32 của 1 giây. ;trì hỗn 1 giây và 0,5 giây được đưa vào chương trình con ; ;phần tương đương TMR0 EQU 1; nghĩa là TMR0 là file 1 (ơ nhớ 1) OPTION_R EQU 81h; thanh ghi OPTION là ơ nhớ 81h. PORTA EQU 5;nghĩa là portA là ơ nhớ 5. PORTB EQU 6;nghĩa là portB là ơ nhớ 6. TRISA EQU 85H; TRISA (chọn I/O portA) là ơ nhớ 85H TRISB EQU 86H; TRISB (chọn I/O portB) là ơ nhớ 86H STATUS EQU 3; nghĩa là STATUS là ơ nhớ 3. ZEROBIT EQU 2; nghĩa là zerobit là bit 2. CARRY EQU 0 EEADR EQU 9h EEDATA EQU 8h EECON1 EQU 8h EECON2 EQU 9h RD EQU 0 WR EQU 1 WREN EQU 2 COUNT EQU 0CH; COUNT là ơ nhớ 0CH, thanh ghi để đếm sự kiện. ; LIST P=16F84 ; chúng ta đang dùng 16F84 ORG 2100H; Địa chỉ EEADR 0
  35. 136 DE 00H; đặt 00H trong EEADR 0 ORG 0 ; địa chỉ bắt đầu là 0 GOTO START; nhảy đến START ; ;Bit cấu hình __CONFIG H’3FF0’ ; chọn dao động LP, WDT off, PUT on, bảo vệ mã bị cấm. ;Phần chương trình con ;trì hỗn 0,1 giây. DELAYP1 CLRF TMR0 ; khởi động TMR0 LOOPB MOVF TMR0,W ; đọc TMR0 vào W SUBLW .3 ;TIME-W BTFSS STATUS,ZEROBIT;kiểm tra TIME-W=0 GOTO LOOPB ; TIME khơng bằng 3 RETLW 0; trở về sau khi time là 3 (TMR0=3). ; Đặt EEDATA 0 vào ơ nhớ COUNT READ MOVLW 0; đọc EEDATA từ EEADR MOVWF EEADR BSF STATUS,5; bank 1 BSF EECON1,RD BCF STATUS,5;bank 0 MOVF EEDATA,W MOVWF COUNT RETLW 0 ;Ghi COUNT vào EEDATA 0 WRITE BSF STATUS,5;bank 1 BSF EECON1,WREN; bật cho phép ghi BCF STATUS,5;bank 0 MOVF COUNT,W;chuyển COUNT vào EEDATA MOVWF EEDATA MOVLW 0;bật EEDATA 0 để nhận EEDATA MOVWF EEADR BSF STATUS,5;bank 1 MOVLW 55H; 55 và AA khởi động chu kì ghi MOVWF EECON2 MOVLW AAH MOVWF EECON2 BSF EECON1,WR;ghi dữ liệu tới EEADR 0 WRDONE BTFSC EECON1,WR GOTO WRITE; đợi cho chu kì ghi hồn thành BCF EECON1,WREn BCF STATUS,5;bank 0 RETLW 0 ;Phần cấu hình. START BSF STATUS,5; trở lại bank 1 MOVLW B’00011111’; 5 bit của port A là I/P (ngõ vào) MOVWF TRISA MOVLW B’00000000’ MOVWF TRISB ; PortB là output (ngõ ra) MOVLW B’00000111’;bộ chia tỉ lệ trước là /256
  36. 137 MOVWF OPTION_R; timer là 1/32sec, cĩ thể dùng lệnh OPTION BCF STATUS,5 ;trở lại bank 0 BCF STATUS,6 CLRF PORTA ; xĩa PORTA CLRF PORTB ;xĩa PORTB CLRF COUNT ;xĩa COUNT ;chương trình chính bắt đầu CALL READ; đọc dữ liệu EEPROM vào COUNT MOVF COUNT,W MOVWF PORTB;hiển thị COUNT trước đĩ (nếu cĩ thể) PRESS BTFSC PORTA,0; đợi cho nhấn nút GOTO PRESS CALL DELAYP1;chống dội RELEASE BTFSS PORTA,0; đợi cho nút nhấn được nhả GOTO RELEASE CALL DELAYP1;chống dội INCF COUNT;cộng 1 vào COUNT MOVF COUNT,W; đặt COUNT vào W MOVWF PORTB;chuyển W (COUNT) ra PORTB để hiển thị CALL WRITE;ghi COUNT tới địa chỉ EEPROM 0 GOTO PRESS;trở về và đợi nhấn nút END; dịng này luơn luơn đặt ở cuối chương trình. Microchip tiếp tục mở rộng phạm vi (loại) vi điều khiển và một họ mới của vi điều khiển Flash được giới thiệu, cĩ tên là 16F87X, cụ thể là 16F877A, mà gồm cĩ 8 Kx14 bit/word bộ nhớ chương trình, 368 byte RAM người dung và 256 byte bộ nhớ dữ liệu EEPROM và bộ chuyển đổi A/D 10 bit 8 kênh ngõ vào . Như vậy bây giờ đo lường analog cĩ thể được lưu trữ trong bộ nhớ dữ liệu EEPROM! Chương trình hồn chỉnh EEDATAWR.ASM được minh họa ở dưới đây: ;EEDATAWR.ASM Chương trình này sẽ đếm và hiển thị sự nhấn nút. ;Giá trị đếm được lưu khi ngồn bị mất và tiếp tục khi nguồn cĩ trở lại. ; Header877.asm điều này thiết lập portA là ngõ vào (1 là vào), portB là ngõ ra ( 0 là ra);portC là ngõ vào, portE ngõ vào, portD ngõ ra. ;thanh ghi OPTION được thiết lập để chia 256 cho ra xung định thì 1/32 của 1 giây. ;trì hỗn 1 giây và 0,5 giây được đưa vào chương trình con ; ;phần tương đương TMR0 EQU 1; nghĩa là TMR0 là file 1 (ơ nhớ 1) OPTION_R EQU 81h; thanh ghi OPTION là ơ nhớ 81h. PORTA EQU 5;nghĩa là portA là ơ nhớ 5. PORTB EQU 6;nghĩa là portB là ơ nhớ 6. PORTC EQU 7 PORTD EQU 8 PORTE EQU 9 TRISA EQU 85H; TRISA (chọn I/O portA) là ơ nhớ 85H TRISB EQU 86H; TRISB (chọn I/O portB) là ơ nhớ 86H TRISC EQU 87H TRISD EQU 88H
  37. 138 TRISE EQU 89H STATUS EQU 3; nghĩa là STATUS là ơ nhớ 3. ZEROBIT EQU 2; nghĩa là zerobit là bit 2. CARRY EQU 0 EEADR EQU 10Dh EEDATA EQU 10Ch EECON1 EQU 18Ch EECON2 EQU 18Dh RD EQU 0 WR EQU 1 WREN EQU 2 COUNT EQU 20H; COUNT là ơ nhớ 20H, thanh ghi để đếm sự kiện. ; LIST P=16F87A ; chúng ta đang dùng 16F877A ORG 2100H; Địa chỉ EEADR 0 DE 00H; đặt 00H trong EEADR 0 ORG 0 ; địa chỉ bắt đầu là 0 GOTO START; nhảy đến START ; ;Bit cấu hình __CONFIG H’3FF0’ ; chọn dao động LP, WDT off, PUT on, bảo vệ mã bị cấm. ;Phần chương trình con ;trì hỗn 0,1 giây. DELAYP1 CLRF TMR0 ; khởi động TMR0 LOOPB MOVF TMR0,W ; đọc TMR0 vào W SUBLW .3 ;TIME-W BTFSS STATUS,ZEROBIT;kiểm tra TIME-W=0 GOTO LOOPB ; TIME khơng bằng 3 RETLW 0; trở về sau khi time là 3 (TMR0=3). ; Đặt EEDATA 0 vào ơ nhớ COUNT READ MOVLW 0; đọc EEDATA từ EEADR MOVWF EEADR BSF STATUS,5; bank 1 BSF EECON1,RD BCF STATUS,5;bank 0 MOVF EEDATA,W MOVWF COUNT RETLW 0 ;Ghi COUNT vào EEDATA 0 WRITE BSF STATUS,5;bank 1 BSF EECON1,WREN; bật cho phép ghi BCF STATUS,5;bank 0 MOVF COUNT,W;chuyển COUNT vào EEDATA MOVWF EEDATA MOVLW 0;bật EEDATA 0 để nhận EEDATA MOVWF EEADR BSF STATUS,5;bank 1 MOVLW 55H; 55 và AA khởi động chu kì ghi MOVWF EECON2
  38. 139 MOVLW AAH MOVWF EECON2 BSF EECON1,WR;ghi dữ liệu tới EEADR 0 WRDONE BTFSC EECON1,WR GOTO WRITE; đợi cho chu kì ghi hồn thành BCF EECON1,WREn BCF STATUS,5;bank 0 RETLW 0 ;Phần cấu hình. START BSF STATUS,5; trở lại bank 1 MOVLW B’00111111’; 6 bit của port A là I/P (ngõ vào) MOVWF TRISA MOVLW B’00000000’ MOVWF TRISB ; PortB là output (ngõ ra) MOVLW B’11111111’ MOVWF TRISC; portC l à ngõ vào MOVLW B’00000000’ MOVWF TRISD; PortD là output (ngõ ra) MOVLW B’11111111’; 3 bit của port E là I/P (ngõ vào) MOVWF TRISE MOVLW B’00000111’;bộ chia tỉ lệ trước là /256 MOVWF OPTION_R; timer là 1/32sec, cĩ thể dùng lệnh OPTION BSF STATUS,6; bank 3 BCF EECON1,7; bộ nhớ dữ liệu EEPROM on BCF STATUS,5 ;trở lại bank 0 BCF STATUS,6 CLRF PORTA ; xĩa PORTA CLRF PORTB ;xĩa PORTB CLRF PORTC ;xĩa PORTC CLRF PORTD ;xĩa PORTD CLRF PORTE ;xĩa PORTE CLRF COUNT ;xĩa COUNT ;chương trình chính bắt đầu CALL READ; đọc dữ liệu EEPROM vào COUNT MOVF COUNT,W MOVWF PORTB;hiển thị COUNT trước đĩ (nếu cĩ thể) PRESS BTFSC PORTA,0; đợi cho nhấn nút GOTO PRESS CALL DELAYP1;chống dội RELEASE BTFSS PORTA,0; đợi cho nút nhấn được nhả GOTO RELEASE CALL DELAYP1;chống dội INCF COUNT;cộng 1 vào COUNT MOVF COUNT,W; đặt COUNT vào W MOVWF PORTB;chuyển W (COUNT) ra PORTB để hiển thị CALL WRITE;ghi COUNT tới địa chỉ EEPROM 0 GOTO PRESS;trở về và đợi nhấn nút END; dịng này luơn luơn đặt ở cuối chương trình. Thanh ghi EECON2 khơng là thanh ghi vật lí.
  39. 140 Đọc bộ nhớ dữ liệu EEPROM: Các bước để đọc bộ nhớ dữ liệu EEPROM là: 1/Ghi địa chỉ tới EEADR. Đảm bảo rằng địa chỉ là khơng lớn hơn kích thước bộ nhớ của thiết bị. 2/Xĩa bit EEPGD để chỉ tới bộ nhớ dữ liệu EEPROM. 3/Bật bit RD để bắt đầu tác vụ đọc. 4/Đọc dữ liệu từ thanh ghi EEDATA. Thí dụ: đọc dữ liệu EEPROM BSF STATUS,RP1 BCF STATUS,RP0; bank 2 MOVF DATA_EE_ADDR,W; bộ nhớ dữ liệu MOVWF EEADR; địa chỉ để đọc BSF STATUS,RP0; bank 3 BCF EECON1,EEPGD;chỉ tới bộ nhớ dữ liệu BCF STATUS,RP0; bank 2 MOVF EEDATA,W;W=data Ghi ra bộ nhớ dữ liệu EEPROM: Các bước để ghi ra bộ nhớ dữ liệu EEPROM là: 1/Nếu bước 10 khơng hồn thành, kiểm tra bit WR để xem việc ghi đang tiến hành. 2/Ghi địa chỉ tới EEADR. Đảm bảo rằng địa chỉ khơng lớn hơn kích cỡ bộ nhớ của thiết bị. 3/Ghi giá trị dữ liệu 8 bit để lập trình vào thanh ghi EEDATA. 4/Xĩa bit EEPGD để chỉ tới bộ nhớ dữ liệu EEPROM. 5/Bật bit WREN để cho phép tác vụ ghi. 6/Cấm các ngắt (nếu cĩ thể). 7/Thực thi chuỗi 5 lệnh đặc biệt: . Ghi 55h tới EECON2 trong 2 bước (đầu tiên tới W, sau đĩ tới EECON2). .Ghi AAh tới EECON2 trong 2 bước (đầu tiên tới W, sau đĩ tới EECON2). . Bật bit WR. 8/Cho phép các ngắt (nếu đang sử dụng ngắt). 9/ố bit WREN để cấm tác vụ lập trình. 10/Tại sự hồn thành của chu kì ghi, bit WR bị xĩa(=0) và bit cờ ngắt EEIF được bật)(=1)(EEIF phải được xĩa bằng phần dẻo (firmware)). Nếu bước 1 là khơng hồn thành, thì phần dẻo sẽ kiểm tra cho EEIF được bật, hay WR bị xĩa, để chỉ ra kết thúc chu kì ghi. Thí dụ: ghi dữ liệu EEPROM BSF STATUS,RP1 BSF STATUS,RP0;bank 3 BTFSC EECON1,WR; đợi cho ghi GOTO $-1; để hồn thành. BCF STATUS,RP0;bank 2 MOVF DATA_EE_ADDR,W;bộ nhớ dữ liệu MOVWF EEDAR; địa chỉ để ghi MOVF DATA_EE_DATA,W;giá trị bộ nhớ dữ liệu MOVWF EEDATA; để ghi BSF STATUS,RP0;bank 3 BCF EECON1,EEPGD; chỉ tới bộ nhớ dữ liệu BSF EECON1,WREN; cho phép ghi BCF INTCON,GIE;cấm các ngắt. MOVLW 55h; chuỗi 5 lệnh
  40. 141 MOVWF EECON2;ghi 55h MOVLW AAh MOVWF EECON2; ghi AAh BSF EECON1,WR; bật bit WR để bắt đầu ghi BSF INTCON,GIE;bật cho phép các ngắt BCF EECON1, WREN;cấm ghi. 8.3. Bắt giữ/So sánh/Điều rộng xung (PWM) Mỗi mođun Bắt giữ/So sánh/PWM (CCP -Capture/Compare/PWM) chứa một thanh ghi 16 bit mà cĩ thể hoạt động như .Thanh ghi nắm giữ 16 bit. .Thanh ghi so sánh 16 bit. .Thanh ghi chu kì bổn phận chủ tớ PWM. Cả hai mơđun CCP1 và CCP2 là giống nhau về hoạt động , với ngoại lệ là hoạt động của trigger sự kiện đặc biệt. Bảng 8-1 và 8-2 minh họa nguồn và giao tiếp của mơđun CCP. Trong phần sau hoạt động của mơđun CCp được mơ tả ứng với mơđun CCP1. CCP2 hoạt động giống như CCP1 ngoại trừ ghi chú. Bảng 8-1: Chế độ CCP-nguồn timer được yêu cầu. Chế độ CCP Nguồn timer Bắt giữ Timer 1 So sánh Timer 1 Điều rộng xung (PWM) Timer 2 Bảng 8-2: Giao tiếp của 2 mơđun CCP. CCPx Mode CCPy mode Giao tiếp Bắt giữ Bắt giữ Cơ sở thời gian TMR1 giống nhau. Bắt giữ So sánh So sánh nên được cấu hình cho trigger sự kiện đặc biệt mà xĩa TMR1. So sánh So sánh So sánh được cấu hình với trigger sự kiện đặc biệt mà xĩa TMR1. PWM PWM PWM sẽ cĩ cùng tần số và tốc độ cập nhật (TMR2 ngắt). PWM Bắt giữ khơng PWM So sánh Khơng. Mơđun CCP1 : Thanh ghi bắt giữ/So sánh/Điều rộng xung (PWM) thứ 1 (CCPR1) gồm hai thanh ghi 8 bit: CCPR1L (byte thấp) và CCP1RH (byte cao). Thanh ghi CCP1CON điều khiển hoạt động của CCP1. Trigger sự kiện đặc biệt được tạo bởi bộ khớp so sánh và sẽ reset timer 1. Mơđun CCP2: Thanh ghi bắt giữ/so sánh/PWM số 2 (CCPR2) gồm cĩ 2 thanh ghi 8 bit: CCPR2L (byte thấp) và CCPR2H (byte cao). Thanh ghi CCP2CON điều khiển hoạt động của CCP2. Trigger sự kiện đặc biệt đượ tạo bởi bộ khớp so sánh và sẽ reset timer 1 và bắt đầu chuyển đổi A/D (nếu mơđun A/D được cho phép). Thanh ghi CCP1CON/ thanh ghi CCP2CON (địa chỉ 17H/ địa chỉ 1DH)
  41. 142 Bit 7 6 5 4 3 2 1 0 - - CCPxX CCPxY CCPxM3 CCPxM2 CCPxM1 CCPxM0 Hình 8.5: Thanh ghi CCP1CON/CCP2CON Bit 7-6: đọc là 0. Bit 5-4: CCPxX:CCPxY: bit trọng số thấp nhất PWM chế độ bắt giữ: khơng dung. chế độ so sánh: khơng dung. chế độ PWM: các bit này là 2 bit LSB của chu kì bổn phận PWM. Tám bit MSB được tìm trong CCPRxL. Bit 3-0: CCPxM3: CCPxM0: bit chọn chế độ CCPx. 0000= bắt giũ/so sánh/PWM bị xĩa (reset mođun CCPx). 0100=chế độ bắt giữ, mỗi cạnh xuống. 0101=chế độ bắt giữ, mỗi cạnh lên. 0110=chế độ bắt giữ, mỗi cạnh lên thứ 4. 0111=chế độ bắt giữ, mỗi cạnh lên thứ 16. 1000=chế độ so sánh, bắt ngõ ra trên khớp (CCPxIF là ’1’). 1001=chế độ so sánh, xĩa ngõ ra trên khớp (CCPxIF=1). 1010=chế độ so sánh, tạo ra ngắt mềm trên khớp (CCPxIF=’1’, chân CCPx là khơng ảnh hưởng). 1011=chế độ so sánh, sự kiện đặc biệt trigger (CCPxIF=’1’, chân CCPx khơng ảnh hưởng); CCP1 reset timer 1, chân CCP2 reset timer 1 và khởi động chuyển đổi A/D. 11xx= chế độ PWM. Chế độ bắt giữ (capture): Trong ch ế đ ộ b ắt gi ữ, TMR1 ch ạy li ên t ục v à đ ư ợc n ạp khi đi ều ki ện v ề ch ân CCPx kh ớp v ới đi ều ki ện ch ỉ ra b ởi CCPxM3: CCPxM0. Khi b ắt gi ữ di ễn ra th ì m ột y êu c ầu n gắt đ ư ợc th ực hi ện.
  42. 143 Hình 8.6: Sơ đồ khối của mạch bắt CCP. Chế độ so sá nh(compare) được dung cho chức năng lặp thời gian hay xác định độ dài của xung PWM. Nếu một xung PWM được đo thời gian , thì khi giá trị khởi động được nạp, cực tính được đảo ngược để tới cuối của xung. Khi đo thời gian xung PWM, clock TMR1 phải đủ nhanh để lấy giá trị cĩ ý nghĩa với độ phân giải đủ cao mà cĩ sự thể hiện chính xác của định thới. Chế độ bắt giữ thay đổi trạng thái của chân CCPx của vi điều khiển PIC khi nội dung của TMR1 khớp giá trị trong các thanh ghi CCPRxH và CCPRxL ở hình 8.7. Chế độ này được dung kích khởi hay điều khiển phần cứng bên ngồi sau một trì hỗn cụ thể. Hình 8.7: Sơ đồ khối của mạch so sánh CCP Hoạt động PWM: Trong ba hoạt động của CCP, tơi thấy tạo tín hiệu PWM là hữu ích. Chế độ này xuất ra xung PWM sử dụng TMR2 khởi động lại (reset) tại một khả năng giá trị cụ thể.
  43. 144 Hình 8.8: Sơ đồ khối mạch tạo PWM CCP. Phương trình sau dung để tính chu kì bổn phận PWm trong thời gian: Chu kì bổn phận PWM=(CCPR1L:CCP1CON )*Tosc*(giá trị tỉ lệ trước ở TMR2) CCPR1L và CCP1CON cĩ thể được ghi tại bất kì lúc nào, nhưng giá trị chu kì bổn phận khơng được cài vào CCPR1H cho tới khi một sự khớp giữa PR2 và TMR2 diễn ra (nghĩa là chu kì hồn thành). Để thiết lập tạo xung PWM tần số 20 Khz cĩ chu kì bổn phận 65% thực hiện trong vi điều khiển PIC cĩ thạch anh 4 Mhz, các bước sau được thực hiện: đầu tiên giá trị CCPRxH và PR2 được tính cho TMR2; bộ chia tỉ lệ trước 4:1 phải được nạp kết quả cho delay là: Delay=(PR2+1)*4/(tầnsố/4) PR2=delay*tần số -1 =5ms* 4 Mhz-1 =200-1 =199 Tiếp đĩ, 65% của 200 là 130 sẽ được nạp vào CCPRxM. Mã tạo ra xung PWM tần số 20 Khz cĩ chu kì bổn phận 65% là: Movlw .199 Movwf PR2; thiết lập hoạt động TMR2 Movlw (1<<TMR2on)+1 Movwf T2CON; bắt đầu nĩ chạy ở chu kì 50 ms. Movlw .130 ;65% của chu kì Movwf CCPRxH Movlw (1<<DCxB1)+0x00F Movwf CCPxCON; bắt đầu PWM ;PWM hoạt động.
  44. 145 Phân số DCXB1-DCXB0 0,00 00 0,25 01 0,50 10 0,75 11 Bảng 8.3: Định nghĩa bit CCP DCXBX (CCPxX:CCPxY). 8.4.MSSP: SPI và I2C. Mơđun port nối tiếp đồng bộ chủ (MSSP) Giới thiệu: Mơđun port nối tiếp đồng bộ chủ là giao tiếp nối tiếp, cĩ ích cho truyền thong với thiết bị vi điều khiển hay ngoại vi khác. Những thiết bị ngoại vi này cĩ thể là EEPROM nối tiếp, thanh ghi dịch, bộ hiển thị, bộ chuyển đổi A/D,vv Mơ đun MSSP cĩ thể hoạt động trong hai chế độ: . Giao tiếp ngọai vi nối tiếp (SPI). . Mạch tích hợp liên kết (I2C) -Chế độ chủ hồn tồn. -Chế độ tớ (với gọi địa chỉ tổng quát). Giao tiếp I2C hỗ trợ các chế độ sau trong phần cứng: .Chế độ chủ. .Chế độ đa (nhiều) chủ. . Chế độ tớ. Thanh ghi điều khiển: Mơđun MSSP cĩ a thanh ghi kết hợp. Chúng bao gồm thanh ghi trạng thái (SSPSTAT) và hai thanh ghi điều khiển (SSPCON và SSPCON2). Việc sử dụng những thanh ghi này và bit cấu hình riêng rẽ khác nhau đáng kể, phụ thuộc vào mơđun MSSP hoạt động ở chế độ SPI hay I2C. Chế độ SPI: Chế độ SPI cho phép 8 bit dữ liệu được phát đồng bộ và nhận đồng thời. Tất cả 4 chế độ của SPI được hỗ trợ. Để hồn thành truyền thơng, ba chân tiêu biểu được dùng: . Dữ liệu ra nối tiếp (SDO)-RC5/SDO. .Dữ liệu vào nối tiếp (SDI)-RC4/SDI/SDA. .Clock nối tiếp (SCK)-RC3/SCK/SCL. Hình 8.9 minh họa sơ đồ khối của mơđun MSSP khi hoạt động ở chế độ SPI:
  45. 146 Hình 8.9: Sơ đồ khối MSSP (chế độ SPI). Chế độ I2C: Mơđun MSSP trong chế độ I 2C hiện thực tất cả chức năng chủ và tớ (bao gồm hỗ trợ gọi tổng quát) và cung cấp các ngắt trên bit Start bà bit Stop để xác định bus trống (chế độ đa chủ). Mơđun MSSP hiện thực đặc tả chuẩn, cũng như địa chỉ 7 bit và 10 bit. Hai chân được dung cho truyền dữ liệu: .Clock nối tiếp (SCL)-RC3/SCK/SCL. .Dữ liệu nối tiếp (SDA)-RC4/SDI/SDA. Sơ đồ khối MSSP ở chế độ I2C được minh họa ở hình 8.10.
  46. 147 Hình 8.10: Sơ đồ khối MSSP (chế độ I2C). a.Thanh ghi: Mơđun MSSP cĩ 6 thanh ghi cho hoạt động I2C. Những thanh ghi này là: . Thanh ghi điều khiển PSSP (SSPCON). .THanh ghi điều khiển MSSP 2 (SSPCON2). .Thanh ghi trạng thái MSSP (SSPSTAT). . Thanh ghi bộ đệm thu/phát nối tiếp (SSPBUF). . Thanh ghi dịch MSSP (SSPSR)-khơng truy xuất trực tiếp. .Thanh ghi địa chỉ MSSP (SSPADD). CCPCON, SSPCON2 và SSPSTAT là các thanh ghi điều khiển và trạng thái trong hoạt động chế độ I2C. Thanh ghi SSPCON và SSPCON2 cĩ thể đọc và ghi được. Sáu bit thấp hơn của SSPSTAT là chỉ đọc. Hai bit cao hơn của SSPSTAT là đọc/ghi được. SSPSR là thanh ghi dịch được dung cho dịch dữ liệu vào hay ra. SSPBUF là thanh ghi bộ đệm mà byte dữ liệu được ghi vào hay đọc từ đĩ. Thanh ghi SSPADD giữ địa chỉ dụng cũ tớ khi SSP được cấu hình trong chế độ tớ I2C. Khi SSP được cấu hình trong chế độ chủ, bảy bit thấp của SSPADD hoạt động như là bộ tạo tốc độ baud nạp lại giá trị. Trong hoạt động nhận, SSPSR và SSPBUF cùng nhau tạo ra bộ thu đệm kép. Khi SSPSR nhận một byte hồn thành, nĩ truyền tới SSPBUF và ngắt SSPIF được bật (=1). Trong quá trình phát, SSPBUF khơng là đệm kép. Việc ghi ra SSPBUF sẽ ghi ra cả SSPBUF và SSPSR. *Thanh ghi SSPSTAT: thanh ghi trạng thái MSSP (chế độ I2C) (địa chỉ 94h).
  47. 148 Bit 7 6 5 4 3 2 1 0 SMP CKE D/A P S R/W UA BF Bit 7 SMP: bit điều khiển tốc độ quét (Slew rate) Trong chế độ tớ hay chủ: 1=điều khiển tốc độ quét bị cấm cho chế độ tốc độ chuẩn (100 Khz hay 1Mhz). 0=điều khiển tốc độ quét được cho phép cho chế độ tốc độ cao (400 Khz). Bit 6 CKE: bit chọn SMBus. Trong chế độ tớ hay chủ: 1=Cho phép ngõ vào cụ thể SMBus. 0=Cấm ngõ vào cụ thể SMBus. Bit 5 D/A: bit dữ liệu/địa chỉ. Trong chế độ chủ: Dự trữ. Trong chế độ tớ: 1=chỉ ra rằng byte cuối được nhận hay truyền là dữ liệu. 0=chỉ ra rằng byte cuối được nhận hay phát là địa chỉ. Bit 4 P: bit dừng. 1=chỉ ra rằng bit dừng (stop bit) đã được dị tìm cuối cùng. 0=bit dừng đã khơng được dị tìm cuối cùng. Bit 3 S: bit bắt đầu (start bit). 1=chỉ ra rằng một bit bắt đầu đã được dị tìm cuối cùng. 0=bit bắt đầu khơng được dị tìm cuối cùng. Bit 2 R/W: thong tin bit đọc /ghi (chỉ ở chế độ I2C). Trong chế độ tớ: 1=đọc 0=ghi Chú ý: bit này giữ thong tin bit R/W theo khớp địa chỉ cuối cùng. Bit này chỉ cịn giá trị từ khớp địa chỉ tới bit bắt đầu kế tiếp, bit dừng hay khơng là bit /ACK. Trong chế độ chủ: 1=phát trong tiến trình. 0=phát khơng trong tiến trình. Chú ý: Việc hoặc logic (OR) bit này với SEN, RSEN, PEN, RCEN hay ACKEN sẽ chỉ ra nếu MSSP là ở chế độ rãnh rỗi. Bit 1 UA: địa chỉ cập nhật (chỉ cĩ chế độ tớ 10 bit). 1=chỉ ra rằng người sử dụng cần cập nhật địa chỉ trong thanh ghi SSPADD. 0=địa chỉ khơng cần được cập nhật. Bit 0 BF: bit trạng thái bộ đệm đầy. Trong chế độ phát: 1=thu hồn thành, SSPBUF đầy. 0=thu khơng hồn thành, SSPBUF trống. Trong chế độ thu: 1=phát dữ liệu đang trong tiến trình (khơng gồm ACk và bit dừng), SSPBUF đầy. 0=phát dữ liệu hồn thành (khơng gồm ACK và bit dừng), SSPBUF trống. *Thanh ghi SSPCON1: thanh ghi điều khiển MSSP 1 (chế độ I2C) (địa chỉ 14h).
  48. 149 Bit 7 6 5 4 3 2 1 0 WCOL SSPOV SSPEN CKP SSPM3 SSPM2 SSPM1 SSPM0 Bit 7 WCOL: bit dị tìm xung đột ghi. Trong chế độ phát chủ: 1=VIệc ghi ra thanh ghi SSPBUF đã được cố gắng trong khi điều kiện I2C khơng cĩ giá trị cho việc phát để bắt đầu. (phải được xĩa bằng phần mềm). 0= Khơng cĩ xung đột. trong chế độ phát tớ: 1=Thanh ghi SSPBUF được ghi trong khi nĩ vẫn cịn phát từ trước đĩ. (phải được xĩa bằng phần mềm). 0=khơng cĩ xung đột. Trong chế độ thu (chế độ chủ hay tớ) Đây là bit tùy ý (1 hay 0 cũng được, khơng quan tâm). Bit 6 SSPOV: bit chỉ thị tràn nhận. Trong chế độ thu: 1=Một byte được nhận trong khi thanh ghi SSPBUF hãy cịn giữ byte trước đĩ. (phải được xĩa bằng phần mềm). 0=khơng cĩ tràn. Trong chế độ phát: Đây là bit “khơng quan tâm” (1 hay 0 cũng được) trong chế độ phát. Bit 5 SSPEN: bit cho phép port nối tiếp đồng bộ. 1= cho phép port nối tiếp và cấu hình chân SDA và SCL như là chân port nối tiếp. 0=cấm port nối tiếp và cấu hình những chân này như chân I/O. Chú ý: khi được cho phép, chân SDA và SCL phải được cấu hình hợp lí như là ngõ vào hay ngõ ra. Bit 4 CKP: bit điều khiển thả SCK. Trong chế độ tớ: 1=thả clock . 0=giữ clock thấp (clock stretch). (được dùng để đảm bảo thời gian thiết lập dữ liệu). Trong chế độ chủ: Khơng dung trong chế độ này. Bit 3-0 SSPM3:SSPM0: bit chọn chế độ port nối tiếp đồng bộ. 1111= chế độ I2C tớ, 10 bit địa chỉ với ngắt bit bắt đầu và bit dừng được cho phép. 1110=chế độ tớ I2C, 7 bit địa chỉ với ngắt bit bắt đầu và bit dừng được cho phép. 1011= chế độ chủ I2C được điều khiển bằng phần dẻo (tớ rãnh rỗi). 1000= chế độ chủ I2C, clock= Fosc/(4*(SSPADD+1)). 0111= chế độ tớ I2C, 10 bit địa chỉ. 0110= chế độ tớ I2C, 7 bit địa chỉ. *Thanh ghi SSPCON2: Thanh ghi điều khiển MSSP 2 (chế độ I2C)( địa chỉ 91h).
  49. 150 Bit 7 6 5 4 3 2 1 0 GCEN ACKSTAT ACKDT ACKEN RCEN PEN ESEN SEN Bit 7 GCEN: bit cho phép gọi tổng quát (chỉ ở chế độ tớ). 1=cho phép ngắt khi một địa chỉ gọi tổng quát (0000h) được nhận trong SSPSR. 0= địa chỉ gọi tổng quát bị cấm. Bit 6 ACKSTAT: bit trạng thái chấp nhận (chỉ ở chế độ phát chủ). 1=sự chấp nhận đã khơng được nhận từ tớ. 0=sự chấp nhận được nhận từ tớ. Bit 5 ACKDT: bit dữ liệu chấp nhận (chỉ ở chế độ nhận chủ). 1=khơng chấp nhận. 0=chấp nhận. Chú ý: giá trị mà sẽ được phát khi người sử dụng khởi động chuỗi chấp nhận ở cuối việc thu. Bit 4 ACKEN: bit cho phép chuỗi chấp nhận (chỉ ở chế độ thu chủ). 1=khởi động chuỗi chấp nhận trên chân SDA và SCL và phát bit dữ liệu ACKDT. 0=chuỗi chấp nhận rãnh rỗi. Bit 3 RCEN: bit cho phép nhận (chỉ ở chế độ chủ). 1=cho phép chế độ nhận cho I2C. 0=nhận rãnh rỗi. Bit 2 PEN : bit cho phép điều kiện dừng (chỉ ở chế độ chủ). 1=khởi động điều kiện dừng trên chân SDA và SCL. Tự động bị xĩa bởi phần mềm. 0=điều kiện dừng rãnh rỗi. Bit 1 RSEN: bit cho phép điều kiện bắt đầu lặp lại (chỉ ở chế độ chủ). 1= khởi động điều kiện bắt đầu lặp lại trên chân SDA và SCL. Tự động bị xĩa bằng phần mềm. 0=điều kiện bắt đầu lặp lại rãnh rỗi. Bit 0 SEN: bit cho phép kép dài/cho phép điều kiện bắt đầu. Trong chế độ chủ: 1=khởi động điều kiện bắt đầu trên chân SDA và SCL. Tự động bị xĩa bằng phần mềm. 0=điều kiện bắt đầu rãnh rỗi. Trong chế độ tớ: 1=kéo dài clock (clock stretching) được cho phép cho cả phát tớ và thu tớ (kéo dài được cho phép). 0=kéo dài clock được cho phép chỉ cho phát tớ (PIC 16F87X ). b. Hoạt động c.Chế độ tớ. . Địa chỉ. .Thu. .Phát. d.Kéo dài clock. e.Hỗ trợ địa chỉ gọi tổng quát f.Chế độ chủ. IV.Tổng kết bài: -Tĩm tắt các ý chính trong bài.
  50. 151 -Chuẩn bị bài mới. V. Câu hỏi và bài tập về nhà: Chương 8: Bộ nhớ dữ liệu EEPROM. So sánh/Bắt giữ/Điều rộng xung. MSSP: SPI và I2C. 1.Bộ nhớ dữ liệu EEPROM là gì? 2. Thanh ghi EECON1, EECON2, EEADR, và EEDATA. 3. Viết chương trình đếm sự kiện số người đi vào tồ nhà. Nút nhấn 1 minh họa quá trình đếm và 8 led trên PORTB hiển thị số đếm ở số nhị phân. Sử dụng bộ nhớ dữ liệu EEPROM. Hình: Mạch đếm nhấn nút. Mở rộng chương trình cho PIC 16F877A. 4.So sánh và bắt giữ là gì? Trình bày So sánh và bắt giữ trong PIC 16F877A. 5.Điều rộng xung PWM là gì? Trình bày PWM trong PIC 16F877A. 6. Viết chương trình điều khiển chuyển mạch biến đổi dần ánh sáng đèn dùng PWM ở PIC 16F877A. 7. MSSP là gì? Trình bày SPI và I2C.
  51. 152 VI. Rút kinh nghiệm: (về thời gian, nội dung, phương pháp, chuẩn bị) Ngày .tháng năm 2011 Ngày .tháng năm 2011 Bộ mơn Giảng viên soạn
  52. 153 Bài giảng số 9: Thiết kế hệ vi xử lí và hệ phát triển vi điều khiển ( Số tiết: 7) I.Ổn định lớp: . II.Kiểm tra bài cũ: III.Tên bài giảng: : Thiết kế hệ vi xử lí và hệ phát triển vi điều khiển III.1. Mục tiêu: -Giới thiệu phần cứng và kit phát triển: giải mã địa chỉ, thiết kế kit vi xử lí gồm kit đơn giản và kit mở rộng, PPI 8255, giao diện RS232C , . - Một số ứng dụng. III.2. Đồ dung và phương tiện dạy học: -Phấn trắng, bảng, khăn, bút long, micro cĩ dây(hay khơng dây), máy tính, và đèn chiếu (hay máy chiếu). III.3. Giáo trình và tài liệu tham khảo: Giáo trình Vi xử lí của trường Đại học cơng nghiệp Tp. HCM. D.W. Smith, PIC in practice: a project-based approach, Elsevier, 2nd edition, 2006. Trương Trác, Chip đơn 16C84 và ứng dụng của chúng. Hồ Trung Mỹ, Vi xử lí, NXB ĐHQG Tp. HCM, 2003. Tài liệu về vi điều khiển PIC của bọ mơn Điện tử cơng nghiệp. Datasheet c ủa PIC 16F84 v à 16F877A. Website: Myke Predko, Programming and customizing the PIC microcontroller, 3rd edition, Tab Electronics, McGrawHill, 2008(Ebook). Douglass V.Hall, Microprocessors and interfacing: Programming and Hardware, 2nd ed., Macmillan/McGraw-Hill, 1992. III.4.Nội dung bài giảng: Nội dung chi tiết : xem bài giảng chi tiết. Phương pháp giảng dạy: thuyết trình, nêu vấn đề và đàm thoại trao đổi với sinh viên. Chương 9: Thiết kế hệ vi xử lí và hệ phát triển vi điều khiển 9.1. GIẢI MÃ ĐỊA CHỈ 9.1.1.Bộ nhớ :
  53. 154 Một vi mạch nhớ thường có cấu trúc tiêu biểu sau : Tín hiệu Tín hiệu dữ liệu Địa chỉ A0 D0 A1 D1 A2 D2 Am Dn /WR WE CS OE Chọn chip /RD Sơ đồ khối một vi mạch nhớ • Nhóm tín hiệu địa chỉ (A1-Am): cho phép xác định ô nhớ cần truy xuất Ví dụ : eprom 2716 có 11 đường địa chỉ từ A0-A10, nên dung lượng bộ nhớ 211= 2x210=2KB • Nhóm tín hiệu dữ liệu cho phépbộ nhớ trao đổi thông tin với bên ngoài (D0-Dn) • Tín hiệu /CS (chip select) : cho phép hoặc không cho phép bộ nhớ hoạt động, thường /CS được nối với ngõ ra của mạch giải mã địa chỉ. /CS=0 : bộ nhớ hoạt động , có thể đọc ghi /CS=1 : bộ nhớ không hoạt động , không thể đọc ghi • Tín hiệu /WE (write enable) : tín hiệu vào tích cực mức thấp, /WE là tín hiệu điều khiển ghi bộ nhớ. Nếu /CS=0 và /WE=0 : thông tin ở D0-Dn được lưu vào ô nhớ có địa chỉ xác định bởi A0-Am • Tín hiệu /OE (output enable) :tín hiệu vào, tích cực mức thấp là tín hiệu điều khiển đọc bộ nhớ Nếu /CS=0 và /OE=0 thì nội dung ô nhớ có địa chỉ xác định bởi A0-Am xuất hiện ở data bus D0-Dn Giới thiệu một số bộ nhớ thường dùng : EPROM : các bộ nhớ eprom thông dụng tồn tại dưới kiểu mạch khác nhau hoặc 27xx. Có các loại mạch sau : 2708 = 1Kx8 bit 2764 = 8Kx8 bit 2716 = 2Kx8bit 27128 = 16Kx8 bit 2732 = 4Kx8bit 27256 = 32Kx8 bit Bộ nhớ Ram tĩnh : TMS 4016 (2Kx8 bit), 6116 (2Kx8 bits) Bộ nhớ Ram động : TMS 4464 (64Kx4 bit) EPROM 2716 / 2732: Bảng hoạt động Giản đồ thời gian chu kỳ đọc ROM Giản đồ thời gian lập trình cho eprom 2716 RAM 6116 : Bảng hoạt động của ram 6116 Giản đồ thời gian chu kỳ đọc ram 6116 Giản đồ thời gian chu kỳ ghi ram
  54. 155 9.1.2.Giải mã địa chỉ : Mỗi vi mạch nhớ đối với CPU cần được CPU xác định chính xác khi thực hiện thao tác đọc ghi, do đó mỗi vi mạch nhớ phải có 1 vùng địa chỉ riêng biệt nằm trong không gian địa chỉ tổng thể của bộ nhớ. Việc gán địa chỉ cụ thể cho mạch nhớ được thực hiện nhờ 1 xung chọn chip lấy từ mạch giải mã địa chỉ. Mạch giải mã địa chỉ là mạch cho phép xác định vùng địa chỉ của các thiết bị nhớ hay ngọai vi trong bản đồ địa chỉ của vi xử lý. Về nguyên tắc, một bộ giải mã địa chỉ có cấu tạo như sau : Tín hiệu địa Mạch giải CS1 chỉ mã địa CS2 chỉ Tín hiệu CSn điều khiển Đầu vào của mạch giải mã địa chỉ là các tín hiệu địa chỉ và các tín hiệu điều khiển, các tín hiệu địa chỉ gồm các bit địa chỉ có quan hệ nhất định với chip select (CS), tín hiệu điều khiển thường là tín hiệu IO/M để giúp CPU phân biệt bộ nhớ hay ngoại vi. Bản đồ bộ nhớ : cho phép phân chia tầm địa chỉ ROM, RAM , I/O, ngắt. Dựa vào bản đồ này ta xây dựng mạch giải mã địa chỉ. Tổ chức bộ nhớ: tỉ lệ ROM/RAM có thể là ½, 1/3, ¼, 1/8, 1/16, 1/32, vv Ví dụ : Chọn bộ nhớ 32 KB gồm 8 KB ROM và 24 KB RAM, thị trường chỉ có 8Kx8 bit. A0 0000h 0000h ROM ROM 8k A12 1FFFh A0 0000h 1FFFh RAM 2000h 1 RAM 1 A12 1FFFh 8k A0 0000h 3FFFh RAM RAM 2 4000h 2 A12 1FFFh 8k A0 0000h 5FFFh RAM 6000h 3 RAM 3 A12 1FFFh 8k 7FFFh Bản đồ bộ nhớ Có 2 phương pháp giải mã địa chỉ :
  55. 156 1-Giải mã toàn phần ( full address decoding) : Mỗi ngoại vi được gán cho một địa chỉ duy nhất. Tất cả các bit địa chỉ được dùng để định nghĩa vị trí được tham chiếu. 2- Giải mã một phần (partial address decoding): Không phải tất cả các bit được dùng cho việc giải mã địa chỉ. Các ngoại vi có thể đáp ứng cho trên một địa chỉ. Phương pháp làm giảm độ phức tạp trong mạch giải mã địa chỉ. Thông thường các hệ thống nhỏ sử dụng giải mã một phần. Mạch giải mã đầy đủ giải mã cho tất cả các đường địa chỉ, mỗi ô nhớ có duy nhất 1 địa chỉ. Cách giải mã này được dùng trong hệthống hoàn chỉnh. Ví dụ : máy tính có RAM 256KB nhưng được giải mã đầy đủ 1MB để khi cần có thể lắp thêmbộ nhớ vào. Mạch giải mã không đầy đủ là mạch giải mã bỏ qua một số đường địa chỉ cao, một ô nhớ có nhiều địa chỉ(về mặt logic), nhưng không thể có 1 địa chỉ chọn nhiều ô nhớ trong mạch giải mã. Mạch giải mã phải mang tính kinh tế và khả thi. 1.Giải mã địa chỉ bằng cổng logic : Ví dụ : Hãy giải mã địa chỉ sao cho eprom 2764 có địa chỉ là A000h-BFFFh A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 A000h . . . . . . . 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 BFFFh địa chỉ không thay đổi địa chỉ thay đổi theotừng IC nhớ đưa vào mạch giải mã đưa vào IC nhớ address bus của A0-A12 data bus của 16F877A 16F877A EPROM 2764 A13 A14 LS00 CE OE CS GND A15 Mạch giải mã đơn giản dùng cổng NAND, địa chỉ A000h-BFFFh Trong mạch giải mã đơn giản cho eprom này, xung chip select sẽ tác động khi ta đọc địa chỉ A000h -> BFFFh, 3 bit địa chỉ phần cao A13=0, A14=0 và A15 =1 được đưa vào cổng NAND để tạo xung chọn vùng nhớ 8KB, đặt tại địa chỉ cao trong không gian địa chỉ của PIC 16F877A. Mỗi ô nhớ cụ thể của vi mạch nhớ eprom 2764 sẽ do các bit thấp còn lạiA0-A12 chọn ra.
  56. 157 2. Giải mã địa chỉ bằng mạch giải mã (decoder) và các cổng logic: Vi mạch 74LS138 : giải mã 3Ỉ8 Chọn A /Y0 các đầu ra của mạch giải mã đầu vào B /Y1 C các đầu vào 74LS138 G2a cho phép G2b G1 /Y7 74LS139: 2 bộ giải mã 2Ỉ 4 Đối với hệ PIC 16F877A nếu ta muốn kết nối nhiều EPROM và/ hoặc nhiều RAM thì cấn phải có mạch giải mã địa chỉ. Thí dụ nếu ta sử dụng các EPROM 8KB và RAM 8KB thì bus địa chỉ phải được giải mã để chọn các IC nhớ theo các vùng 8K : 0000H-1FFFH, 2000H-3FFFH,vv Thường người ta dùng IC giải mã 74LS138 với các ngõ ra của nó nối với các ngõ vào chọn chip trên các IC nhớ. Hình 2. 13 minh họa hệ thống sử dụng các EPROM 8KB 2764 và các RAM 8KB 6264. Chú ý là do có các đường cho phép riêng ( /RD và /WR cho bộ nhớ dữ liệu) nên 16F877A có thể truy cập đến 64KB cho mỗi EPROM và RAM. Ví dụ : Giả thiết trong hệ PIC 16F877A ta cần ghi bộ nhớ 64 KB cho các vi mạch nhớ eprom 8KB(8xIC 2764). Hãy thiết kế mạch giải mã dùng IC 74LS138 để thực hiện. A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000h 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0001h . . . . . . . 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1FFFh 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2000h 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 2001h . . . . . . . 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3FFFh . 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 E000h 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 E001h . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 FFFFh không đổi thay đổi theo từng IC nhớ eprom 2764 A0-A12 Sơ đồ mạch giải mã địa chỉ :
  57. 158 A0-A12 A0-A12 D0-D7 D0-D7 A13 A Y0 CS 1 0v OE A14 B Y1 CS ROM 2 A15 C EPROM1 2764 8K 74LS138 các chân chọn chip cho 7 IC eprom2764 G2a G2b +5V G1 Y7 CS ROM 8 : FE000h-FFFFFh Hình 2.13a Ví dụ : Giả thiết trong hệ PIC 16F877A ta cần đọc ghi bộ nhớ 64 KB cho các vi mạch nhớ RAM 8KB(8xIC 6264). Hãy thiết kế mạch giải mã dùng IC 74LS138 để thực hiện. A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0000h 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0001h . . . . . . . 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1FFFh 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 2000h 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 2001h . . . . . . . 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3FFFh . 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 E000h 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 E001h . . . . . . . 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 FFFFh không đổi thay đổi theo từng IC nhớ RAM 6264 A0-A12 Sơ đồ mạch giải mã địa chỉ :
  58. 159 A0-A12 A0-A12 D0-D7 D0-D7 A13 A Y0 CS 1 RD OE A14 B Y1 CS 2 WR WE A15 C RAM 1 6264 8K 74LS138 các chân chọn chip cho 7 IC RAM 6264 G2a G2b +5V G1 Y7 CS RAM 8 : FE000h-FFFFFh Hình 2.13b Ví dụ : Thiết kế mạch giải mã địa chỉ 12KB bộ nhớ , trong đó 1 ROM 2KB + 1 SRAM 4KB + 3 SRAM 2KB Bản đồ bộ nhớ : 0000h Ỉ2FFFh 0000h ROM 2K 07FFh A11 A /Y0 CSrom 0800h RAM 1, A12 B /Y1 CSram1 2K A13 C /Y2 CSram2 0FFFh A14 G2a /Y3 CSram 3 1000h A15 G2b /Y4 RAM 2, /Y5 CSram4 2K 17FFh +5V G1 /Y6 /Y7 1800h RAM 3, 2K 1FFFh 2000h RAM 4, 2FFFh 4K 9.2. Thiết kế kit vi xử lý 9.2.1.Thiết bị phát triển dùng vi xử lý: Ta trình bày vài phương pháp phát triển và hiệu chỉnh chương trình trước khi nạp nó vào PROM. Phân phối bộ nhớ điển hình của máy vi tính thông thường (hình 1) Phân phối bộ nhớ trong thiết bị phát triển dùng máy vi tính cho trên hình 2.
  59. 160 Địa chỉ Bộ nhớ FFFFH Địa chỉ khởi động lại Khởi động lại Địa chỉ ngắt Chương trình của người sử dụng (PROM) . . . Thiết bị vào ra của người sử dụng Con trỏ ngăn xếp Ngăn xếp của người sử dụng Số liệu của người sử dụng 0000H Hình 1 : Máy vi tính thông thường Hệ thống monitor bao gồm 1 vùng ROM để chứa chương trình service, một vùng RAM để chứa tạm thời thông tin và chương trình vào/ra. Thành phần quan trọng nhất của chương trình hướng dẫn là chương trình vào ra thông tin. + Chương trình vào. + Chương trình đọc. + Chỉ thị nội dung ô nhớ +Ghi số liệu vào ô nhớ. Phân phối bộ nhớ trong thiết bị phát triển dùng máy vi tính cho trên hình 2. Địa chỉ Bộ nhớ
  60. 161 FFFFH Địa chỉ khởi động lại Chuyển mạch Địa chỉ ngắt Khởi động lại Chương trình của người sử dụng (RAM) . . Khởi động lại Monitor . Chương trình hướng dẫn (Monitor ROM) Con trỏ ngăn xếpcủa Ngăn xếp của monitor Monitor RAM của monitor Vào ra của monitor Con trỏ ngăn xếp Thiết bị vào ra của người sử dụng Ngăn xếp của người sử dụng 0000H Số liệu của người sử dụng (RAM) Hình 2 : Thiết bị phát triển dùng máy vi tính F C 0 0 8 E Hình 3 :Chỉ thị sau khi gọi địa chỉ ô nhớ FC00H và đưa vào số 8E 9.1.2. Hệ thống phát triển vi xử lý: Bộ nhớ đĩa Thiết bị phát triển Máy lập trình để Vào ra dùng máyvitính nạp chương trình vào rom Hình 4: Cấu trúc của một hệ phát triển Ngôn ngữ Assembly và trình biên dịch Assembler: MPLAB, CCS C
  61. 162 Kit vi xử lý đơn giản Mạch điện tối thiểu dùng với PIC 16F877A Hình 5: Hệ thống tối thiểu Kit vi xử lý mở rộng Một ví dụ thiết kế kit vi xử lý: gồm CPU 16F877A, EPROM 8KB, RAM 8KB có tầm địa chỉ , 8255 ROM : 0000H-1FFFH, RAM : 2000H-3FFFH 8255: 4000h-5FFFh (chỉ dung 4000h-4003h) Phương pháp thiết kế : 1/ Thiết kế mạch nguồn 2/Thiết kế clock 3/Mạch Reset 4/Thiết kế mạch giải mã 5/Sơ đồ kit vi xử lý 3.1.3.Sơ đồ Kit vi điều khiển:
  62. 163 Hình 6: Hệ phát triển vi điều khiển PIC 16F877A. (Tham khảo: Sạp N6 , chợ Điện tử Nhật Tảo, Nguyễn Kim, Quận 10, Tp. HCM). Kit ph át tri ển c ủa t ác gi ả D. W. Smith t ại website:
  63. 164 Hình 7 : Kit phát triển vi điều khiển PIC (Tham khảo trong sách [1]). 9.3. PPI 8255 8255 có 3 cổng song song A, B, C, mỗi cổng 8 bit, thường được chia ra : A : 8 bit , PA0-PA7 B : 8 bit , PB0-PB7 CL : 4 bit , PC0-PC3 CH : 4 bit, PC4-PC7 Có 3 mode (chế độ hoạt động ) -mode 0 : xuất nhập đơn giản dùng A,B,C -mode 1 : xuất nhập có điều kiện -mode 2: là bus 2 chiều (dùng A) 9.3.1.Tổng quát : Cấu trúc khối của 8255 a.Bộ đệm truyền dữ liệu : bộ đệm 8 bit, 2 chiều , 3 trạng thái dùng để giao tiếp 8255 với CPU. Dữ kiện được phát hay nhận bởi bộ đệm khi thực hiện lệnh IN, OUT bởi CPU. Các từ điều khiển cũng truyền qua dữ kiện b.Phần kiểm soát đọc/ghi : chức năng của khối này là kiểm soát tất cả các sự truyền đạt bên trong và ngoài của từ điều khiển và dữ kiện. Nó nhận ngõ vào từ tuyến địa chỉ và điều khiển của CPU, phát ra các lệnh cần thiết cho cả 2 nhóm điều khiển A và B.
  64. 165 /CS : ngõ vào =0 cho phép truyền tin giữa 8255 và CPU //RD: =0 cho phép 8255 gởi dữ kiện đến CPU trên tuyến dữ kiện chủ yếu là cho phép CPU đọc dữ kiện từ 8255 WR : =0 CPU xuất từ điều khiển hay dữ liệu ra 8255 A0 và A1 : để chọn cổng A,B,C A1 A0 chọn cửa 0 0 port a 0 1 port b 1 0 port c 1 1 từ điều khiển RESET : =1 xóa tất cả các thanh ghi bên trong gồm thanh ghi điều khiển và các cổng A,B,C ở mode nhận. c.Điều khiển nhóm A và B Cấu hình hoạt động của mỗi nhóm được lập trình bởi phần mềm, chủ yếu là, CPU xuất từ điều khiển đến 8255. Từ điều khiển gồm các thông tin như chế độ (mode), bit set, bit reset, vv sẽ khởi động cấu hình hoạt động của 8255. Thanh ghi từ điều khiển chỉ có thể viết vào mà không thể đọc ra. d.Các cửa (port) A, B, C : 8255 gồm 3 cổng A, B, C. Mỗi cổng gồm 8 bit. Các cổng này có thể lập trình bởi phần mềm để có thể hoạt động ở chế độ thích hợp. Cổng A : gồm bộ đệm, cài ngõ ra 8 bit và cài ngõ vào 8 bit. Cổng B : gồm bộ đệm, cài ngõ ra 8 bit và cài ngõ vào 8 bit. Cổng C : đệm và cài ngõ ra 8 bit và đệm 8 bit ngõ vào (không cài). Cửa C có thể chia làm 2 phần, mỗi phần 4 bits cho điều khiển mode. Mỗi phần được dùng kết hợp với cửa A hay B để tạo nên các tín hiệu điều khiển.
  65. 166 Port Điều A PA0-PA7 khiển nhóm 1 (group A) CH PC4-PC7 D0-D7 Đệm dữ liệu CL PPC0-PC3 Giao RD Điều khiển Tiếp WR đọc ghi Điều A1 khiển Port A0 nhóm 2 B (group B) Reset PB0-PB7 CS Hình 8: Sơ đồ khối của 8255 Bảng làm việc của 8255 A1 A0 /RD /WR /CS Hoạt động Nhập 0 0 0 1 0 A data bus 0 1 0 1 0 B data bus 1 0 0 1 0 C data bus Xuất 0 0 1 0 0 data bus A 0 1 1 0 0 data bus B 1 0 1 0 0 data bus C 1 1 1 0 0 data bus từ điều khiển 1 1 0 1 0 tổng trở cao x x x x 1 của data bus 9.3.2.Mô tả chi tiết a.Lập trình xuất nhập để chọn chế độ (Mode) : Có ba chế độ hoạt động cơ bản thiết lập do phần mềm :
  66. 167 Mode 0 : vào ra cơ bản Mode 1 : vào ra bắt tay (chỉ cho phép 1 trong 2 chiều) Mode 2: truyền dữ liệu 2 chiều Khi reset, tất cả các cổng được thiết lập ở chế độ nhập (input), tức là cả 24 đường đều ở 3 trạng thái.Sau khi reset, 8255 có thể duy trì ở chế độ nhập mà không cần khởi động gì thêm. Trong khi thực hiện chương trình hệ thống, có thể chọn bất kì mode nào bằng cách xuất đến 8255 từ điều khiển. Điều này cho phép chỉ cần 1 8255 mà có thể phục vụ nhiều kiểu thiết bị ngoại vi. Các chế độ của cổng A và B có thể định nghĩa riêng biệt. Còn cổng C được chia làm 2 phần cho 2 nhóm tùy yêu cầu định nghĩa chế độ cổng A và B. Ta có từ điều khiển cho 8255 như sau : Control word : D7 D6 D5 D4 D3 D2 D1 D0 Nhóm B Mode set flag Port C 1 : in 1= (phần thấp) 0 : out active port B 1 : in 0 : out Chọn chế độ 0 : mode 0 1 : mode 1 Nhóm A Port C (phần cao) : 1 : in 0 : out port A : 1 : in 0 : out Chọn mode 00 : mode 0 01 : mode 1 1x : mode 2 Ví dụ : 8255 ở mode 0, port A là nhập, port B,C xuất. Từ điều khiển : 100100002= 90h Khi CS=0 8255 được chọn thì port A có địa chỉ 300h Port B có địa chỉ 301h Port C có địa chỉ 302h Từ điều khiển : 303h Lệnh xuất nhập : Out &h303, &h90 ; xuất 90h ra từ điều khiển Out &h301, &hFF ; xuất FFh ra cổng B Inp (&h300) ; nhập số liệu từ cổng A Mov dx, 301h Out dx, 0ffh Mov dx, 300h In ax, dx
  67. 168 b.Đặc tính xóa/thiết lập bit cho cửa C khi nó dùng làm tín hiệu trạng thái/điều khiển cho cửa A/B : Ta dùng lệnh OUT xuất ra từ điều khiển trong đó bit D7=0 Khi chọn mode 2 cho port A, các bit D3, D4, D5 không còn ý nghĩa nữa. Lúc đó port A là 2 chiều, còn phần cao của C sẽ làm tín hiệu điều khiển và trạng thái cho port A Ở mode 1 : CH điều khiển cổng A, còn CL điều khiển cổng B. Khi giao tiếp thiết bị ngoại vi, cổng C làm việc ở chế độ dạng bit. Bit set và reset flag, phần còn lại của từ điều khiển có ý nghĩa như sau : D7 D6 D5 D4 D3 D2 D1 D0 X x x Bit set/reset Bit set/reset flag 0 : reset 0=active 1 : reset Bit select 0 1 0 1 0 1 0 1 0 0 1 1 0 0 1 1 0 0 0 0 1 1 1 1 Mỗi lần xuất ra 1 từ điều khiển đến 8255 với D7=0, chỉ tác động đến chỉ 1 bit của port C( được chọn bởi bit select) c.Chức năng kiểm soát ngắt quãng Khi 8255 được lập trình ở mode 1 hay 2, các tín hiệu điều khiển được cung cấpcó thể được dùng để yêu cầu ngắt quảng CPU. Tín hiệu yêu cầu ngắt quảng phát ra từ port C có thể bị cấm hay cho phépbằng cách set hay reset flip-flop INTE tương ứng, dùng chức năng set/reset bit của port C. Chức năng này cho phép CPU cấm hay cho phép các thiết bị I/O đã xác định ngắt quảng CPU mà không làm ảnh hưởng các thiết bị khác trong cấu trúc ngắt quảng. 9.3.3.Các chế độ hoạt động a.Mode 0 : Vào/ra cơ bản , đơn giản Không có bắt tay, dữ liệu được ghi và đọc 1 cách đơn giản đến hay từ 1 cửa đã chỉ ra. Các đặc tính cơ bản ở mode 0 : .2 cổng 8 bit và 2 cổng 4 bit .Bất kì cổng nào cũng có thể là ra hay vào .Ngõ ra được cài .Cho phép 16 dạng vào/ra ở mode Ví dụ : từ điều khiển 83h xác định port A ra, B vào Phần cao của C : ra, phần thấp của C : vào b.Mode 1 : Vào/ra có bắt tay, dùng cho port A, port B
  68. 169 Ở mode 1, cổng A và B dùng những đường ở cửa C để phát hay nhận các tín hiệu bắt tay. A và B xuất nhập có điều kiện. *Ở chế độ nhập : -STB (strobe input) ngõ vào, =0 :cài dữ liệu vào 8255 -IBF (input buffer full) ngõ ra, =1 :đã có dữ liệu, thông báo cho biết vùng đệm đã đầy. Nói cách khác, mức thấp của STB sẽ thiết lập IBF=1, và IBF bị xóa bởi cạnh lên của RD. -INTR (interrupt request) :ngõ ra = 1 để yêu cầu ngắt quảng CPU.INTR được set bởi STb=1 và IBF=1, INTE=1 -INTR bị reset bởi cạnh xuống của RD -INTE A kiểm soát bởi bit set/reset PC4 -INTE B kiểm soát bởi bit set/reset PC2 *Cổng B : STBB=PC2 (input) IBF = PC1 INTR = PC0 INTEB = PC2 (output) Cổng A PA0-PA7 INTEA PC4 STBa PC5 IBF PC3 INTR a về CPU RD I/O PC6,7 INTE a=PC4 (xoá/lập bit) *Ở chế độ xuất : -OBF (output buffer full) :ngõ ra, =0 đã có dữ liệu(được set bởi cạnh lên của xung WR từ CPU) báo là CPU vừa xuất 1 byte ra cổng đó, và bị reset bởi ACK=0 do ngoại vi (tức là ở mức không tích cực) -ACK (Acknowledge input) :=0 đã lấy dữ liệu, thông báo cho 8255 biết thông tin từ A hay B đã nhận bởi ngoại vi. -INTR (interrupt request) : mức 1 ở ngõ ra dùng để yêu cầu ngắt quảng CPU khi ngoại vi đã nhận dữ liệu phát bởi CPU. INTR được set bởi ACK=1 và OBF=1, INTE=1 -INTR bị xóa bởi cạnh xuống của xung WR -INTE A kiểm soát bởi bit set/reset PC6 -INTE B kiểm soát bởi bit set/reset PC2 *Cổng B : OBFB=PC1
  69. 170 ACK = PC2 INTR = PC0 INTEB = PC2 Cổng A PA0-PA7 PA0-PA7 PC7 OBFa INTEa PC6 ACKa PC3 INTR a WR I/O PC4 5 INTE a =PC6 (xoá / lập bit) c.Mode 2 : Xuất nhập tuyến 2 chiều, bắt tay Các đặc tính cơ bản của mode 2: . Chỉ dùng cho nhóm A . 1 cửa 2 chiều 8 bit (A) và 1 cổng điều khiển 5 bit (C) cho cổng A . Cả ra/vào đều có cài Cổng A PA0-PA7 PA0-PA7 PC3 INTRa PC7 OBFa INTE1PC6 ACKa WR PC4 STBa RD INTE2 IBFa PC5 Từ điều khiển : 1 1 x x x 1/0 1/0 1/0 PC2-0 0 :in 1 : out Port B 0: in 1 : out Group B Mode 0 : mode 0 1 : mode 1 Định nghĩa các tín hiệu điều khiển xuất nhập 2 chiều : *INTR (interrupt request) Mức 1 ở ngõ ra này báo cho CPU biết yêu cầu ngắt quảng cho phép nhập hay xuất (chung)
  70. 171 *Phép xuất : -OBF (output buffer ful) output OBF xuống 0 để báo cho ngoại vi biết CPU đã ghi dữ liệu ra cửa A -ACK (acknowledge) input Mức 0 từ ngoại vi cho phép bộ đệm ra 3 trạng thái của cửa A mở để phát dữ liệu, ngược lại, bộ đệm ra ở 3 trạng thái -INTE 1 (INTE F-F liên quan với OBF) Kiểm soát bởi bit set/reset PC6 *Phép nhập : -STB : mức thấp ở ngõ vào này cài data vào mạch cài ngõ nhập -IBF (input buffer full) output Mức 1 thông báo cho CPU biết dữ liệu đã nạp vào mạch cài nhập -INTE 2 (liên quan với IBF) Kiểm soát bởi bit set/reset PC4 Kết hợp mode 2 và các mode khác : Mode 2 và mode 0 (in) : từ điều khiển : 1 1 x x x 0 1 1/0 Mode 2 và mode 0 (out) : từ điều khiển : 1 1 x x x 0 0 1/0 Mode 2 và mode 1 (in) : từ điều khiển : 1 1 x x x 1 1 x Mode 2 và mode 1 (out) : từ điều khiển : 1 1 x x x 1 0 x Sự kết hợp các mode đặc biệt : Có 1 số tổ hợp các mode mà không phải tất cả cửa C đều dùng làm điều khiển hay trạng thái. Các bit còn lại được dùng như sau : Nếu lập trình là ngõ vào : Tất cả các ngõ vào được truy xuất qua phép đọc cửa C bình thường Nếu lập trình là ngõ ra : Các bit ở phần cao cửa C (C4-C7) phải được truy xuất riêng rẽ dùng chức năng bit set/reset Các bit ở phần thấp cửa C(C0-C3) có thể truy xuất dùng chức năng bit set/reset như nhóm 3 bằng cách ghi ra cửa C Đọc trạng thái port C : Ở mode 0, port C truyền dữ liệu đến hay từ ngoại vi khi 8255 được lập trình ở mode 1 hay mode 2, cửa C trở nên các tín hiệu điều khiển bắt tay cho port A hay B Đọc nội dung cửa C cho phép người lập trình kiểm tra trạng thái của mỗi thiết bị ngoại vi và thay đổi chiều chương trình tương ứng Không có lệnh đặc biệt để đọc thông tin trạng thái từ C. Phép đọc bình thường port C dùng để thực hiện chức năng này Ta có dạng từ trạng thái mode 1 : D7 D6 D5 D4 D3 D2 D1 D0 I/O I/O IBFa INTEa INTRa INTEb IBFb INTRb Nhóm A Nhóm B Mode 1 (input)