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

Sử dụng các module UART và I2C của dsPIC

Chia sẻ: Vu Son | Ngày: | Loại File: PDF | Số trang:5

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

Đây là tutorial 4 về lập trình với dsPIC. Tutorial này hướng dẫn cách sử dụng module UART và I2C của dsPIC, là những module ngoại vi có sẵn trong các chip dsPIC. Các ví dụ được viết bằng hợp ngữ và ngôn ngữ C (dùng trình dịch C30 Compiler của Microchip), và trong đa số trường hợp hai phiên bản hợp ngữ và C30 là hoàn toàn tương đương.

Chủ đề:
Lưu

Nội dung Text: Sử dụng các module UART và I2C của dsPIC

  1. Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 1/5 Tutorial no 05.01 Gửi đến: Đoàn Hiệp, www.picvietnam.com Nội dung: Sử dụng các module UART và I2C của dsPIC MICROSOFT WORD Tóm tắt: Đây là tutorial 4 về lập trình với dsPIC. Tutorial này hướng dẫn cách sử dụng module UART và I2C của dsPIC, là những module ngoại vi có sẵn trong các chip dsPIC. Các ví dụ được viết bằng hợp ngữ và ngôn ngữ C (dùng trình dịch C30 Compiler của Microchip), và trong đa số trường hợp hai phiên bản hợp ngữ và C30 là hoàn toàn tương đương. 1. Giới thiệu Tutorial này giới thiệu các module UART và I2C của dsPIC. Cách thiết lập module UART, cách phát và thu thông tin được đề cập. Một số thông tin về ngắt cho module UART và bộ đệm FIFO 4 mức cũng được nêu ra. Cách dùng module I2C ở chế độ Master được giới thiệu ở đây, thông qua một ví dụ giao tiếp với một vi mạch đồng hồ thời gian thực (DS1307). Các chương trình con để ghi, đọc từ bus I2C có thể được dùng để xây dựng các chương trình khác nhau. 2. Các quy ước trong tài liệu Mô tả Biểu thị Ví dụ Font Palatino Linotype: dsPIC30F/33F In nghiêng Tài liệu tham khảo Programmer’s Reference Manual Viết hoa chữ đầu Một menu, hộp thoại Chọn Project Wizard Tên riêng (của tập tin, Đặt trong dấu nháy kép “Vidu3” project, …) Font Courier: Mã nguồn mov #0x8010, W0 Courier thường Tên tập tin Vidu3-1.s
  2. Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 2/5 3. Các ví dụ về module UART và I2C Bạn hãy chép các tập tin nguồn được đính kèm vào một thư mục nào đó mà bạn sẽ dùng để tạo ra project “Vidu4”. Với hai ví dụ 4-1 và 4-2, chúng ta chỉ sử dụng các chân giao tiếp chính (main I/O) của module UART1, do đó sơ đồ nguyên lý không được thể hiện ở đây (vì khá đơn giản). Phần cứng cho hai ví dụ này chỉ dùng thêm một chip RS- 232 transceiver (MAX232 hay tương đương) để nối dsPIC với máy tính. Nếu chỉ nối các chip với nhau thì chúng ta có thể bỏ qua transceiver. 3.1. Ví dụ 4-1 Làm theo các bước như trong tutorial 1 để tạo ra một project có tên là “Vidu4”, sau đó bạn thêm vào project tập tin nguồn “Vidu4-1.s” và kịch bản liên kết “p30f4012.gld” cho trường hợp dùng hợp ngữ. Đối với trường hợp dùng C30, chúng ta cũng tạo một project theo cách tương tự, chỉ khác là chúng ta sẽ chọn “Microchip C30 Toolsuite” ở bước 2, và tập tin nguồn được sử dụng là “Vidu4-1.c”. Để sử dụng module UART1 (hay UART2), bạn cần khởi tạo ít nhất các thanh ghi sau: – U1MODE (hay U2MODE): thanh ghi đặt chế độ giao tiếp, với các tham số chọn vị trí chân giao tiếp, số bit thông tin, số bit parity, và số stop bit – U1STA (hay U2STA): thanh ghi trạng thái, nhưng có chứa một số cờ như UTXEN để cho phép phát ký tự – U1BRG (hay U2BRG): thanh ghi đếm tạo tốc độ baud, với giá trị được tính theo công thức sau: Fcy UxBRG = −1 Baud × 16 với: x là chỉ số của module (x = 1 hay 2), Fcy là tần số thực thi lệnh (= tần số xung clock/4 với các dsPIC30F), và Baud là tốc độ baud cần thiết. Nếu muốn sử dụng ngắt, chúng ta cần khởi tạo thêm cờ ngắt, cờ cho phép ngắt, độ ưu tiên ngắt (nếu cần thiết). Cần chú ý là dsPIC hỗ trợ ngắt khi thu (receive) và ngắt khi phát (transmit) một cách độc lập cho từng module UART. Do đó, lấy ví dụ một chip dsPIC có hai module UART1 và UART2, chip sẽ có 4 vectơ ngắt riêng biệt cho trường hợp thu hay phát của module UART1 cũng như thu hay phát của module UART2. Và các cờ ngắt, cờ cho phép ngắt, cũng như các bit thiết lập độ ưu tiên ngắt cũng tồn tại một cách tương ứng cho mỗi vectơ ngắt. Bạn tham khảo tài liệu dsPIC Family Reference Manual (DS70046 – phiên bản hiện tại là DS70046E) và datasheet của chip cụ thể để có thêm thông tin về việc sử dụng ngắt với các module UART.
  3. Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 3/5 Để phát thông tin ra bằng module UART, bạn chỉ cần ghi vào thanh ghi U1TXREG (hay U2TXREG), với điều kiện tất nhiên là chúng ta đã khởi tạo cho chế độ phát. Chú ý là module UART của dsPIC có bộ đệm phát 4 mức, do đó bạn có thể ghi liên tiếp 5 ký tự mà vẫn không làm tràn bộ đệm phát ở lần phát ký tự đầu tiên (vì ngoài bộ đệm phát còn có thanh ghi dịch khi phát, đang còn trống). Mặc dù khả năng này của module UART không được dùng trong các ví dụ, nhưng bạn cần hiểu rằng điều này là có thể đối với dsPIC. Chú ý: Khi dùng chế độ phát, bit UTXEN (trong thanh ghi UxSTA) chỉ nên được bật khi đã bật bit UARTEN (trong thanh ghi UxMODE). Tương tự như vậy, bạn đọc từ thanh ghi U1RXREG (hay U2RXREG) để lấy ký tự đã được module UART nhận từ bên ngoài, tất nhiên là chúng ta đã khởi tạo đầy đủ cho chế độ thu. Bộ đệm thu cũng có 4 mức, và bạn có thể thiết lập để module UART chỉ tạo ra ngắt khi có đủ 4 ký tự ở bộ đệm (điều này giúp làm giảm số lần vào ngắt thu). Ví dụ 4-1 chỉ thực hiện một việc đơn giản là xuất chuỗi ký tự “Xin chao! ” ra cổng RS-232 sau mỗi giây. Chuỗi ký tự dùng định dạng ASCIIZ, tức là chuỗi các ký tự ASCII kết thúc bằng giá trị 0. Chương trình khá trực quan và đã được chú thích đầy đủ, do đó không cần giải thích thêm ở đây. 3.2. Ví dụ 4-2 Thực hiện các thao tác tương tự như trong tutorial 2, bạn hãy loại bỏ tập tin “Vidu4-1.s” khỏi project, và thêm tập tin “Vidu4-2.s” vào project (với project viết bằng C30 thì bạn sẽ thay “Vidu4-1.c” bằng “Vidu4-2.c”). Ví dụ này cũng thực hiện một việc khá đơn giản là đọc ký tự qua cổng RS-232, sau đó cộng thêm 1 vào mã của ký tự đã nhận và gửi trả về nơi phát qua cổng RS-232. 3.3. Ví dụ 4-3 Bạn hãy loại bỏ tập tin “Vidu4-2.s” khỏi project, và thêm vào project tập tin “Vidu4-3.s” (hay thay “Vidu4-2.c” bằng “Vidu4-3.c” đối với phiên bản C30). Sơ đồ nguyên lý dùng cho ví dụ này và ví dụ 4-4 dưới đây được thể hiện ở hình 3.1. Chúng ta làm quen với module I2C của dsPIC thông qua việc thiết lập các tham số cho một vi mạch đồng hồ thời gian thực (RTC-Real-Time Clock), cụ thể là DS1307. Ví dụ 4-3 chỉ thực hiện việc khởi tạo các tham số cần thiết cho DS1307, tuy nhiên các chương trình con cần thiết cho việc giao tiếp ở chế độ Master dùng module I2C đều được thực hiện đầy đủ ở đây.
  4. Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 4/5 Vdd Vdd R1 33k U1 R2 4.7k 9 10 CLKIN/OSC1 26 R3 4.7k X1 RC15/CLKO/OSC2 RE0/PWM1L 1 25 MCLR RE1/PWM1H 24 R4 4.7k RE2/PWM2L 2 23 RB0/CN2/VREF+/AN0/EMUD3 RE3/PWM2H C3 3 22 U2 8 8MHz RB1/CN3/VREF-/AN1/EMUC3 RE4/PWM3L C2 4 RB2/CN4/SS1/AN2 RE5/PWM3H 21 X2 C1 5 16 7 1 VCC RB3/CN5/INDX/AN3 FLT A/INT 0/RE8 SQW/OUT X1 32kHz 33pF 33pF 3 1u 1 U3 6 RB4/CN6/IC7/QEA/AN4 7 5 2 RB5/CN7/IC8/QEB/AN5 SDA X2 18 C1- C1+ RF2/SDA/SDI1/U1RX/EMUC/PGC GND 17 6 3 RF3/SCL/SDO1/U1T X/EMUD/PGD SCL VBAT 14 11 11 Chan 2 T 1OUT T 1IN RC13/CN1/U1ATX/T 2CK/SOSCI/EMUD Vdd 13 12 12 Chan 3 R1IN R1OUT RC14/CN0/U1ARX/T 1CK/SOSCO/EMUC 4 7 10 DS1307 T 2OUT T 2IN 8 9 15 28 R2IN R2OUT EMUC2/OC1/IC1/INT 1/RD0 AVDD C5 14 EMUD2/OC2/IC2/INT 2/RD1 AVSS 27 2 VS+ 6 DSPIC30F4012DIP VS- 1u C2- C2+ Vdd C6 1u 5 C4 4 MAX232 1u Hình 3.1: Sơ đồ nguyên lý phần cứng dùng cho các ví dụ 4-3 và 4-4 Để sử dụng module I2C của dsPIC ở chế độ Master, chúng ta thiết lập các thanh ghi: – I2CCON: thanh ghi điều khiển module, thường chỉ cần quan tâm đến các bit I2CEN (bật/tắt module) và DISSLW (tắt/bật bộ điều khiển slew rate) – I2CBRG: thanh ghi đếm tạo tốc độ baud, với giá trị được tính theo công thức sau:  Fcy Fcy  I 2CBRG =  −  −1  Baud 1111111 với: Fcy là tần số thực thi lệnh (= tần số xung clock/4 với các dsPIC30F) và Baud là tốc độ baud cần thiết. Điều cần chú ý là sau mỗi hoạt động của module, như tạo điều kiện START, STOP hay xuất dữ liệu ra bus I2C, chúng ta đều phải chờ cho phần cứng hoàn tất hoạt động, và nếu cần thì kiểm tra trạng thái ACK/NACK trước khi thực hiện thao tác tiếp theo. Mã nguồn chương trình đã chú thích khá chi tiết, do đó không cần giải thích thêm ở đây. Khi chạy thử chương trình, nếu không có lỗi gì đối với DS1307, sẽ có xung 1 Hz ở ngõ ra SQW/OUT. Nếu có lỗi thì chân RE0 sẽ ở mức 0, ngược lại thì RE0 sẽ ở mức 1. 3.4. Ví dụ 4-4 Bạn hãy loại bỏ tập tin “Vidu4-3.s” khỏi project, và thêm vào project tập tin “Vidu4-4.s” (hay thay “Vidu4-3.c” bằng “Vidu4-4.c” đối với phiên bản C30). Trong ví dụ này, các chân của module I2C được dùng chung với các chân I/O chính của module UART1 của dsPIC, do đó chúng ta sẽ dùng các chân thay thế của module UART1 để thực hiện giao tiếp RS-232. dsPIC sẽ khởi tạo DS1307, sau đó đọc giá trị thời gian sau mỗi 11 giây, và gửi thông tin về thời gian ở dạng chuỗi ký tự ra cổng RS-232.
  5. Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 5/5 Chúng ta sử dụng cờ flag1 để báo lỗi cho các thao tác I2C, và cờ flag2 để đặt trạng thái ACK/NACK khi đọc thông tin từ bus I2C. Chương trình con Write_I2C() sẽ cập nhật trạng thái cờ flag1, còn chương trình con Read_I2C() sẽ dùng trạng thái của cờ flag2. buff là bộ đệm cho dữ liệu xuất ra bus I2C, còn str là bộ đệm cho chuỗi ký tự thể hiện thông tin thời gian. Khi đọc dữ liệu từ DS1307, do đặc điểm là địa chỉ của thanh ghi tiếp theo được cập nhật tự động, chúng ta sẽ đọc thông tin về giây, rồi đến phút, và giờ. Nhưng khi xuất thông tin thì chúng ta thường thể hiện giờ, rồi đến phút, và giây. Do đó, bộ đệm str được ghi dữ liệu theo chiều xuôi, và thao tác xuất các ký tự sẽ được thực hiện theo chiều ngược lại. Nếu chỉ xuất dữ liệu ra bus I2C, chúng ta thực hiện theo trình tự: điều kiện START, xuất địa chỉ của ngoại vi với cờ thao tác ghi, xuất địa chỉ của thanh ghi sắp thao tác (nếu cần thiết), các thao tác ghi (các chip ngoại vi thường hỗ trợ ghi liên tiếp và tự động cập nhật thanh ghi địa chỉ), và điều kiện STOP. Nếu chúng ta đọc dữ liệu từ bus I2C, chúng ta thực hiện theo trình tự: điều kiện START, xuất địa chỉ của ngoại vi với cờ thao tác ghi, xuất địa chỉ của thanh ghi sắp thao tác (nếu cần thiết), điều kiện RESTART, xuất địa chỉ của ngoại vi với cờ thao tác đọc, các thao tác đọc (các chip ngoại vi thường hỗ trợ đọc liên tiếp và tự động cập nhật thanh ghi địa chỉ), sau mỗi thao tác đọc chúng ta sẽ ACK, ngoại trừ thao tác đọc cuối cùng cần NACK, và điều kiện STOP. 4. Tóm tắt Qua tutorial này, các module UART và I2C của dsPIC đã được giới thiệu. Cách thiết lập các tham số cho module UART, cách đọc/ghi thông tin từ module UART đã được minh họa. Cách thiết lập và sử dụng module I2C ở chế độ Master cũng đã được đề cập. Một số điểm cần chú ý đối với module I2C của dsPIC, cũng như giao tiếp I2C đã được nêu ra ở đây. Các ví dụ ở đây tuy đơn giản nhưng đã cung cấp các chức năng cơ bản để phát triển các ứng dụng dựa vào các giao tiếp RS-232 và I2C. Hy vọng bạn có thể xây dựng được những chương trình ứng dụng tốt dựa vào những chương trình con cơ bản này. Chúc bạn thành công!
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

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