XU HƯỚNG LẬP TRÌNH BẰNG C CHO VI ĐIỀU KHIỂN

GIỚI THIỆU uV3-KEIL FOR 8051

-----iжФжi-----

 

            Với tốc độ phát triển mạnh mẽ của các dòng sản phẩm MCU và xu hướng tạo những thành phẩm có ứng dụng cao, đòi hỏi sự tính toán lớn, hiện nay, thật khó để bạn viết ASM lập trình MCU cho những mục đích trên!

            Tất nhiên, để lập trình tốt cho các vi điều khiển, dù là mới hay cũ, dù đáp ứng thời gian thực tốt đến đâu đi nữa, bạn cũng nên có những tìm hiểu cơ bản về cấu hình chúng. Ý tôi không nói là bạn phải học toàn bộ cấu trúc của một vi điều khiển, bạn chỉ cần biết: vi điều khiển bạn đang sử dụng có thể làm được gì, các tính năng, ngoại vi, chân cẳng thế nào, tích hợp dòng áp đến đâu! Bao nhiêu ấy, cũng đủ để bạn làm nhiều chuyện trên đời rồi! Tất nhiên, bạn cũng cần có một cơ sở lý thuyết lập trình và điện tử tương đối tốt!

            Bạn lại nghi ngờ: ‘Úi giời, công phu tôi học ASM cả năm trời còn chả hiểu gì, như thế đã được sao?!’ Bạn có thể nghi ngờ, ấy là quyền của bạn! Nhưng tôi tin rằng, khi bạn tiếp cận với các công cụ hỗ trợ sẵn có của các dòng sản phẩm MCU đang sử dụng, rất có thể bạn sẽ nghĩ khác!

            Thử mới biết, có làm mới hay! Tôi sẽ lần lượt đi cùng bạn xem các dòng sản phẩm MCU hiện nay tôi đang có!

___________________________
            Bắt đầu với sản phẩm MCU P89LPC922 của Philips! Tại sao tôi chọn sản phẩm này? Đơn giản vì tôi đang có nó trong tay, các phần mềm hỗ trợ sẵn cho nó lại rất hiệu quả!

Làm như thế, bạn lại trách tôi: sao không lấy MCU AT89C51 của Atmel (15.000VNĐ một con như ở Nhật Tảo bán) để ví dụ có phải dễ hiểu và thiết thực hơn không?

Bạn thông cảm, hiện nay tôi chẳng có mạch nạp 89C51 nào cả, mà tôi thì chán cái trò phải tháo con MCU ở mạch nạp để bỏ vào mạch ứng dụng, muốn đổi chương trình lại phải tháo MCU ở mạch ứng dụng, gắn vào mạch nạp, nạp chương trình, sau đó… tóm lại cái quá trình tháo-gắn ấy khiến tôi phát mệt; chưa kể khả năng gây hư chip rất cao<do tĩnh điện hoặc do thao tác> Câu hỏi bạn đặt ra: “Tôi không có sản phẩm MCU của Philips, phải làm thế nào?” Bạn yên tâm, tôi sẽ giới thiệu với các bạn các dòng sản phẩm MCU phổ biến hiện nay, nếu bạn yêu cầu <trong phạm vi tôi biết>! Chưa biết năm nay Philips còn hỗ trợ cho ta trong kì thi Robocon như mọi lần hay không, nhưng điều chắc chắn là không hãng nào cung cấp hàng Sample rồi biến mất dạng trên thị trường sau đó khi thấy sản phẩm của mình vẫn còn một lượng khách hàng tương đối! Tôi thì chưa có con MCU P89V51RD2 vẫn dùng trong Robocon, nên sẽ bắt đầu với P89LPC922 đang có! Và thật sự, các tính năng cơ bản của họ P89 cũng y hệt như những họ 8051 kinh điển khác!

            Xu hướng dùng MCU của Microchips (PIC) cũng đang rất phát triển, PIC có một cộng đồng hỗ trợ rất tốt<bạn vào trang: http://www.picvietnam.com> hiện tại, tôi cũng nhận phân phối sản phẩm PIC và mạch nạp PIC, bạn có thể liên hệ trực tiếp qua số điện thoại: 098.3210.906 hoặc gởi mail về: buitrunghieu@khvt.com để mua sản phẩm, <tôi lấy giá như trên diễn đàn PICVN đã đưa J> Và mọi thắc mắc, nếu có, về PIC, bạn cứ gởi câu hỏi lên diễn đàn PICVN, tôi tin rằng bạn sẽ được trả lời thỏa đáng!

            Tốt nhất, theo tôi nghĩ, bạn nên có trong tay CD3: MCU <phiên bản 1.6> do tôi tổng hợp, trong đó có tương đối đầy đủ các phần cần thiết để bạn có thể ‘vọc’ với mấy con vi điều khiển!  Từ họ AT89C51 đến AVR của Atmel, PIC16x, 18x của Microchips, P89LPC9xx đến ARM của Philips, MC68HC của Motorola, một số con Realtime của Dallas,… các chương trình phần mềm sẵn có: ASM, C, VB… <quan trọng là firmware của bạn>

______________________________

            Nào, cùng xắn tay áo vào vọc con P89LPC922 thử xem!

+Yêu cầu về phần cứng:

· Một mạch giao tiếp MCU P89xxx với PC <xem thêm tại trang: http://www.khvt.com/traodoi/P89LPC922/Update/20050817/intro.html> để nạp chương trình và giao tiếp với máy tính.

· Một mạch phát triển LPC922 <cũng nói ở trang trên>.

· Phần sau tùy thuộc vào bạn có muốn gì thêm hay không, còn như thế là đủ với tôi trong phần ví dụ đưa ra hôm nay!

+Các yêu cầu về phần mềm: Bạn cần có các chương trình: (Cấu hình máy tương thích bạn xem lại)

· Keil For 8051(uV3)-cập nhật tại http://www.khvt.com/mcu/software/

· FlashMagic-Cập nhật bản mới nhất tại trang: http://www.esacademy.com/software/flashmagic

· Công cụ hỗ trợ tạo code: http://www.codearchitect.org/philips

 

Như thế, máy PC của bạn phải chịu một dung lượng không nhỏ những chương trình phần mềm chuẩn bị, bạn lại than phiền: “Chưa biết làm nên cơm cháo gì, tốn không gian đĩa cứng thế!” Mong bạn bớt chút hỏa hầu, bỏ vài bài nhạc hình trong đĩa cứng, thế là tốt đẹp thôi mà!

v         Đầu tiên, tôi xin nói sơ lược về phần cứng (hardware):

§                     Mạch giao tiếp thực chất chính là IC Max232 đổi mức RS232(+12/-12) sang TTL(+5/0). Bạn sẽ không tốn nhiều thời gian và tiền bạc để tạo ra nó (<20.000VNĐ nếu bạn biết layout)

§                     Mạch ứng dụng tích hợp sẵn ISP (Xem thêm ở trang http://www.khvt.com/traodoi/P89LPC922/Update/20050817/intro.html), thạch anh ngoài, các Port tùy mục đích sử dụng.

v         Về phần mềm:

§                      FlashMagic: phần mềm nạp chương trình chuyên dụng cho họ P89 của Philips <Tích hợp ISP>

§                     CodeArchitect: phần mềm hỗ trợ việc tạo code C chuyên dụng cho họ P89

§                     Keil For 8051 (uV2-tools c51): phần mềm hỗ trợ lập trình và biên dịch file hex từ ngôn ngữ C hoặc ASM cho đủ các MCU (Từ Atmel, Philips, Dallas, Siemens, TI, Sanyo…). Bạn sẽ không ân hận khi đã ‘lỡ’ cài chương trình này vào máy! Chương trình còn hỗ trợ chạy mô phỏng rất tốt!

v     Theo thông lệ, thì phần tiếp theo, tôi phải nói về phần lập trình (firmware), tuy nhiên, để bạn có thể sử dụng ngay các chương trình phần mềm này, tôi xin có vài lời thưa, hầu mong bạn nhanh chóng sử dụng nó một cách thoải mái và không gặp trở ngại gì cả!

o       Về Keil, bạn cài đặt như File hướng dẫn kèm theo. Sau đó, chịu khó ghé qua trang: http://www.khvt.com/traodoi/P89LPC922/Update/20050921/index.html để xem cách tạo một Project trong uV3.

o       Chương trình FlashMagic, bạn nên cài đặt vào ổ đĩa C:/Program files/… như đường dẫn mặc định. Sau đó, bạn lại ghé qua nhìn trang: http://www.khvt.com/traodoi/P89LPC922/Update/20050817/intro.html để xem cách nạp bằng FlashMagic. Thật ra, bạn có thể gọi FlashMagic từ ngay chương trình uV3 để nạp chip. Cách thức như sau:

Bạn vào: FlashàConfigure Flash Tools à

Chọn lại: <chỗ in đậm và gạch chân>

"DEVICE($D,$X) ERASE(DEVICE,PROTECTISP) HEXFILE("#H",NOCHECKSUMS,NOFILL,PROTECTISP) COM(1,7200) HARDWARE(KEILMCB900)"

Sau đó, mỗi lần nạp chương trình, bạn chỉ cần click chuột vào nút:  trên giao diện uV3 là OK.

v     Coi như phần cứng và phần mềm như thế là quá ổn rồi phải không bạn? Bây giờ thì ta vào phần lập trình cho con LPC922. <?!?Tôi còn quên một điều nữa: bạn nên dành thời gian đọc cuốn: C Primer (trong CD1: Ebooks và CD3: MCU đều có! Ấn bản mới: ‘Sams - C Primer Plus 3rd Edition’ và ‘Sams - C++ Primer Plus, Fourth Edition’)> Coi như đấy là một Primer để bạn có thể sử dụng C trong lập trình cho vi điều khiển.

v     Bạn tạo một New Project rồi chứ? Nếu chưa, bắt đầu ngay đi, đặt tên Project ấy là: “Kiem_tra”,<Bạn có thể load phần chương trình tại đây> ở đây, tôi dùng thí dụ kinh điển mà lâu nay bất cứ khi nào, dù bạn học một ngôn ngữ lập trình nào, cũng bắt đầu như vậy:

+Chọn Device là P89LPC922, nhấn OK.

 

   

 

 

+Chọn Yes!

+Bạn nhấp chuột phải vào Source Group 1, add hai files kèm theo sau vào thư mục: “Source group 1” : uart.c và mainc.c, biên dịch và nạp nó  vào con MCU P89LPC922 của bạn. Tất nhiên, trước đó, bạn phải vào

            Dùng Terminal của FlashMagic, chọn tốc độ baud là 115.200 Nhấn OK.

Cho tôi biết bạn thấy gì nào? Có phải như hình dưới đây?         

    +Chúc mừng bạn! Đã có kết quả rồi đấy, đơn giản quá phải không nào? Bây giờ tôi đi ngược lại phân tích các đoạn code đã viết nhé!

o       Bắt đầu hàm main (phần chính chương trình):

§     uart_init() là hàm khai báo khởi tạo cổng thu phát nối tiếp bất đồng bộ, bạn có thể dùng CodeArchitect để tạo đoạn code này.

§     Dòng thứ 7: TI=1; đặt cờ phát (transmite), báo hiệu sẽ có truyền phát.

§     Dòng thứ 8 và thứ 9: Nội dung bạn muốn hiển thị lên màn hình (Vi điều khiển đưa lên)

§     Dòng thứ 10: Quá trình thu phát kết thúc, TI=0.

§     Dòng thứ 11: không làm gì cả và ở dừng tại câu lệnh này.

Chương trình CodeArchitect: là phần mềm hỗ trợ lập trình cho MCU P89 (và họ P87-online) sinh các đoạn code cơ bản về phần khai báo, khởi động, các chức năng cơ bản của MCU. Ví dụ, với P89LPC922 của Philips: WDTimer, Clock, … (Bạn tự vào xem chi tiết)

+    Bây giờ, để phục vụ mục đích cụ thể của mình (truyền phát UART) bạn click chuột vào UART. Chọn các thông số cần thiết:

·        CPU Clock Frequency (MHz)  :        7.3728

·        Desired baud rate               :        115200

·        Use Baud Rate Generator     :       

·        Bạn có thể chọn thêm các thông số khác tùy mục đích sử dụng, sau đó nhấn nút:       

i                  Chương trình sẽ tự động sinh ra 2 file: uart.h và uart.c, với mục đích sử dụng của mình, tôi khai báo lại các hàm sử dụng trong uart.h và uart.c:

i                  Trong uart.h, do chỉ sử dụng hàm uart_init() và ngắt thu-phát nên có thể chỉnh sửa lại:

/***********************************************************************
MODULE:    UART
VERSION:   1.04
CONTAINS:  Routines for controlling the UART peripheral on the Philips
           P89LPC922
COPYRIGHT: Embedded Systems Academy, Inc. - www.esacademy.com
LICENSE:   May be freely used in commercial and non-commercial code
           without royalties provided this copyright notice remains
           in this file and unaltered
WARNING:   IF THIS FILE IS REGENERATED BY CODE ARCHITECT ANY CHANGES
           MADE WILL BE LOST. WHERE POSSIBLE USE ONLY CODE ARCHITECT
           TO CHANGE THE CONTENTS OF THIS FILE
GENERATED: On "Nov 19 2005" at "07:59:15" by Code Architect 2.11
***********************************************************************/
 
#ifndef _UARTH_
#define _UARTH_
/*Không dùng hàm này, xóa
/***********************************************************************
DESC:    Transmits a 8-bit value via the UART in the current mode
         May result in a transmit interrupt if enabled.
RETURNS: Nothing
CAUTION: uart_init must be called first
************************************************************************/
extern void uart_transmit
  (
  unsigned char value    // data to transmit
  );
 
/***********************************************************************
DESC:    Gets a received 8-bit value from the UART
RETURNS: Received data
CAUTION: uart_init must be called first
************************************************************************/
extern unsigned char uart_get
  (
  void
  );
*/
 
//Dùng hàm này, chép code vào chương trình chính
/***********************************************************************
DESC:    Initializes UART for mode 1
         Baudrate: 115200
RETURNS: Nothing
CAUTION: If interrupts are being used then EA must be set to 1
         after calling this function
************************************************************************/
extern void uart_init(void);
 
#endif // _UARTH_
 

    Ta sẽ được như sau:

#ifndef _UARTH_
#define _UARTH_
/***********************************************************************
DESC:    Initializes UART for mode 1
         Baudrate: 115200
RETURNS: Nothing
CAUTION: If interrupts are being used then EA must be set to 1
         after calling this function
************************************************************************/
extern void uart_init
  (
  void
  );
 
#endif // _UARTH_
 
	Sao lưu file này dưới định dạng uart.h
 Trong file uart.c, bạn cũng chỉ lấy các đoạn code cần thiết cho chương trình biên dịch của mình, sau đó, bạn sao lưu dưới định dạng uart.c.
 Sau đó, bạn cần phải biên soạn chương trình chính, có dạng: void main (void){//viết code ở đây} 
Trong chương trình chính này, bạn cần các phần khai báo, khởi tạo và chương trình hoạt động cho vi điều khiển như trên tôi đã phân tích.
                    Viết xong, bạn chưa cần nạp xuống vi điều khiển vội, hãy nhấn vào biểu tượng:  để tiến hành chạy mô phỏng trước. 
Cửa sổ chương trình mô phỏng:
 
	Mũi tên vàng chỉ chương trình đang ở phần nào. Ví dụ ở đây, khởi tạo vào chương trình uart_init() trước tiên.
	Bạn có thể xem chức năng các  biểu tượng  để tùy mục đích sử dụng, ngoài ra, bạn có thể vào: 
Peripherals trên thanh menu để xem thêm các chức năng.
                    Để kiểm tra kết quả của thí dụ bạn đang làm, click vào biểu tượng:  để xem:
                    Ví dụ tôi bấm Run () để chạy cả chương trình, sau đó nhấn , sẽ xuất hiện màn hình:
        Đấy chẳng phải là kết quả khi ta nối với máy PC đó sao?
               Để kiểm tra thời gian chạy thực của từng hàm, bạn nhấn vào biểu tượng , nhấp chuột phải chọn hàm muốn kiểm tra, 
sau đó cho chạy lại chương trình, sẽ có kết quả, ví dụ, ở đây:
 
 
 
        Nhấp chuột vào từng cột thời gian, sẽ có thống kê cho bạn.
 
Kết cho phần này: Sao bạn? Bạn có chút ít nào thay đổi quan điểm khi tiếp xúc với một chương trình tựa như vầy không? 
	Trước đây, với 8051 kinh điển, tôi sử dụng 8051IDE để chạy mô phỏng, kết quả cũng khá tốt! 
	Tuy nhiên, qua sử dụng nhiều phần mềm khác nữa, tôi thấy nên sử dụng chương trình này (uV3) để mô phỏng và biên dịch, kể cả với họ AT89C51, và cả khi bạn viết bằng hợp ngữ. 
	Cách thức làm với hợp ngữ có đôi chút khác biệt, tôi cũng xin đưa ra ở đây, ví dụ với P89LPC922:
·  Khi tạo New Project, nếu chưa cần thiết, bạn không cần add file Start900.a51 vào.
·  Bạn add các file ASM vào Source Group1. Lưu ý, khi đó, bạn cần ADD thêm tập tin định nghĩa các thanh ghi SFR của 922 (Tệp: ‘reg922.h’), thông thường, nó ở thư mục: ..Keil/c51/INC/Philips/reg922.h.
·  Sau đó, tiến hành chạy Debug và biên dịch, sẽ chẳng có gì trở ngại cả!
 
Ghi chú:
·  Bạn vào trang http://www.esacademy.com/software/flashmagic để load chương trình FlashMagic mới nhất.
·  Bạn vào trang: http://www.codearchitect.org/philips để load phần mềm tạo code cho họ P89 của Philips.
·  Bạn vào trang: http://khvt.com/mcu/software/ để load Keil uV3
Các phần mềm này đều có dung lượng khá lớn, và bạn nên dùng một chương trình hỗ trợ download như FlashGet.
 
 
       Bài sau, sẽ có ví dụ dùng UART đưa tín hiệu đếm xung từ Counter 1 trong một khỏang thời gian TS được quy định bởi WDTimer lên PC. Trong khi đó Timer 0 làm nhiệm vụ điều xung với tín hiệu điều xung được điều khiển từ bộ PID số cải tiến. 
<Điều khiển động cơ DC vòng kín bằng bộ PID cải tiến>
 

[Lên đầu trang]

 

© 2005 Bùi Trung Hiếu (http://www.khvt.com) Cập nhật lần cuối vào lúc 03:21:14 CH ngày 08/07/2006