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

5 1K 2
Sử dụng các module UART và I2C của dsPIC ppt

Đang tải... (xem toàn văn)

Thông tin tài liệu

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 n o 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: In nghiêng Tài liệu tham khảo dsPIC30F/33F Programmer’s Reference Manual Viết hoa chữ đầu Một menu, hộp thoại Chọn Project Wizard Đặt trong dấu nháy kép Tên riêng (của tập tin, project, …) “Vidu3” Font Courier: Mã nguồn mov #0x8010, W0 Courier thường Tên tập tin Vidu3-1.s 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: 1 16 − × = Baud Fcy UxBRG 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. 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. Người báo cáo: Nguyễn Quang Nam Tài liệu: TUT05.01 Ngày: 9/18/2006 Trang: 4/5 CLKIN/OSC1 9 RC15/CLKO/OSC2 10 MCLR 1 RB0/CN2/VREF+/AN0/EMUD3 2 RB1/CN3/VREF-/AN1/EMUC3 3 RB2/CN4/SS1/AN2 4 RB3/CN5/INDX/AN3 5 RB4/CN6/IC7/QEA/AN4 6 RB5/CN7/IC8/QEB/AN5 7 RC13/CN1/U1ATX/T2CK/SOSCI/EMUD 11 RC14/CN0/U1ARX/T1CK/SOSCO/EMUC 12 EMUC2/OC1/IC1/INT1/RD0 15 EMUD2/OC2/IC2/INT2/RD1 14 RE0/PWM1L 26 RE1/PWM1H 25 RE2/PWM2L 24 RE3/PWM2H 23 RE4/PWM3L 22 RE5/PWM3H 21 FLTA/INT0/RE8 16 RF2/SDA/SDI1/U1RX/EMUC/PGC 18 RF3/SCL/SDO1/U1TX/EMUD/PGD 17 AVDD 28 AVSS 27 U1 DSPIC30F4012DIP Vdd X1 8MHz C1 33pF C2 33pF Vdd R1 33k X1 1 X2 2 VBAT 3 SQW/OUT 7 SDA 5 SCL 6 VCC 8 GND 4 U2 DS1307 Vdd R2 4.7k R3 4.7k R4 4.7k X2 32kHz T1IN 11 R1OUT 12 T2IN 10 R2OUT 9 T1OUT 14 R1IN 13 T2OUT 7 R2IN 8 C2+ 4 C2- 5 C1+ 1 C1- 3 VS+ 2 VS- 6 U3 MAX232 C3 1u C4 1u C5 1u C6 1u Vdd Chan 2 Chan 3 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: 1 1111111 2 −       −= Fcy Baud Fcy CBRGI 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. 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! . 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. 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. 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

Ngày đăng: 04/07/2014, 02:20

Tài liệu cùng người dùng

Tài liệu liên quan