- Dựa trên giá trị trả về và các hệ số đọc đƣợc ở bƣớc 1, tính giá trị nhiệt độ và áp suất tƣơng ứng.
Chi tiết về làm việc với đầu đo áp suất MS5535 xin xem thêm phần tham khảo [13] và chƣơng trình ở phần phụ lục.
3.2.2 Ghép nối với cảm biến nhiệt độ dạng tƣơng tự
ADCi: ADC0, ADC1, ADC2
Các lối vào AD0, AD1, AD2 của CC1010 có điện áp tham chiếu chọn là 1,25V hoặc VDD, sử dụng chung một ADC trên cơ sở hợp kênh lối vào. Thí dụ, trong hệ thống nói trên, lối ra của đầu đo nhiệt độ đƣợc đƣa tới AD0 và chƣơng trình khởi tạo qúa trình chuyển đổi tƣơng tự số qua ADC phải tiến hành bằng lệnh:
mov ADCON,#0Ch
tức là chọn kênh AD0, điện áp tham chiếu 1,25V internal, bộ biến đổi ADC ở chế độ hoạt động (active ADC). Lệnh bắt đầu chuyển đổi ADC:
setb ADCRUN
Khi ADC thực hiện xong việc chuyển đổi tƣơng tự-số, bit ADCRUN đƣợc xóa tự động. Thời gian đợi chuyển đổi thể hiện qua việc quét bit ADCRUN:
jb ADCRUN,$
Giá trị chuyển đổi đọc ở 2 thanh ghi ADDATL(7:0) và ADDATH(9:8). Giá trị đọc đƣợc từ 0 đến 1023 tƣơng ứng với điện áp lối vào từ 0 vôn đến 1,25 vôn.
Chƣơng trình thực hiện
Chƣơng trình đọc giá trị ADC thực hiện theo các bƣớc sau:
Cảm biến CC1010
VDD VDD
GND GND
ADCi
Bƣớc 1: Khởi tạo ADC
- Đặt bộ biến đổi ADC về chế độ single. - Đặt điện áp tham chiếu là 1,25V
Bƣớc 2: Đọc giá trị ADC - Chọn kênh ADC - Ra lệnh đọc ADC
- Chờ cho ADC biến đổi xong - Đọc giá trị chuyển đổi
3.3 Kết luận:
Chức năng cảm nhận là một trong những chức năng chính của một nút mạng trong WSN. Do đó nút mạng cần phải có khả năng ghép nối đƣợc với nhiều loại cảm biến khác nhau.
Chƣơng III đã giới thiệu tổng quan về cảm biến nói chung và các bƣớc cụ thể để giao tiếp giữa vi điều khiển và cảm biến số nối tiếp. Đồng thời đã xây dựng đƣợc cách làm việc cụ thể với cảm biến áp suất MS5535 cũng là loại cảm biến số nối tiếp. Việc giao tiếp giữa cảm biến số nối tiếp đƣợc thực hiện qua các chân cổng của CC1010. Còn việc giao tiếp giữa cảm biến tƣơng tự với vi điều khiển đƣợc thực hiện qua 3 lối vào tƣơng tự của CC1010, đó là các chân AD0, AD1, AD2. Qua đó cho thấy rằng CC1010 hoàn toàn có thể làm việc đƣợc với nhiều loại cảm biến khác nhau, bao gồm cả cảm biến tƣơng tự và cảm biến số.
CHƢƠNG 4 PHẦN MỀM NHÚNG
4.1 Phần mềm nhúng
4.1.1 Tổng quan về phần mềm nhúng
Phần mềm nhúng đang có những bƣớc đột phá mới, tạo ra những cuộc cách mạng triệt để trong tƣơng lai. Lý do của sự phát triển này xuất phát từ những nhu cầu bức thiết của thực tế và những bƣớc tiến mạnh mẽ trong công nghệ phần cứng. Một phần mềm nhúng phải kết hợp chặt chẽ với môi trƣờng của nó bao gồm phần cứng và các hệ thống liên quan. Nó có những ràng buộc về tốc độ xử lý, dung lƣợng bộ nhớ và mức tiêu thụ điện năng... Một phần mềm nhúng tốt là phần mềm phải đảm bảo các yếu tố trên và đó cũng là hƣớng phát triển quan trọng của các phần mềm nhúng. Điểm mấu chốt của các phần mềm nhúng ngày nay là việc lựa chọn các phƣơng pháp thực thi của một chức năng giống nhƣ một thành phần phần cứng nhƣng theo một cách riêng. Vì vậy mà không thể bỏ đi các tính năng “cứng” của phần mềm nhƣ các phần mềm truyền thống khác. Một phần mềm nhúng ngày nay đƣợc phát triển theo cách sau:
o Liên kết phần mềm nhúng từ dƣới lên trên, từ các lớp trừu tƣợng đến các chức năng hệ thống.
o Liên kết phần mềm nhúng với các nền lập trình đƣợc - các nền hỗ trợ nó cung cấp các phƣơng tiện cần thiết để đánh giá xem các ràng buộc đƣa ra có thỏa mãn hay không.
Để làm đƣợc nhƣ vậy thì thực chất cần phải phát triển các kỹ thuật hình thức ở mức trừu tƣợng để có những đánh giá sớm cùng với các nhóm công cụ và phƣơng pháp đúng đắn. Mặt khác cũng cần phải xem xét phần mềm nhúng và kiến trúc phần cứng của nó trong một tổng thể cân đối. Do phải thỏa mãn nhiều yếu tố khác nhau về phần cứng, môi trƣờng, giá thành, hiệu năng nên tồn tại nhiều thách thức trong phát triển phần mềm nhúng ngày nay, nhƣ:
o Đồng thiết kế phần cứng, phần mềm.
o Xây dựng mô hình các thuộc tính phi chức năng.
o Chuyển đổi các phần mềm thành các dịch vụ thông qua các thành phần phần mềm.
o Kiến trúc hệ thống và kiến trúc phần mềm.
o Đánh giá và kiểm định mức hệ thống.
o Tƣơng thích phần cứng và phần mềm nhờ các cấu trúc có thể định cấu hình lại và các thành phần Plug and Play.
o Xây dựng các hệ thống có khả năng tổ hợp đƣợc nhờ các thành phần phần mềm có thể tái sử dụng.
4.1.2 Các bƣớc cơ bản xây dựng một phần mềm nhúng
Phần mềm nhúng viết cho các họ vi xử lý có thể sử dụng các ngôn ngữ khác nhau nhƣ C/C++ hoặc Assembler. Tuỳ theo tiêu chí xây dựng hệ thống mà lựa chọn ngôn ngữ thích hợp. Từ đó cũng chọn chƣơng trình dịch thích hợp. Ngày nay, do nhu cầu phát triển hệ thống nhanh, bảo trì dễ dàng nên ngôn ngữ đƣợc lựa chọn thƣờng là ngôn ngữ cấp cao nhƣ C/C++.
Quy trình xây dựng một phần mềm bất kỳ thƣờng trải qua các bƣớc sau: - Tìm hiểu bài toán
- Phân tích
- Thiết kế
- Viết chƣơng trình - Kiểm thử
Việc xây dựng phần mềm nhúng cũng tuân theo trình tự các bƣớc nhƣ trên. Ngoài ra, phần mềm nhúng còn có đặc trƣng là làm việc trực tiếp với phần cứng. Do đó để kiểm soát quá trình làm việc với các thành phần chấp hành có đúng đắn hay không là điều đặc biệt quan trọng.
4.1.3 Phần mềm nhúng viết cho CC1010
Phần mềm nhúng viết cho CC1010 đƣợc viết bằng ngôn ngữ C, sử dụng các thƣ viện cho CC1010 do hãng Chipcon cung cấp, chƣơng trình biên dịch Keil uVision 2.0
Chƣơng trình dịch Keil uVision 2.0 do hãng Keil Elektronik GmbH xây dựng là một môi trƣờng phát triển tích hợp (IDE) dùng để xây dựng các chƣơng trình cho các họ VĐK tƣơng thích 8051 của Intel. Đây là bộ chƣơng trình dịch cho phép ngƣời viết chƣơng trình soạn thảo chƣơng trình, dịch chƣơng trình và gỡ lỗi trên cùng một môi trƣờng. Chƣơng trình dịch hỗ trợ cho cả ngôn ngữ C và Assembly.
Hãng Chipcon cũng cung cấp bộ thƣ viện CC1010IDE hỗ trợ cho việc xây dựng phần mềm cho VĐK CC1010. Đây là bộ thƣ viện giúp cho việc xây dựng chƣơng trình cho CC1010 đƣợc dễ dàng và nhanh chóng.
CC1010IDE dựa trên công cụ phát triển “uVision2” của hãng Keil ™ Elektronik GmbH. Công cụ này cung cấp một khung (framework) cho hầu hết các đặc điểm của CC1010IDE và cũng hỗ trợ hầu hết cho các VĐK họ 8051. Trình soạn thảo là một công cụ chủ yếu để soạn thảo các file nguồn và file hợp ngữ. Nó cũng cung cấp các chức năng trợ giúp khác nhƣ giao diện đồ hoạ (Graphic User Interface - GUI), cần cho mô phỏng/gỡ lỗi (mã lệnh dạng hợp ngữ, thanh ghi, bộ nhớ, các cửa sổ theo dõi, bƣớc lệnh, …). Thêm vào đó, IDE cũng cung cấp các giao diện với thƣ viện liên kết động (Dynamic Linking Library – DLL) đƣợc sử dụng để mô phỏng và gỡ lỗi trên mạch. Một điểm đặc biệt của bộ dịch là có thể chuyển các file nguồn đƣợc viết bằng C sang dạng hợp ngữ, để sau đó có thể tối ƣu hoá mã lệnh. Dạng hợp ngữ sau đó đƣợc chuyển thành các file đối tƣợng (mã máy hoặc dữ liệu nhị phân). Cuối cùng, bộ liên kết đƣa ra dạng file thực thi dạng Intel HEX và có thể nạp vào bộ nhớ Flash của VĐK.
Các file định nghĩa phần cứng - Hardware Definition Files (HDF)
Các file định nghĩa phần cứng định nghĩa địa chỉ các thanh ghi, ánh xạ vectơ ngắt và các hằng số phần cứng khác. Chúng cũng thƣờng dùng các macro cho CC1010EB, và các định nghĩa hỗ trợ hợp ngữ và ngôn ngữ C.
Thƣ viện phần cứng - Hardware Abstraction Library (HAL)
Để hỗ trợ việc phát triển chƣơng trình nhanh chóng và dễ dàng, Chipcon cung cấp thƣ viện các macro và các hàm truy cập phần cứng C1010 dễ dàng. Những thƣ viện này nằm trong Thƣ Viện Phần Cứng (HAL) và thi hành một giao tiếp phần cứng trừu tƣợng đối với chƣơng trình ngƣời dùng. Nhờ đó chƣơng trình ngƣời dùng có thể truy cập ngoại vi của vi điều khiển, thông qua các lời gọi hàm/macro, mà không cần hiểu chi tiết về phần cứng.
Thƣ viện HAL hỗ trợ các chức năng sau: - Truyền nhận không dây
- Đo cường độ RSSI
- Truyền nhận RS232
- Làm việc với ADC
- Xử lý thời gian thực - Mã hoá DES - Thiết lập các bộ định thời - Làm việc với các cổng Chƣơng trình ứng dụng Các file định nghĩa phần cứng (Hardware definition file - HDF) Thƣ viện phần cứng
(Hardware abstraction library – HAL) Thƣ viện tiện ích Chipcon
(Chipcon utility library-CUL) Thƣ viện C
Thƣ viện tiện ích Chipcon - Chipcon Utility Library (CUL)
Bên cạnh module HAL CC1010IDE cũng cung cấp một thƣ viện cho truyền thông RF đặt trong Thƣ Viện Tiện Ích (CUL). Thƣ viện này thƣờng dùng cho các ứng dụng RF điển hình, và cung cấp một giao thức RF đầy đủ.
Thƣ viện CUL hỗ trợ các chức năng sau: - Truyền nhận không dây
- Tính toán Mã dư vòng (CRC)
- Xử lý Thời gian thực (Realtime Clock)
Cả hai thƣ viện HAL và CUL đều hỗ trợ Truyền nhận không dây và xử lý thời gian thực. Tuy nhiên, các hàm ở thƣ viện CUL làm việc ở mức cao hơn, ngƣời viết chƣơng trình cũng dễ dàng và tiện lợi hơn, nhƣng bù lại cũng kém mềm dẻo hơn so với sử dụng các hàm ở thƣ viện HAL. Do vậy, đối với những ứng dụng đòi hỏi sự phức tạp thì thƣờng dùng thƣ viện HAL.
Phần mềm WSN viết cho CC1010
Phần mềm viết cho nút mạng cho WSN cần thực hiện những chức năng cơ bản sau:
o Cảm nhận
o Tính toán
o Truyền thông
Một thách thức là phải thực hiện tất cả những công việc trên vào một VĐK bị ràng buộc về mặt tài nguyên. Điều đó đòi hỏi chƣơng trình viết càng ngắn và càng tốn ít bộ nhớ càng tốt, trong khi vẫn đảm bảo việc viết chƣơng trình nhanh, bảo trì và nâng cấp dễ dàng.
Việc thực hiện cảm nhận và tính toán đã đƣợc đề cập chi tiết tại chƣơng III. Còn thực hiện việc truyền thông, chƣơng trình sử dụng các hàm trong bộ thƣ viện HAL của Chipcon.
o Khởi tạo RF: thiết lập tần số RF, tốc độ truyền, cách điều chế tín hiệu, công suất phát. Trong chƣơng trình cụ thể, các thông số trên lần lƣợt có giá trị là: 868MHz, 2.4kb/s, mã hoá Manchester, 4 dBm. Các khai báo này đƣợc đặt trong một cấu trúc RF_SETTINGS đƣợc khai báo nhƣ sau:
RF_RXTXPAIR_SETTINGS code RF_SETTINGS = {
0x4B, 0x2F, 0x15, // Modem 0, 1 and 2: Manchester, 2.4 kBaud 0x75, 0xA0, 0x00, // Freq A
0x58, 0x32, 0x8D, // Freq B 0x01, 0xAB, // FSEP 1 and 0 0x40, // PLL_RX 0x30, // PLL_TX 0x6C, // CURRENT_RX 0xF3, // CURRENT_TX 0x32, // FREND 0xFF, // PA_POW 4dBm 0x00, // MATCH 0x00, // PRESCALER };
Việc khởi tạo RF theo các bƣớc trình tự sau:
halRFCalib(&RF_SETTINGS, &RF_CALDATA); //chuẩn hoá RF
INT_GLOBAL_ENABLE (INT_OFF); //cấm ngắt toàn cục
INT_SETFLAG (INUM_RF, INT_CLR); //xoá ngắt RF
INT_PRIORITY (INUM_RF, INT_HIGH); //mức ƣu tiên ngắt RF là cao
RF_SET_BYTEMODE(); //RF hoạt động ở chế độ byte
RF_SET_PREAMBLE_COUNT(PREAMBLE_BYTE_COUNT); //thiết lập số
RF_SET_SYNC_BYTE(RF_SUITABLE_SYNC_BYTE);//thiết lập byte đồng bộ MODEM1=(MODEM1&0x03)|0x24; //lọc trung bình
// Reset preamble detection PDET &= ~0x80;
PDET |= 0x80;
INT_ENABLE (INUM_RF, INT_OFF); //cấm ngắt ngắt RF INT_GLOBAL_ENABLE (INT_ON); //cho phép ngắt toàn cục
o Nhận dữ liệu RF: việc nhận dữ liệu RF thông qua ngắt. Mỗi khi nhận đƣợc một byte, VĐK sinh ra một ngắt. Chƣơng trình xử lý ngắt có nhiệm vụ đƣa byte này vào một bộ đệm. Khi toàn bộ gói tin đã nhận xong, ngắt này bị cấm để chờ xử lý xong bộ đệm.
Quá trình nhận một byte từ bộ đệm RFBUF vào bộ đệm chƣơng trình nhƣ sau: //nhận một byte từ RFBUF vào bộ đệm rf_rx_buf tại vị trí rf_rx_index;
rf_rx_buf[rf_rx_index] = RF_RECEIVE_BYTE();
rf_rx_index++; //tăng chỉ số lên 1
Byte đầu tiên của bộ đệm chƣơng trình rf_rx_buf[0] lƣu độ dài gói tin. Việc nhận dữ liệu kết thúc khi rf_rx_index bằng giá trị độ dài gói tin, nghĩa là:
rf_rx_index = rf_rx_buf[0];
Sau khi toàn bộ gói tin RF đã nhận đƣợc, chƣơng trình sẽ phân tích gói tin, lọc ra các dữ liệu cần thiết. Nếu là nút Master, nó sẽ truyền dữ liệu nhận đƣợc về PC qua cổng RS232. Nếu là Slave, nó sẽ thực hiện việc cảm nhận, tính toán rồi truyền dữ liệu về Master.
o Truyền dữ liệu RF: việc truyền dữ liệu RF đƣợc thực hiện bởi các hàm/macro trong thƣ viện HAL của Chipcon nhƣ sau:
halRFSetRxTxOff(RF_TX, &RF_SETTINGS, &RF_CALDATA);//turn on TX
RF_START_TX(); //bắt đầu truyền
halRFSendPacket(PREAMBLE_BYTE_COUNT,&txDataBuffer[0], 4); //truyền dữ liệu tại txDataBuffer với độ dài là 4
halRFSetRxTxOff(RF_RX,&RF_SETTINGS,&RF_CALDATA);//turn on
//RX
RF_START_RX(); // bắt đầu chế độ nhận INT_SETFLAG (INUM_RF, INT_CLR); //xoá cờ ngắt RF INT_ENABLE (INUM_RF, INT_ON); //cho phép ngắt RF
4.1.4 Gỡ lỗi 4.1.4.1 Giới thiệu
Gỡ lỗi là một phần không thể thiếu khi phát triển phần mềm, đặc biệt là phần mềm nhúng. Việc gỡ lỗi cẩn thận, chi tiết giúp cho phát hiện những lỗi chƣơng trình mà ngƣời viết nhiều khi không lƣờng hết đƣợc, điều đó giúp cho chƣơng trình có độ ổn định và tin cậy cao. Ngoài việc kiểm tra tính đúng đắn của thuật toán hay các kết quả nhận đƣợc sau khi xử lý dữ liệu nào đó, gỡ lỗi còn cho phép biết cụ thể sự làm việc giữa chƣơng trình với thành phần chấp hành tại từng tình huống cụ thể. Điều đó cho phép ngƣời viết chƣơng trình biết đoạn chƣơng trình đó có đúng theo thiết kế hay không.
Có ba dạng gỡ lỗi đang đƣợc dùng phổ biến, đó là: - Giám sát ROM (ROM Monitor)
- Mô phỏng trên mạch (In-circuit Emulator) - Gỡ lỗi trên chip (On-chip debug)
Trƣớc khi xét từng trƣờng hợp cụ thể trên, hãy xét các định nghĩa sau:
Code Dowload nạp chƣơng trình từ PC xuống bộ nhớ hệ thống đích (RAM hoặc flash ROM) với mục đích là thực thi chƣơng trình
CodeBreakpoints Cho phép dừng chƣơng trình thực thi khi lệnh đã chỉ ra đƣợc thực hiện. Breakpoints thƣờng hoạt động bằng cách chèn một lệnh đặc biệt tại vị trí cần theo dõi (còn đƣợc gọi là Software breakpoints) hay giám sát các bus của vi điều khiển sử dụng một bộ so sánh và dừng chƣơng trình khi một lệnh cụ thể đƣợc thực hiện (Hardware breakpoints)
Data Access Breakpoints. Cho phép dừng chƣơng trình khi một vị trí bộ nhớ đƣợc truy cập để đọc hay ghi.
Complex/Advanced Breakpoints. Cho phép mô tả breakpoints ví dụ một dải địa chỉ đƣợc chỉ ra hay một mặt nạ đƣợc sử dụng cho phép thiết lập các điều kiện “không quan tâm”. Hơn nữa, một breakpoint chỉ xuất hiện khi một chuỗi các sự kiện đã định nghĩa trƣớc xảy ra, ví dụ khi thực hiện một lệnh cho trƣớc theo sau bởi một thao tác ghi dữ liệu tại địa chỉ xác định thì sẽ xác nhận breakpoint (nghĩa là dừng chƣơng trình)
Memory/Register Access. Cho phép trình gỡ lỗi đọc thanh ghi hay bộ nhớ.
“On-the-fly” Access. Các chức năng gỡ lỗi vẫn đƣợc hoàn thành trong khi vi điều khiển vẫn đang thực thi. Rất nhiều ứng dụng nhúng thực hiện điều khiển thời gian