Hướng Dẫn Làm Quen Với eZdspF2812 Nguyễn Quốc Đính Tháng 6, năm 2009 Tóm tắt nội dung Dòng TMS320C2000 là thế hệ DSP có khả năng tính toán rất cao, được dùng phổ biến để điều khiển, đặc biệt là điều khiển dộng cơ, chuyển đổi năng lượng và các hệ cảm biến cao cấp. Đây có thể xem là một đối tượng rất lý tưởng để thực hiện hệ thống nhúng cho các thuật toán điều khiển với sự hỗ trợ các giao tiếp ngoại vi của MCU. Tuy nhiên sự tiếp cận với thế hệ này mất khá nhiều thời gian với sự tràn ngập tài liệu liên quan. Chúng tôi thực hiện bài này với mong muốn giúp đỡ các bạn rút ngắn thời gian trong việc tiếp cận với dòng DSP này. Các vấn đề thảo luận ở đây được tập trung vào board mạch eZd- spF2812 1 . Chúng tôi hoan nghênh mọi thắc mắc hay đóng góp về địa chỉ [email protected]. Mục lục 1 Cài đặt và thiết lập cấu hình cho CCS 3 1.1 Cài đặt CCS ........................................ 3 1.2 Thiết lập cấu hình cho CCS giao tiếp được với phần cứng. ............... 4 2 Phần Cứng eZdspF2812 6 2.1 Cấu tạo ........................................... 6 2.2 Thiết lập chế độ hoạt động của board mạch với các Jumper .............. 8 2.2.1 JP4, JP5 ...................................... 9 2.2.2 JP1 ......................................... 9 2.2.3 JP7, JP8, JP11, JP12: lựa chọn chế độ Boot .................. 10 2.2.4 JP9, PLL disable .................................. 10 2.3 Onboard LEDs ....................................... 11 3 Từng Bước Làm Quen Với TMS320F2000 12 3.1 Làm quen với môi trường làm việc của CCS ....................... 12 3.2 Debug chương trình .................................... 13 3.2.1 Add a Break Point ................................. 13 3.2.2 Add a Probe Point ................................. 14 3.2.3 Xem một biến ................................... 14 3.2.4 Debug từng bước .................................. 15 3.3 Xây dựng chương trình đầu tiên ............................. 16 1 Đang được sử dụng tại Bộ môn Điều Khiển Tự Động - Đại Học Bách Khoa Tp. HCM 1
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Hướng Dẫn Làm Quen Với eZdspF2812
Nguyễn Quốc Đính
Tháng 6, năm 2009
Tóm tắt nội dung
Dòng TMS320C2000 là thế hệ DSP có khả năng tính toán rất cao, được dùng phổ biến đểđiều khiển, đặc biệt là điều khiển dộng cơ, chuyển đổi năng lượng và các hệ cảm biến cao cấp.Đây có thể xem là một đối tượng rất lý tưởng để thực hiện hệ thống nhúng cho các thuật toánđiều khiển với sự hỗ trợ các giao tiếp ngoại vi của MCU.
Tuy nhiên sự tiếp cận với thế hệ này mất khá nhiều thời gian với sự tràn ngập tài liệu liênquan. Chúng tôi thực hiện bài này với mong muốn giúp đỡ các bạn rút ngắn thời gian trong việctiếp cận với dòng DSP này. Các vấn đề thảo luận ở đây được tập trung vào board mạch eZd-spF28121. Chúng tôi hoan nghênh mọi thắc mắc hay đóng góp về địa chỉ [email protected].
Mục lục
1 Cài đặt và thiết lập cấu hình cho CCS 3
1.1 Cài đặt CCS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 Thiết lập cấu hình cho CCS giao tiếp được với phần cứng. . . . . . . . . . . . . . . . 4
2 Phần Cứng eZdspF2812 6
2.1 Cấu tạo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.2 Thiết lập chế độ hoạt động của board mạch với các Jumper . . . . . . . . . . . . . . 8
3.3 Xây dựng chương trình đầu tiên . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161Đang được sử dụng tại Bộ môn Điều Khiển Tự Động - Đại Học Bách Khoa Tp. HCM
CCS – Code Composer Studio là môi trường soạn thảo IDE của Texas Instrument cho các thế hệDSP cũng như MCU của TI, bao gồm việc soạn thảo mã lệnh, dịch, liên kết và debug chương trình.
Ưu điểm rất lớn của CCS là khả năng nhắc tuồng rất hiệu quả như trong môi trừng VB hayC#. Ngoài ra với khả năng kết nối với phần cứng, debug online, vẽ đồ thị thời gian thực . . . CCSlà sẽ giúp cho quá trình phát triển giải thuật cải thiện đáng kể về thời gian. Tuy nhiên để CCS kếtnối được với phần cứng khác nhau thì cần phải thiếp lập kết nối CCS với phần cứng đó, trong tàiliệu này chúng tôi sử dụng board mạch eZdspF2812 của Spectrum Digital.
Hình 1: Cài đặt Code Composer Studio
Trước tiên chúng ta sẽ cài đặt CCS trong đĩa kèm theo.Tiếp theo đó, vào trong thư mục ’Spectrum Digital’, chọn thư mục eZdsp2800, chọn setup để
cài đặt phần tiếp theo là eZdsp2800 Emulation Drivers and Target Content.
Hình 2: Cài đặt driver cho eZdspF2812
Chương trình này được xem như là một driver để CCS nhận thấy và giao tiếp được với boardmạch eZdspF2812. Cứ để thiết lập mặc định đến khi hoàn thành việc cài đặt.
1.2 Thiết lập cấu hình cho CCS giao tiếp được với phần cứng. 4
Như vậy việc cài đặt những thành phần cơ bản đã thực hiện xong.
1.2 Thiết lập cấu hình cho CCS giao tiếp được với phần cứng.
Để bắt đầu thiết lập cấu hình để cho CCS nhận thấy và giao tiếp được với board eZdspF2812, chúngta cho chạy chương trình SdConfig. Tuy nhiên cần ghi nhớ là phải kết nối board mạch eZdspF2812với máy tính trước khi thực hiện quá trình config.
Thực hiện chọn các thông số như hình bên dưới, rồi save lại, sau đó chọn biểu tượng reset (chữR màu đỏ ), nếu không có gì trở ngại thì sẽ thấy dòng chữ ’emulator is reset’.
Hình 3: Cài đặt thông số cho bộ JTAG
Để kiểm tra thiết lập kết nối, chúng ta vào lệnh ’Emulator Test’, nếu thiết lập đúng thì sẽ hiệnra thông báo là đã kết nối được với JTAG như hình bên. Nếu chương trình báo lỗi thì hãy làm lạiquá trình trên, chọn lại thông số kết nối.
Tiếp theo chạy chương trình SetupCCStudio, mục đích là để install driver vừa cài đặt vào CCS.Chúng ta làm như hình vẽ sau:
∙ Chọn board F2812 eZdsp.
∙ Chọn Add.
TÀI LIỆU 5
∙ Save & Quit.
Hình 4: Chọn kết nối CCS với eZdspF2812
Như vậy là chúng ta đã kết nối được CCS với board mạch eZdspF2812. Phần tiếp theo chúngta sẽ bắt đầu viết chương trình đâu tiên với họ DSP TMS320C2000, nhưng trước đó chúng ta sẽlàm quen với phần cứng của board mạch eZdspF2812 trước đã.
Tài liệu
[1] eZdsp for the TMS320C2812, Quick Start Guide. Spectrum Digital.
2 Phần Cứng eZdspF2812 6
2 Phần Cứng eZdspF2812
2.1 Cấu tạo
The eZdspTM F2812 has the following features:
∙ TMS320F2812 Digital Signal Processor
∙ 150 MIPS operating speed
∙ 18K words on-chip RAM
∙ 128K words on-chip Flash memory
∙ 64K words off-chip SRAM memory
∙ 30 MHz. Clock
∙ 2 Expansion Connectors (analog, I/O)
∙ Onboard IEEE 1149.1 JTAG Controller
∙ 5-volt only operation with supplied AC adapter
∙ TI F28xx Code Composer Studio tools driver
∙ On board IEEE 1149.1 JTAG emulation connector
Sơ đồ nguyên lý bằng OrCAD có thể tìm thấy ở phụ lục A, sơ đồ tổng quát của board mạchnhư sau (chú ý đến những thành phần được mô tả ở trên):
Hình 5: Block Diagram eZdspF2812
Hình dạng bên ngoài của board mạch với với những chú thích tương ứng với các thành phầncủa mạch:
2.1 Cấu tạo 7
Hình 6: Hình dạng của board mạch
Và kết nối của board mạch với PC thông qua bộ JTAG có sẵn (kết nối qua cổng song song):
Hình 7: Kết nối board với PC
Có thể nhận thấy rằng board mạch eZdspF2812 chỉ chứa phần ’nhân’ tức là phần xử lý, bộnhớ ngoài, và kết nối JTAG qua cổng máy in mà chưa có các thành phần khác. Tuy nhiên các IOEXPANTION từ 𝑃1 → 𝑃9 cộng với các giao thức như SPI, SCI, I2C, CAN, McBSP và các GPIOchúng ta có thể mở rộng giao tiếp với nhiều thiết bị khác nhau.
Về chi tiết các IO EXPANTION này, vui lòng xem chi tiết tại [1].Sau đây là một ví dụ về giao tiếp của board mạch eZdspF2812 với các thiết bị bên ngoài khác
thông qua các cổng mở rộng.
2.2 Thiết lập chế độ hoạt động của board mạch với các Jumper 8
Hình 8: Một ví dụ về mạch mở rộng của eZdspF2812 - Zwickau Adapter Board
Board này được miêu tả như sau:
∙ 8 LED’s for digital output (GPIO B7. . . B0).
∙ 8 switches (GPIO B15. . . B8) and 2 push buttons (GPIO D1, D6) for digital input.
∙ 2 potentiometers (ADCINA0, ADCINB0) for analog input.
∙ 1 loudspeaker for analogue output via PWM - Digisound F/PWC04A.
∙ 1 dual SPI Digital to Analogue Converter (DAC) - Texas Instruments TLV5617A.
∙ 1 SPI EEPROM 1024 x 8 Bit - ST Microelectronics M95080.
∙ 1 CAN Transceiver - Texas Instruments SN 65HVD230 (high speed).
∙ 1 CAN Transceiver - Philips TJA 1054 (low speed).
∙ 1 I2C – Temperature Sensor Dallas Semiconductor DS1621.
Sơ đồ nguyên lý của Zwickau Adapter Board có thể được tìm thấy ở phần phụ lục B. Đây cóthể là một tham khảo tốt khi bạn muốn thiết kế riêng cho mình để mở rộng giao tiếp board mạch.
2.2 Thiết lập chế độ hoạt động của board mạch với các Jumper
Bên cạnh các Expantion để kết nối thêm các ngoại vi khác, trên board eZdspF2812 có một sốjumper để người dùng có thể thiết lập các chế độ hoạt động thích hợp cho DSP.
2.2 Thiết lập chế độ hoạt động của board mạch với các Jumper 9
Ngoại trừ JP4 và JP5, tất cả các Jumper còn lại phải được kết nối hoặc ở vị trí 1 – 2hoặc 2 - 3
Vị trí của các Jumper trên board mạch như hình vẽ bên dưới:
Hình 9: Vị trí của các Jumper trên eZdspF2812
2.2.1 JP4, JP5
Mục đích của các Jumper P4, P5 này là để cung cấp nguồn +3.3V/5V ra các cổng mở rộng P8-P4và P2 tương ứng.
Tuy nhiên nhà sản xuất chưa gắn Jumper này vào, nếu người sử dụng muốn đưa nguồn ra ngoàiđể sử dụng thì cần phải hàn jumper này vào. Cần phải xem xét khả năng cung cấp công suất củanguồn ổn áp trong mạch eZdspF2812 với yêu cầu của tải bên ngoài. Theo ý kiến của chúng tôi thìchúng ta không nên sử dụng những nguồn này mà nên cung cấp nguồn riêng khi mở rộng giao tiếpbên ngoài.
Chúng ta phải chú ý là khi giao tiếp với các port của DSP TMS320C2000, thì mức điệnáp không được vượt ra khỏi tầm 0-3.3V. Tuyệt đối không cung cấp nguồn 5V trực tiếpvào các pin của DSP.
2.2.2 JP1
Lựa chọn chế độ hoạt động cho DSP:
2.2 Thiết lập chế độ hoạt động của board mạch với các Jumper 10
Đặt Jumper ở vị trí 2 – 3 để chọn chế độ Microcomputer.
2.2.3 JP7, JP8, JP11, JP12: lựa chọn chế độ Boot
Các Jumper JP7, 8,11 & 12 được dùng để xác định chế độ mà DSP sẽ khởi động sau khi cung cấpnguồn. Để có tín hiệu ’High’, đặt jumper ở vị trí 1 – 2, còn trạng thái ’Low’ sẽ đạt được khi đặtjumper ở vị trí 2 – 3.
Thông thường chúng tôi đặt chế độ boot ở trạng thái ’FLASH’ hoặc ’H0’:
∙ Ở chế độ FLASH, chương trình được nạp vào bộ nhớ Flash (ở dòng F) hoặc Rom (ở dòngC), chúng ta chỉ nên đặt boot ở chế độ Flash khi chương trình đã hoàn thiện hoặc muốn chohệ thống chạy ở chế độ ’Stand Alone’.
∙ Ở chế độ H0, chương trình được đổ vào bộ nhớ RAM nội hoặc ngoại của board mạch eZd-spF2812, chế độ này thích hợp cho việc phát triển chương trình. Tuy nhiên khi khởi động lên,chương trình phải được nạp từ Host (tức là PC) vì bộ nhớ RAM không lưu giữ được dữ liệukhi nguồn mất đi.
Ưu điểm của chế độ boot từ H0 là hệ thống hoạt động ở tốc độ cao nhất (khoảng 150MIPS),so với chế độ Flash (khoảng 120 – 130MISP).
Vấn đề chọn chế độ boot khá quan trọng, nên sẽ được đề cập đến trong các phần sau nữa.
2.2.4 JP9, PLL disable
JP9 cho phép / không cho phép mức logic PLL trong DSP.
2.3 Onboard LEDs 11
Nếu chế độ PLL không được chọn, DSP sẽ hoạt động với tần số bằng tần số thạch anh bênngoài, là 30Mhz. Trường hợp chế độ PLL được chọn, tần số DSP hoạt động phụ thuộc vào cài đặtPLL ở chương trình, nhưng không được vượt quá 150Mhz.
Theo mặc định, chúng ta sẽ chọn chế độ cho phép PLL.Như vậy trước khi thực hiện chương trình trên board mạch, chúng ta phải chú ý đến việc thiết
lập Jumper trước tiên. Việc thiết lập jumper sai có thể dẫn đến chương trình chạy không đúngmục đích.
2.3 Onboard LEDs
Board eZdspF2812 có sẵn hai LED.
∙ LED DS1 được dùng để báo trạng thái của nguồn, thường được phát sáng khi cung cấp nguồncho mạch.
∙ LED DS2 được điều khiển bởi chương trình, được gắn với chân XF (GPIOF14). Chúng ta cóthể dùng DS2 để debug chương trình.
Trong phần tới chúng ta sẽ sử dụng DS2 để bắt đầu chương trình đầu tiên là chớp đèn LED.Ở đây chúng tôi chỉ giới thiệu rất cơ bản những phần có liên quan đến các chương kế tiếp.
Để hiểu rõ hơn hơn về board mạch này, chúng tôi đề nghị các bạn đọc các tài liệu liên quan củaSpectrum Digital, ví dụ như [1]. Đây là tài liệu rất đầy đủ miêu về eZdspF2812, tài liệu này có thểtải trên internet hoặc trong CD kèm theo board mạch.
Tài liệu
[1] eZdspTM F2812 Technical Reference. Rev. F. September 2003. Spectrum Digital.
3 Từng Bước Làm Quen Với TMS320F2000 12
3 Từng Bước Làm Quen Với TMS320F2000
Mục tiêu của chương này là để giúp bạn làm quen với môi trường CCS, từ đó bắt đầu một projectđơn giản. Phần này cũng sẽ giúp bạn bắt nhịp với các phương thức debug của CCS, đồng thời cáccách thức phát triển chương trình trực quan như vẽ đồ thị, hay lưu trữ các giá trị thời gian thựcvào file trên máy tính để phân tích hay lưu trữ cũng sẽ được bàn đến.
3.1 Làm quen với môi trường làm việc của CCS
CCS là một IDE phát triển riêng để phát triển các chương trình cho họ DSP và MCU của TI.Việc làm quen với CCS sẽ giúp cho chúng ta tiết kiệm được nhiều thời gian hơn khi phát triển cácproject trên môi trường này.
Môi trường làm việc của CCS được tóm gọn như sau:
Hình 10: Sơ bộ về các phần của CCS
Để cho sự bắt đầu một cách thuận tiện chúng ta sẽ sử dụng các ví dụ, chính xác hơn là mộtcông cụ để cho việc tiếp cận dòng C281x được dễ dàng hơn, đó là C281x C/C++ Header Files andPeripheral Examples của TI, có thể tải về và sử dụng miễn phí tại địa chỉ http://focus.ti.com/
docs/toolsw/folders/print/sprc097.html. Theo mặc định chương trình sẽ được cài đặt vào địachỉ C:∖tidcs∖c28∖DSP281x∖v111.
Chúng ta hãy mở project đầu tiên và bắt đầu làm quen với môi trường làm việc: project𝑔𝑝𝑖𝑜_𝑡𝑜𝑔𝑔𝑙𝑒 tại địa chỉ C:∖tidcs∖c28∖DSP281x∖v111∖DSP281x_examples.
Chú ý: đặt chế độ boot của DSP là H0, như đã đề cập đến ở phần 2, để chạy các ví dụ sau.Để mở project này, từ Project⇒Open, rồi chỉ đến mục gpio_toggle, mở file Example_281xGpioToggle.pjt.Quan sát cửa sổ bên tay trái, bạn sẽ thấy các thành phần sau của project:
- DSP/BIOS config., dùng để tạo nhân điều hành cho chương trình (hiện tại chưa có trongproject này).
- Linker command file: F2812_EzDSP_RAM_lnk.cmd và DSP281x_Headers_BIOS.cmd, haifile này dùng để cấu hình cho việc phân chia bộ nhớ và dịch mã nguồn.
Project này có thể được dịch và nạp vào DSP, để hiểu rõ hơn về chức năng của các thành phầncũng như cấu tạo của project, đề nghị các bạn đọc tài liệu DSP281x_HeaderFiles_QuickStart_Readme.pdfnằm trong file zip tải về.
Để nạp chương trình vào DSP và cho chạy chương trình này, chúng ta làm như sau:
- Kết nối CCS với phần cứng: ⇒ Debug ⇒ 𝐶𝑜𝑛𝑛𝑒𝑐𝑡. Bạn sẽ thấy có một cửa sổ bong bónghiện ra báo là đã kết nối được với phần cứng.
- Dịch chương trình: ⇒ Project ⇒ Build (F7). Nếu không có lỗi nào, mục Status Window sẽbáo là không có lỗi biên dịch chương trình.
- Nạp chương trình vào phần cứng: ⇒ File ⇒ Load Program, chọn thư mục Debug, rồi chọnfile Example_281xGpioToggle.out.
- Chạy chương trình: ⇒ Debug ⇒ Run, bạn sẽ thấy LED DS2 bớt sáng đi một chút. ⇒ Debug⇒ Hall, bạn sẽ thấy LED DS2 hoặc là sáng hoặc là tắt. Đọc chương trình chúng ta có thểhiểu được điều này dễ dàng.
Để thuận tiện hơn trong khi làm việc với CCS, chúng tôi khuyến khích các bạn học cách sửdụng các phím tắt cho các thao tác có thể lặp đi lặp lại nhiều lần, ví dụ như các thao tác trongquá trình trên.
Ngoài ra một số quá trình sau cũng thường được sử dụng:
- Dừng lại quá trình chạy real time: Debug → Halt.
- Có thể reset lại CPU bằng cách vào Debug → Reset CPU, Debug → Restart.
- Nhảy lại đầu chương trình: Debug → Go Main
3.2 Debug chương trình
Debug là công việc thường xuyên khi viết chương trình, vì vậy tìm hiểu môi trường debug của CCSlà cần thiết.
CCS cung cấp một hệ thống các công cụ giúp cho công việc debug diễn ra thuận lợi. Chúng tacũng sẽ sử dụng project ở phần 1 để tiếp cận các phương thức debug của CCS.
3.2.1 Add a Break Point
Các bước sau sẽ đặt một Break Point vào vị trí thích hợp.
∙ Tìm đến hàm void delay_loop() , ở dòng lệnh for (i = 0;i < 30000;i++) , nhấn chuột phảirồi chọn Toggle Software Break Point.
3.2 Debug chương trình 14
∙ Dòng lệnh này sẽ xuất hiện một chấm đỏ ở bên trái chứng tỏ đã đặt một Break Point vàodòng lệnh này.
Tiếp đó chúng ta cho chạy chương trình (nhấn F5), DSP sẽ được dừng lại khi nhảy đến dònglệnh ở trên. Cho chạy chương trình tiếp tục, chúng ta sẽ thấy kết quả.
Bạn hãy thử gỡ bỏ Break Point rồi chạy chương trình lại, xem kết quả như thế nào. Tiếp đóhãy thử đặt Break Point tại điểm khác, quan sát kết quả.
3.2.2 Add a Probe Point
Có một sự khác biệt nhỏ giữa Break Point và Probe Point là: Break Point đặt CPU vào tình thếdừng (hall) vĩnh viễn, trong khi Probe Point chỉ dừng CPU tạm thời rồi chạy tiếp tục. Thời gianchờ tạm thời này được dùng để trao đổi dữ liệu giữa PC và bộ JTAG.
Quá trình cài đặt Probe Point cũng tương tự như Break Point, chỉ khác ở chổ thay vì chọnBreak Point, chúng ta chọn Probe Point.
Có thể nhận thấy đây là một phương thức debug rất cao cấp để giao tiếp với DSP trong hệthời gian thực gọi là ’Real Time Debug’. Phương thức này sẽ được dùng cho mục đích vẽ đồ thịthời gian thực hay lưu giá trị biến vào file như đề cập ở các phần dưới.
3.2.3 Xem một biến
Dùng Break Point để cho chương trình dừng lại tại dòng lệnh for (i = 0; i < 30000; i++) nhưtrên.
Sau đó click chuột phải vào biến i, chọn Add to Watch Windows.Kết quả sẽ hiện ra như sau:
Hình 11: Xem giá trị biến trong quá trình quá trình debug
Lúc này bạn thử nhấn nút F11 (Step into) để xem biến i tăng dần, cho dù Break Point tại điểmnày đã bị remove hay không.
3.2 Debug chương trình 15
Nếu quan sát kĩ phần hiển thị giá trị của biến, bạn sẽ thấy có hai phần là Watch Locals vàWatch1, Watch2 . . . Phần Watch Locals chỉ hiển thị những biến địa phương trong chương trìnhcon mà con trỏ hiện thời đang trỏ đến. Phần Watch1/2/3... hiển thị những biến mà bạn add vào, kểcả biến địa phương hay biến toàn cục. Tuy nhiên biến địa phương sẽ không cho giá trị nào cả trongphần Watch1/2/3... nếu con trỏ hiện thời không chỉ đến chương trình con chứa biến địa phươngđó.
Hình 12: Màn hình xem giá trị các biến
3.2.4 Debug từng bước
Như đã đề cập ở trên, một trong những tiện ích của debug là chỉ xem một phần nhỏ đoạn code.Điều này có thể thực hiện được thông qua việc debug từng bước.
Xem hình sau để có một cái nhìn tổng thể về vấn đề này.
Hình 13: Debug từng bước
Đến đây chúng tôi khuyến khích các bạn đọc các ví dụ còn lại, tập trung vào các phần nhưphần xử lý GPIO, ADC và Timer.
3.3 Xây dựng chương trình đầu tiên 16
Phần tiếp theo chúng ta sẽ làm quen với việc bắt đầu xây dựng một project.
3.3 Xây dựng chương trình đầu tiên
3.3.1 Tạo một project mới
→ 𝑃𝑟𝑜𝑗𝑒𝑐𝑡 → 𝑁𝑒𝑤
Hình 14: Tạo một project mới
3.3.2 Soạn thảo mã nguồn C/C++
→ 𝐹𝑖𝑙𝑒 → 𝑁𝑒𝑤 → 𝑆𝑜𝑢𝑟𝑐𝑒𝐹 𝑖𝑙𝑒
Rồi copy chương trình sau vào. Rồi save lại với tên bạn muốn, ví dụ main.c
#include <s td i o . h>f loat fk ;unsigned int i k ;void main ( ){
int i ;while (1 ){
for ( i= −5; i< 5 ; i++){
ik = i * i ;fk = rand ( ) / 32768 . 0 ;
}}
}
Lúc này file main.c đã được lưu vào ổ cứng của bạn, nhưng chưa là một thành phần củaproject. Muốn file này là một phần của project, chúng ta phải add nó vào như sau: → 𝑃𝑟𝑜𝑗𝑒𝑐𝑡 →𝐴𝑑𝑑𝐹𝑖𝑙𝑒𝑠𝑡𝑜𝑃𝑟𝑜𝑗𝑒𝑐𝑡 . . . Chọn file main.c.
Đến lúc này màn hình có thể như sau:
3.3 Xây dựng chương trình đầu tiên 17
Hình 15: Màn hình project hiện tại
3.3.3 Cấu hình cho việc dịch
Đưa thư viện ’C – Runtime – Library’ vào project: → Project → Build Options → Include Li-braries. Bạn tìm đến nguồn của file rts2800_ml.lib. Copy toàn bộ đường dẫn này (ví dụ nhưD:∖CCStudio_v3.1∖C2000∖cgtools∖lib∖rts2800_ml.lib) vào tab này.
Chọn kích thước cho stack là 0x400, đây là kích thước mặc định cho stack. Tuy nhiên chúng tacó thể thay đổi kích thước cho phù hợp với từng ứng dụng.
3.3 Xây dựng chương trình đầu tiên 18
Hình 16: Cấu hình cho quá trình biên dịch
3.3.4 Linker Command File
Linker liên kết tất cả các phần chúng ta xây dựng cho hệ thống, điều này được thực hiện thôngqua ’Linker Command File’. File này sẽ được dùng để kết nối hệ thống bộ nhớ phần cứng của DSPvới những sections (phần phân bổ bộ nhớ) mà chúng ta tạo ra trong chương trình phần mềm.
Với board mạch eZdsp2812, chúng ta có một số linker được viết sẵn, được tìm thấy trong thưmục C:∖tidcs∖c28∖DSP281x∖v111∖DSP281x_common∖cmd. Chúng ta có thể sử dụng các linkernày, sau khi đã hiểu rõ cấu trúc của phần cứng bộ nhớ rồi thì có thể sửa lại cho thích hợp với từngứng dụng của mình.
Một điều đáng lưu ý là chúng ta có thể tham chiếu đến cùng một file cho nhiều project khácnhau, tuy nhiên việc dùng chung như vậy có thể dẫn đến nhiều nhược điểm như:
∙ Khi chỉnh sửa trong project này thì file đó đã bị thay đổi, dẫn đến project khác cũng bị thayđổi theo. Cá nhân chúng tôi nhiều lần vấp phải vấn đề này, dẫn đến mất nhiều thời gian sửalỗi.
∙ Khi copy đến máy khác thì phải chỉnh lại đường dẫn.
Vì vậy, cách tốt nhất là hãy copy những mã nguồn này vào cùng trong một thư mục của project.Chúng ta copy 2 file . . . DSP281x_common∖cmd∖F2812_EzDSP_RAM_lnk.cmd và. . . DSP281x_headers∖cmd∖DSP281x_Headers_nonBIOS.cmd vào trong thư mục của project hiện
3.3 Xây dựng chương trình đầu tiên 19
thời. File thứ nhất là file Linker Command, file thứ hai là file định nghĩa các vùng bộ nhớ trênDSP.
Hình 17: Cấu trúc của quá trình liên kết các thành phần trong project
3.3.5 Biên dịch chương trình
Lựa chọn cách thức để dịch chương trình:
Hình 18: Lựa chọn cách thức để dịch chương trình
Có hai cách thức để dịch chương trình:
∙ Debug: là cách thức mặc định. Cách thức này không được tối ưu về mã lệnh khi dịch. Đượcdùng khi đang phát triển project.
∙ Release: cách thức dịch này sẽ mang lại sự tối ưu về thời gian thực thi cũng như kích thướccủa file .out. Được dùng khi project đã hoàn thành.
Đến lúc này chúng ta có thể biên dịch, nạp vào DSP và xem kết quả. Có thể dùng các phươngthức debug ở trên để xem xét các biến.
3.3.6 Vẽ các đồ thị của các biến
Như đã bàn ở trên, CCS cung cấp một công cụ rất mạnh là vẽ đồ thị real – time rất hiệu quả.Chúng ta dùng để quan sát các biến fk là biến ngẫu nhiên trong khoảng [0,1], biến ik là một hàm
3.3 Xây dựng chương trình đầu tiên 20
parabol.
∙ Click chuột phải vào biế fk trong dòng lệnh fk = rand()/32768.0; , rồi chọn Insert Graph.
∙ Chúng ta sẽ vẽ giá trị fk, nên chọn các thông số như sau:
– Start Address: là địa chỉ của biến cần vẽ, chọn &fk.
– Acquisition Buffer Size: chỉ số các giá trị sẽ cập nhật vào đồ thị kể từ biến có địa chỉđịnh trên Start Adress. Vì ở đây chúng ta chỉ cập nhật 1 biến là fk nên chỉ chọn thôngsố bằng 1. Trong trường hợp các giá trị cần hiển thị lên đồ thị là một mảng thì StartAddress là địa chỉ của phần tử đầu tiên của mảng, còn Acquisition Buffer Size là sốphần tử của mảng đó.
– Display Data Size: số các phần tử (lượng tử) sẽ được cập nhật lên trên đồ thị. Trongtrường hợp này ta chọn là 50, có nghĩa là chỉ vẽ 50 giá trị gần nhất cho đến thời điểmhiện tại.
– DSP Data Type: fk được định nghĩa là float nên chọn là 32-bit floating point.
– Sampling Rate: ảnh hưởng đến hiển thị thời gian trên trục tung, giá trị này không phảilà tốc độ lấy mẫu để vẽ đồ thị. Đồ thị chỉ được cập nhật khi chương trình chạy đến đònglệnh được đánh dấu Probe Point mà thôi.
Sau khi thực hiện xong ta sẽ thấy bên phải của dòng lệnh xuất hiện một biểu thị chứng tỏtại dòng lệnh này đã được đặt một Probe Point. Tại sao lại xuất hiện Probe Point? Như vậyviệc click chuột phải để Insert Graph ảnh hưởng như thế nào đến thời điển cập nhật các biếnlên trên đồ thị?
Hình 19: Chọn điểm để cập nhật đồ thị
3.3 Xây dựng chương trình đầu tiên 21
Hình 20: Chọn các thông số để cập nhật giá trị fk
∙ Tương tự chúng ta cũng tại dòng lệnh này, chọn để vẽ đồ thị của biến ik.
3.3 Xây dựng chương trình đầu tiên 22
Hình 21: Chọn các thông số để cập nhật giá trị ik
∙ Khi cho chạy một lúc, chúng ta sẽ thấy kết quả như sau
Hình 22: Đồ thị ik và fk theo thời gian
Như vậy chúng ta đã biết được cách xây dựng và cấu hình cho một project trong CCS rồi đấy!
3.4 Sử dụng các chương trình viết sẵn cho project của mình 23
3.4 Sử dụng các chương trình viết sẵn cho project của mình
Thông thường khi xây dựng một project lớn chúng ta không phải viết từ đầu đến cuối mà sử dụngnhững thu viện hay những section đã được viết sẵn. Chúng ta có nhu cầu sử dụng lại những sourcecode có sẵn.
Khi làm việc với MCU hay DSP thì giao tiếp với IO port là một công việc thường xuyên, lúcđó chúng tôi khuyến khích các bạn sử dụng những chương trình trong gói C281x C/C++ HeaderFiles and Peripheral Examples đã được đề cập ở trên.
Theo kinh nghiệm của chúng tôi, thì chúng ta không nên tham khảo chéo các file được đặttrong thư mục khi cài đặt gói chương trình này, bởi vì có thể chúng ta sẽ tác động lên mã nguồncác file này (do các code này không phải là thư viện), khi đó sẽ gây bất tiện khi làm việc với nhiềuproject khác nhau. Chúng tôi thường copy các mã nguồn (file .c, .asm và .h tương ứng) vào trongthư mục chứa project đang làm việc. Việc làm này có thể gây khó khăn trong thời điểm ban đầuvì bản thân các nguồn này cũng được liên kết đến với nhau, gây báo lỗi thiếu tham chiếu khi dịch,nhưng khi đã quen rồi thì bạn sẽ thấy được tác dụng của nó.
[2] TMS320F2810, TMS320F2811, TMS320F2812, TMS320C2810, TMS320C2811,TMS320C2812, Digital Signal Processors Data Manual. Texas Instruments.
4 Một số mở rộng 24
4 Một số mở rộng
4.1 Chỉnh sửa linker, nạp chương trình vào flash
Tất cả các ví dụ ở trên được nạp vào RAM để chạy, đông nghĩa với việc khi cung cấp nguồn taphải nạp lại chương trình.
Vì nhiều lý do ta có thể muốn chương trình của mình được nạp trược tiếp vào Flash luôn. Mộtchương trình sau khi được viết thành công ở chế độ boot H0 muốn chuyển qua chế độ boot Flashthì cần phải thực hiện những bước sau:
- Cấu hình lại linker cho phù hợp.
- Nạp vào Flash.
- Debug lại.
Có nhiều cách thức cấu hình lại cho linker trong trường hợp này. Để hiểu rõ hơn về linker chúngtôi khuyến khích bạn đọc 2 tài liêu tham khảo [1] và [2].
Để nạp chương trình vào flash, chúng ta cần cài đặt flash plugin. Plugin này có thể tìm thấytại đĩa CD kèm theo eZdspF2812.
Hình 23: Cài đặt flash plugin cho CCS
Sau khi cài đặt thì trong CCS xuất hiện thêm một công cụ trong menu Tools.
4.2 Giới thiệu một số thư viện 25
Hình 24: On-Chip Flash Plugin trong CCS
Có thể sử dụng tính năng help trong plugin này để lựa chọn các thông số.Và cuối cùng là . . . debug lại chương trình!, chương trình chạy tốt trong RAM nhưng có thể sẽ
gặp vấn đề trong FLASH, và bạn cũng sẽ sớm nhận ra việc debug trong Flash cũng sẽ khác trongRAM, xem tài liệu [1] và [2] để biết thêm.
4.2 Giới thiệu một số thư viện
Một trong những điểm mạnh của dòng DSP của TI là hỗ trợ rất nhiều những công cụ tính toán xửlý số và tính toán thời gian thực. Một số thư viện DSP của TI cho dòng C281x có thể kể đến như:
Trong lĩnh vực điều khiển, thì một số phần thiên về xử lý tín hiệu số có thể sẽ không cần thiết.Nhưng những phần sau đáng để tham khảo khi viết chương trình:
TÀI LIỆU 26
∙ IQMath Library: cung cấp một môi trường ảo cho việc tính toán số thực với các phép toántrên số thực. Thư viện được viết bằng ASM nên tốc độ rất nhanh so với những hàm thư việncủa C.
∙ Communication Driver. Trong gói C281x C/C++ Header Files and Peripheral Examples cócác chương trình để giao tiếp thông qua các phương thức giao tiếp trên DSP như SCI, I2C,SPI . . . Tuy nhiên các chương trình mẫu này sẽ chỉ rất tốt để tham khảo cách thức hoạtđộng, còn để giao tiếp với thế giới bên ngoài thì thư viện Communication Driver mang lại sự’thỏa mái’ và ’trong sáng’ hơn cho chương trình của chúng ta.
∙ Signal Generator và STB: dùng để giả lập trực tiếp trên DSP khi chúng ta không kết nối trựctiếp với phần cứng thông qua việc tạo các hàm input và output.
Chúc các bạn thành công.
Tài liệu
[1] Application Report SPRA958D, Running an Application from Internal Flash Memory on theTMS320F281x DSP. September 2004, Texas Instruments.
[2] Application Report SPRAAU8, Copying Compiler Sections From Flash to RAM on theTMS320F28xxx DSCs. March 2008, Texas Instruments.
5 Phụ lục A 27
5 Phụ lục A
Sơ đồ nguyên lý của board mạch eZdspF2812
5
5
4
4
3
3
2
2
1
1
D D
C C
B B
A A
QA
4
C USED ON
ENGR-MGR
RLSE
DATE
DATE
REV
SHDATE
5
C
62
DATE
REVISION STATUS OF SHEETS
REV
SH
DWN
CDATE
ENGR
SH
DATE
C
CHK
BMFG
1 APPLICATION
NEXT ASSY
DATE
3
C
REV
REVISIONS
DESCRIPTIONREV DATE APPROVED
A PROTOTYPES 04-April-2002
The TMS320F2812 EzDSP design is based onpreliminary information(SPRS174G) for theTMS320F2812 device. This schematic is subject tochange without notification. Spectrum Digital Inc.assumes no liability for applications assistance,customer product design or infringement of patentsdescribed herein.
Connect VREFLO to AGND orto VREFLO of target systemfor proper ADC operation.
Schematic change from versionA/B to C. F2812 clkin is 1.8Vinput.
Tie off unused F24xxcompatible signals.
Make a solder connection onJP4 and/or JP5 to theappropriate power supply.
TMS320F2812 supports 3.3Vinput/output levels which areNOT 5V tolerant. Connectingthe eZdsp to a system with 5Vinput/output levels will damagethe TMS320F2812. If the eZdspis connected to another targetthen the eZdsp must bepowered up first and powereddown last to prevent latchupconditions.
PONRSnIN, GOES HIGH > 200ms AFTER ALL POWERIS STABLE.
3.3V THEN 1.8V
POWER ON SEQUENCE NOTES
3.3V SUPPLY, VDDIOVDD3VFL, VDDA1,VDDA2
1.8V SUPPLY
2.2V
140ms-280ms
Q3
PONRSnIN
VOLTAGE SUPPLY MAX CURRENT TPS767D301 PD
1.8V
3.3V
333mA
307mA
1065mW
521mW
PD(max) = (Tj(max) - Ta)/Rja
= (125 - 35)/27.9
= 3255mW
TPS767D301 RATINGS
MAX Iout PER CHANNEL IS 1A
TPS767D301 PD = (Vin-Vout)*Iout
1586mW Total
TIE TPS767D301 POWER PAD TO GNDPLANE (TI-SLMA002)
SET Q3 TO TURN ON WHEN 3.3V SUPPLY ISGREATER THEN 2.2 VOLTS. REGULATORTURN ON DELAY AND RAMP RATE WILLENSURE THAT 3.3V SUPPLY IS AT 2.5 VOLTSOR HIGHER BEFORE THE 1.8V SUPPLYREACHES 0.3 VOLTS.
18.2K 1.899V
U16 WILL TURN OFF THE 1.8V SUPPLY WHENINPUT POWER FALLS BELOW 2.94V. THIS SPEEDSUP THE 1.8V SUPPLY TURN OFF.
RESETn of TPS3838 is open-drain. U16 was added for testing but notpopulated on production boards.
506262 C
TMS320F2812 EzDSP
B
6 6Thursday, February 13, 2003
Title
Size Document Number Rev
Date: Sheet of
1.8VONn 1.8V
1.8V
PONRSnIN
VDD3VFL
GND
+5V
3.3V
3.3V
3.3V
3.3V
R2
10K
TP1
GND
1
C410.1uF
C50.1uF
C80.1uF
C210.1uF
C180.1uF
C190.1uF
C610.1uF
C400.1uF
R4610K
C600.1uF
C390.1uF
C60.1uF
C200.1uF
C90.1uF
C66
0.1uF
C65
0.1uF
R3316.9K, 1%
R45 30.1K, 1%
C64
0.1uF+ CT3
22uF
U9
TPS767D301
56
4
3
1112
10
9
1278
1314
151620212627
28
232425
22
171819
1IN1IN
1EN
1GND
2IN2IN
2EN
2GND
NCNCNCNCNCNC
NCNCNCNCNCNC
1RESET
1OUT1OUT
1FB/SENSE
2RESET
2OUT2OUT
2SENSE
TH
ER
MA
L_P
AD
C63
0.1uF+ CT4
22uF
+ CT122uF
+ CT522uF
+ CT247uF
C7.1uF
C11uF
P6
C590.1uF
R53
1.5K 1%
U16
TPS3838K33DBV
1
2
3
4
5CT
GND
MRn
RESETn
VDDQ3BSS138G
DS
R44220
R34
2.0K 1%
R52
0
DS1LTST-C150GKTGREEN
+ CT622uF
6 Phụ Lục B 34
6 Phụ Lục B
Sơ đồ nguyên lý và miêu tả board mạch Zwickau Adapter Board, một tham khảo cho mở rộng đốivới eZdspF2812.
Zwickau University ‘c28x Development Board
This document outlines the ‘c28x adaptor board developed by Zwickau University
Description
The Zwickau University adptor board is designed to be used with the Spectrum DigitalTMS320F2812 ‘eZdsp’ board. The peripheral expansion sockets on the eZdsp board can be fittedwith header plugs which allow it to be connected to the Zwickau board. The adaptor includes thefollowing features…
• 8x LED’s connected to GPIOB7..B0• 8x DIP switches connected to GPIOB15..B8• 2x momentary pushbuttons connected to GPIOD6 & D1• Loudspeaker connected to T1PWM output• 2x potentiometers allowing 0-3V to be applied to ADC channels A0 & B0• CAN port: link selectable between high-speed (SN65HVD230D) and low speed
(TJA1054A) transceivers, each with separate connector• SCI-A port connected to RS232 transceiver and 9-pin ‘D’ socket• SPI output connected to serial EEPROM (M95080) ( Note : chip select GPIO-D5) and
serial DAC (TLV5617A) (Note: chip select by GPIOD0 pin)• I2C temperature sensor connected to GPIOG5 & G4 pins
The adaptor board was designed by Dr. Frank Bormann of the University of Zwickau. Boards canbe obtained by
University of Applied Sciences ZwickauDepartment of Electrical EngineeringMr. Frank BormannDr. – Friedrichs – Ring 2A08056 ZwickauGermany
The board is supplied with a description , a hardware configuration file and sample programs totest all parts of the peripherals. The cost per adaptor board will be 299 Euro.
DSK (eZdsp) Starter Kit Information
U.S. Part number: TMDX3P761128European Part number: TMDX3P761128ETI price: $305.00Web link: TMS320F2812 eZdsp Kit (DSK)
Chương trình giao tiếp với LCD, thông qua giao tiếp 4bit.File định nghĩa lcd.h
#ifndef _LCD_H#define _LCD_H
/* ********************************************************LCDPortA******************************************************** */#define LCD_D0 1<<0#define LCD_D1 1<<1#define LCD_D2 1<<2#define LCD_D3 1<<3#define LCD_RS 1<<4#define LCD_EN 1<<5#define LCD_LED 1<<6#define LCD_BUS LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3#define lcd_en_set ( ) GpioDataRegs .GPASET. a l l |= LCD_EN // EN = 1 ( Enable )#define lcd_en_clr ( ) GpioDataRegs .GPACLEAR. a l l |= LCD_EN // EN = 0 ( Disab l e )#define lcd_rs_data ( ) GpioDataRegs .GPASET. a l l |= LCD_RS // RS = 1 ( S e l e c t I n s t r u c t i on mode)#define lcd_rs_ins ( ) GpioDataRegs .GPACLEAR. a l l |= LCD_RS // RS = 0 ( S e l e c t Data mode)
/* Define cac thao tac co ban vo i LCD *///#de f i n e l cd_c l ear ( ) l cd_wri te_contro l (0 x01 ) // Clear Disp lay#define lcd_cursor_home ( ) lcd_write_contro l (0 x02 ) // Set Cursor = 0#define lcd_display_on ( ) lcd_write_contro l (0x0E) // LCD Disp lay Enable#define l cd_disp lay_of f ( ) lcd_write_contro l (0 x08 ) // LCD Disp lay Di sab l e#define lcd_display_blink_on ( ) lcd_write_contro l (0x0F) // Set Cursor = Bl ink#define l cd_disp lay_bl ink_of f ( ) lcd_write_contro l (0x0E) // Set Cursor = Bl ink#define lcd_cursor_on ( ) lcd_write_contro l (0x0E) // Enable LCD Cursor#define l cd_cursor_of f ( ) lcd_write_contro l (0x0C) // Disab l e LCD Cursor#define l cd_curso r_le f t ( ) lcd_write_contro l (0 x10 ) // S h i f t Le f t Cursor#define l cd_cursor_right ( ) lcd_write_contro l (0 x14 ) // S h i f t Right Cursor#define l cd_d i sp l ay_s l e f t ( ) lcd_write_contro l (0 x18 ) // S h i f t Le f t Disp lay#define l cd_di sp lay_sr ight ( ) lcd_write_contro l (0x1C) // S h i f t Right Disp lay
/* pro to type */void l cd_write_contro l ( char ) ; // Write I n s t u c t i on to LCDvoid l cd_wr i t e_asc i i ( char ) ; // Write LCD Disp lay (ASCII )void l cd_conf ig (void ) ; // I n i t i a l LCDvoid lcd_goto_xy ( char row , char col lum ) ;void l cd_pr int ( char * ) ; // Print Disp lay to LCDvoid de lay1s (void ) ; // Delay Function// vo id delay_160us ( vo id ) ;void delay_4ms (void ) ;void l cd_c l ea r ( void ) ;
int busy_lcd (void ) ; // Read Busy LCD Sta tus// vo id enab le_lcd ( vo id ) ; // Enable Pulsevoid lcd_out_data4 ( char ) ;void lcd_write_byte ( char ) ;/* **************************************************** *//* I n i t i a l LCD : 8 b i t ,2− l i n e d i sp l ay ,5 x7 dot chara te r *//* **************************************************** */void l cd_conf ig ( ){
EALLOW;// s e t those p ins as input /ouputGpioMuxRegs .GPAMUX. a l l &= ~( LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3 | LCD_EN | LCD_RS ) ;GpioMuxRegs .GPAMUX. a l l &= ~( LCD_LED ) ;// s e t t i n g those p ins as outputGpioMuxRegs .GPADIR. a l l |= ( LCD_D0 | LCD_D1 | LCD_D2 | LCD_D3 | LCD_EN | LCD_RS ) ;GpioMuxRegs .GPADIR. a l l |= ( LCD_LED ) ;GpioDataRegs .GPASET. a l l |= (LCD_LED) ;EDIS ;
lcd_write_contro l (0 x30 ) ; // Function Set (8 b i t )l cd_write_contro l (0 x02 ) ;l cd_write_contro l (0 x28 ) ; // Function Set (DL=1 4−Bit ,N=1 2 Line ,F=0 5X7)
l cd_write_contro l (0x0E ) ; // Disp lay on Contro l ( Cursor on , Cursor not Bl ink )l cd_write_contro l (0 x01 ) ; // Entry Mode Set ( I /D=1 Increment , S=0 Cursor S h i f t )l cd_c l ea r ( ) ;
}
/* ********************** *//* Set cursor p o s i t i o n *//* ********************** */
void lcd_goto_xy ( char row , char col lum ){
unsigned char pos ;pos = col lum ;pos |= 0x80 ;
7 Phụ Lục C 42
i f ( row == 2)pos |= 0x40 ; // Set DD−RAM Address Command
l cd_write_contro l ( pos ) ;// delay_4ms ( ) ;}
/* ************************** *//* Strobe 4−Bit Data to LCD *//* ************************** */void lcd_out_data4 ( char va l ){
GpioDataRegs .GPACLEAR. a l l |= (LCD_BUS) ; // Reset 4−Bit Pin DataGpioDataRegs .GPASET. a l l |= ( va l ) ; // 0000:0000: dddd :RS,RW,EN,0 :0000 :0000 :0000 :0000
}
/* ************************** *//* Write Data 1 Byte to LCD *//* ************************** */void lcd_write_byte ( char va l ){
unsigned int i ; // Delay Countlcd_out_data4 ( ( val >>4)&0x0F ) ; // Strobe 4−Bit High−Nibb l e to LCDlcd_en_set ( ) ;for ( i =0; i <5000; i ++); // Wait Command Readylcd_en_clr ( ) ;
lcd_out_data4 ( va l&0x0F ) ; // Strobe 4−Bit Low−Nibb l e to LCDlcd_en_set ( ) ;for ( i =0; i <5000; i ++); // Wait Command Readylcd_en_clr ( ) ;
}
/* **************************** *//* Write cons t ruc t i on to LCD *//* **************************** */void l cd_write_contro l ( char va l ){
lcd_rs_ins ( ) ;lcd_write_byte ( va l ) ;
}
/* ******************************* *//* Write a s c i i charac t e r to LCD *//* ****************************** */void l cd_wr i t e_asc i i ( char va l ){
lcd_rs_data ( ) ;lcd_write_byte ( va l ) ;
7 Phụ Lục C 43
}
/* ********************************** *//* Print Disp lay Data (ASCII ) to LCD *//* ********************************** */void l cd_pr int ( char* s t r ){
unsigned char i ;for ( i =0; i< 18 && s t r [ i ] !=0 ; i++) // 16 i n t a c t e r Print{
l cd_wr i t e_asc i i ( s t r [ i ] ) ; // Print Byte to LCD}
}
/* ********************************************
*********************************************** */void l cd_c l ea r ( void ){
lcd_write_contro l (0 x01 ) ;delay_4ms ( ) ;
}
/* ********************* *//* Delay Time Function *//* 1−4294967296 *//* ********************* */