intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Vi xử lý: Phần 2 - Đại học Công nghiệp TP. HCM

Chia sẻ: ảnh ảo | Ngày: | Loại File: PDF | Số trang:99

102
lượt xem
12
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

(NB) Nối tiếp nội dung của phần 1 tập bài giảng Vi xử lý, phần 2 trình bày nội dung của các bài giảng sau: Truyền thông nối tiếp USART, ngắt, bộ chuyển đổi tương tự sang số (ADC), bộ nhớ dữ liệu EEPROM, PWM, SPI/I C, thiết kế hệ vi xử lí và hệ phát triển vi điều khiển. Mời các bạn cùng tham khảo nội dung chi tiết.

Chủ đề:
Lưu

Nội dung Text: Bài giảng Vi xử lý: Phần 2 - Đại học Công nghiệp TP. HCM

  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: http://www.microchip.com/ http://www.alldatasheet.com/ 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 hoá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 soá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 1001011010 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 ngoà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 hoà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 soá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 hoà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, xoá 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 hoà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, xoá 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 ngoà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ụ ngoà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à thoá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 soát lỗi BTFSC RCSTA,FERR; kiểm tra lỗi khung Goto FrameErr; bộ kiểm soá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 soá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. 112
  14. 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: http://www.microchip.com/ http://www.alldatasheet.com/ 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 ngoà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
  15. 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 hoàn thành. 16F877A có 15 nguồn ngắt. Ngoài 4 nguồn ngắt nêu trên, các ngắt them vào là: . Chuyển đổi A/D hoà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 toà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 toà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 toà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ẽ xoá 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 hoà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 ngoà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.
  16. 115 0=TMR0 không tràn. Bit này phải được xoá 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, thoá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 toà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
  17. 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 toà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
  18. 117 MOVLW 0FFh MOVWF PORTB; bật tất cả ngõ ra CALL DELAY1; trì hoãn 1 giây MOVLW 0 MOVWF PORTB; tắt tất cả ngõ ra CALL DELAY1 ; trì hoãn 1 giây MOVLW 0FFh MOVWF PORTB;bật tất cả ngõ ra CALL DELAY1; trì hoãn 1 giây MOVLW 0 MOVWF PORTB;tắt tất cả ngõ ra CALL DELAY1; trì hoã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 toà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ị xoá, 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 toà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ì hoã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)
  19. 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 toà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ì hoã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ì hoãn NOP RETLW 0; trở về sau khi time là 3 ;trì hoãn 5 giây. DELAY5 MOVLW .50 MOVWF COUNTA
  20. 119 LOOPC CALL DELAYP1 DECFSZ COUNTA GOTO LOOPC RETLW 0 ;trì hoã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ì hoãn 1 giây MOVLW 0 MOVWF PORTB; tắt tất cả ngõ ra CALL DELAY1 ; trì hoãn 1 giây MOVLW 0FFh MOVWF PORTB;bật tất cả ngõ ra CALL DELAY1; trì hoãn 1 giây MOVLW 0 MOVWF PORTB;tắt tất cả ngõ ra CALL DELAY1; trì hoã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)
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
4=>1