CC1010 có hỗ trợ gỡ lỗi và dạng gỡ lỗi là dạng ROM Monitor. Bộ công cụ phát triển cho CC1010 bao gồm phần cứng và phần mềm. Phần cứng là module CC1010EB vừa làm nhiệm vụ điều khiển nạp chƣơng trình vào module CC1010EM, vừa làm nhiệm vụ hỗ trợ gỡ lỗi cho chƣơng trình. Phần mềm là bộ thƣ viện CC1010IDE đã giới thiệu ở trên, ngoài việc cung cấp các thƣ viện chƣơng trình còn cung cấp thƣ viện gỡ lỗi. Phần Monitor đƣợc nạp vào CC1010 phục vụ quá trình gỡ lỗi có tên là BootLoader có kích thƣớc 2322 byte. BootLoader phải đƣợc nạp vào CC1010 trƣớc khi thực hiện việc gỡ lỗi.
Ví dụ về gỡ lỗi cho CC1010: Code Breakpoints
Mục đích: Kiểm tra dạng xung Reset mà CC1010 phát tới cảm biến áp suất MS5535 có đúng theo yêu cầu hay không.
Giả sử hàm làm việc này là: void resetMS5535(). Xung reset là 2 chuỗi xung DIN và SCLK của MS5535 lệch pha nhau, mỗi chuỗi gồm 21 xung. Chƣơng trình dịch cụ thể là Keil uVision 2.0. Thiết bị kiểm tra là dao động ký số.
Trình tự các bƣớc nhƣ sau:
- Nối cáp từ cổng Parallell của PC với cổng Parallell của CC1010EM. Đây là cáp giao tiếp để nạp chƣơng trình.
- Nối cáp từ cổng RS232 của PC với cổng Serial 1 của CC1010EB. Đây là giao tiếp cho quá trình gỡ lỗi.
- Nạp chƣơng trình Bootloader vào CC1010EM.
- Kẹp đầu đo kênh 1 của dao động ký vào chân DIN của MS5535. - Kẹp đầu đo kênh 2 của dao động ký vào chân SCLK của MS5535.
- Đặt chế độ đo của dao động ký ở dạng trigger. Điều này giúp cho dao động ký dừng lấy mẫu khi lấy đƣợc 1 chùm xung.
- Đặt Code BreakPoint tại lời gọi hàm resetMS5535()
- Chạy chƣơng trình ở chế độ gỡ lỗi đến lời gọi hàm resetMS5535(), sau đó chạy qua lời gọi này một bƣớc rồi dừng lại (nhấn phím F10). Trên màn hình dao động ký sẽ xuất hiện dạng xung mà chƣơng trình vừa phát, qua đó sẽ biết dạng xung đó có đúng với dạng xung cần thiết hay không.
4.2 Kết luận
Chƣơng 4 đã giới thiệu tổng quan về phần mềm nhúng, các bƣớc xây dựng cũng nhƣ các thách thức khi phát triển một phần mềm nhúng.
Gỡ lỗi là một phần không thể thiếu khi phát triển phần mềm nói chung và phần mềm nhúng nói riêng. Nó sẽ góp phần xây dựng phần mềm nhúng đạt độ ổn định và tin cậy cao. Ở đây đã giới thiệu ba dạng gỡ lỗi, đó là: Giám sát ROM, Mô phỏng trên mạch, Gỡ lỗi On-chip, và phân tích ƣu nhƣợc điểm của từng dạng. Phần cuối cùng minh hoạ các bƣớc cụ thể khi gỡ lỗi cho chƣơng trình viết cho CC1010 dùng để đọc giá trị áp suất MS5535.
CHƢƠNG 5
TRIỂN KHAI CHỨC NĂNG MẠNG VÀ CÁC THỬ NGHIỆM
Việc thử nghiệm chức năng mạng đã thực hiện những công việc sau: - Thử nghiệm mạng gồm hai nút mạng:
Khảo sát quan hệ độ cao cột nƣớc - áp suất
Khảo sát độ ổn định của cảm biến áp suất theo nhiệt độ
Khảo sát khí áp tại khu vực Hà nội trong 10 ngày từ 08/06/2005 đến 18/06/2005
Kiểm tra làm việc dài ngày và mức tiêu thụ điện của hệ thống
- Thử nghiệm mạng gồm nhiều nút mạng:
Xây dựng mạng gồm 3 nhiều nút mạng, truyền thông theo dạng multihop
5.1 Thử nghiệm mạng gồm 2 nút mạng:
Sơ đồ tổ chức tổng quát của mạng này nhƣ sau:
Cảm biến VĐK có tích hợp thu phát RF (Slave) VĐK có tích hợp thu phát RF (Master) Máy tính RS232
5.1.1 Khảo sát quan hệ độ cao cột nƣớc – áp suất:
Module MS5535 đƣợc ghép với CC1010 và với phần mềm nhúng thích hợp sẽ tạo thành một điểm đo độc lập, tự động đo giá trị áp suất, nhiệt độ, xử lý dữ liệu thu đƣợc và truyền không dây định kỳ số liệu đo này về cho một CC1010 khác nối với máy tính xách tay hoặc máy tính để bàn. Sơ đồ ghép nối cụ thể MS5535 và CC1010 thể hiện trong hình 3.5.
Nhƣ đã chỉ ra trong hình 3.5, nguồn nuôi dùng chung cho MS5535 và CC1010, MCLK là tần số CC1010 cung cấp để MS5535 thực hiện biến đổi ADC, SCLK là tần số nhịp đồng bộ quá trình truyền và nhận giữa hai vi mạch này, tín hiệu DIN do CC1010 cung cấp, địa chỉ đến 6 hệ số bù nhiệt đƣợc nhà sản xuất chip chuẩn hoá và nhớ trong chip, địa chỉ đến dữ liệu nhiệt độ và dữ liệu áp suất riêng biệt. DOUT là lối ra các dữ liệu khác nhau của MS5535, tƣơng ứng yêu cầu của CC1010. Độ lớn giá trị tần số MCLK, SCLK, các giá trị địa chỉ dữ liệu, việc xử lý
CC1010EM CC1010EM CC1010EB RS232 Ống nƣớc Độ cao h Sensor áp suất MS5535 Không khí Nƣớc H1 1 H2
các loại dữ liệu đọc đƣợc đều do phần mềm nhúng trong CC1010 thực hiện. Phần mềm này còn thực hiện chức năng truyền/nhận dữ liệu không dây giữa hai CC1010 và truyền về máy tính. Giải thuật của phần mềm này cho trên hình 5.3.
Ý nghĩa của các bƣớc trong sơ đồ thuật toán:
Khởi tạo RF:
- Mã hoá dữ liệu: Manchester
- Tốc độ truyền dữ liệu: 2,4 kb/s
Khởi tạo ADC:
- Điện áp tham chiếu: 1,25 V internal
- 10 bit single.
Khởi tạo Timer:
Sử dụng Timer 2 ở chế độ điều chế độ rộng xung, tần số 29kHz, dạng xung vuông đối xứng. Xung này dùng làm Master Clock (MCLK) cho cảm biến áp suất MS5535.
Khởi tạo MS5535:
Khởi tạo các tham số:
- Khởi tạo RF, ADC, TIMER - Khởi tạo MS5535
Đọc 3 kênh ADC Đọc dữ liệu MS5535 Truyền dữ liệu không dây
Nhận dữ liệu không dây Truyền thông tin về máy tính
- Đƣa các chân SCLK và DIN của MS5535 về trạng thái 0 - Đọc các hệ số lƣu trong MS5535
Đọc 3 kênh ADC:
- Chọn kênh cần đọc
- Phát lệnh chuyển đổi ADC
- Chờ cho đến khi chuyển đổi ADC kết thúc
- Đọc giá trị ADC từ hai thanh ghi ADCDATH và ADCDATL
Đọc dữ liệu MS5535:
- Reset MS5535
- Gửi lệnh cho MS5535 để chọn tham số cần đọc: nhiệt độ hay áp suất. - Đọc dữ liệu trả lời từ MS5535
Chờ nhận lệnh từ máy tính:
Nếu có lệnh yêu cầu gửi dữ liệu về trung tâm, Slave sẽ đọc các tham số nhiệt độ áp suất rồi truyền về trung tâm.
Một thí nghiệm đơn giản nhƣ trình bày ở hình 5.2, những kết quả đo đƣợc cho trong bảng 3, đồ thị tƣơng ứng biểu diễn trên hình 5.4.
Bảng 3. Số liệu đo áp suất theo độ cao cột nƣớc
Độ cao (cm) (h=H1-H2) Áp suất (mbar) Lần 1 Lần 2 Lần 3 Lần 4 Lần 5 Trung bình 0 986 986 986 986 986 986 20 1012 1010 1010 1011 1011 1010.8 40 1031 1031 1031 1030 1030 1030.6 60 1054 1054 1052 1052 1052 1052.8
80 1069 1070 1070 1070 1070 1069.8 100 1088 1088 1088 1088 1088 1088 120 1111 1111 1111 1111 1111 1111 140 1127 1127 1127 1127 1127 1127 160 1149 1149 1149 1149 1149 1149 233 1214 1214 1214 1215 1215 1214.4 313 1290 1290 1290 1290 1290 1290
5.1.2 Khảo sát độ ổn định của phép đo áp suất khi thay đổi nhiệt độ
Đầu đo đƣợc đặt trong môi trƣờng nhiệt độ thay đổi từ 160C đến 420C và đo giá trị khí áp tại một vị trí, trong khoảng thời gian ngắn. Số liệu đo đƣợc phản ánh qua đồ thị tƣơng ứng cho trên hình 5.5.
Đồ thị quan hệ Độ cao-áp suất
0 50 100 150 200 250 300 350 0 200 400 600 800 1000 1200 1400 áp suất (mbar) đ ộ c a o ( c m )
5.1.3 Kiểm tra làm việc dài ngày và mức tiêu thụ điện của hệ thống
Trong CC1010, CPU, biến đổi ADC, truyền nhận RF, v.v…không làm việc đồng thời. Chu kỳ nghỉ và chu kỳ hoạt động có tần số nhịp khác nhau. Quản trị chặt chẽ quá trình này sẽ tiết kiệm đƣợc năng lƣợng tiêu thụ bởi hệ thống. CC1010 có 3 chế độ làm việc:
+ Tích cực (Active Mode), chế độ 8051 chạy bình thƣờng, xung Clock là tần số dao động của tinh thể thạch anh chính. Dòng tiêu thụ phụ thuộc vào tần số đó;
+ Chế độ nghỉ (Idle Mode): 8051 không hoạt động, các ngoại vi vẫn hoạt động bình thƣờng. Thoát ra khỏi chế độ nghỉ bằng: Ngắt (Interrupt), thiết lập lại (Reset), Tắt - bật nguồn;
+ Chế độ tắt nguồn (Power-Down Mode): 8051 và các ngoại vi không hoạt động, chỉ clock cho ADC hoạt động. Nó là chế độ tiết kiệm năng lƣợng nhất, thoát khỏi chế độ này bằng Reset hoặc Tắt - bật nguồn.
Thử nghiệm tiết kiệm năng lƣợng khi truyền giữa Master và Slave. Slave thu thập dữ liệu nhiệt độ, áp suất truyền cho Master. Thời gian nghỉ giữa 2 lần truyền là 30 phút. Nuôi Slave là pin điện thoại di động loại 3.6V-580mAh. Slave ở chế độ nghỉ, chỉ khi thu thập số liệu truyền cho Master, Slave mới ở chế độ tích cực, chu trình hoạt động theo giải thuật sau:
Hình 5.5. Độ ổn định của áp suất theo nhiệt độ
900 950 1000 1050 1100 1150 1200 0 10 20 30 40 50
Dòng tiêu thụ của Slave đo đƣợc nhƣ sau: không phát RF, chỉ thu thập số liệu, dòng 17mA, mất khoảng 5 giây do lấy số liệu trung bình 4 lần liên tiếp. Khi phát RF, không thu thập số liệu, dòng 35mA.
Với tốc độ truyền 2,4kb/s, mỗi gói tin dài 22 byte, thời gian truyền gói tin là: 22*8(bit)/2400 = 73ms.
Để Master nhận dữ liệu một cách tin cậy, Slave phát 5 gói tin cùng 1 nội dung, tổng thời gian phát là:
73*5 = 365ms ≈ 0,4s.
Chế độ nghỉ, dòng 0,5mA. Thời gian của chế độ này (tính trong vòng 1 giờ) là: 3600 - 2*5(giây) – 2*0,4 = 3589.2 s.
Nhƣ vậy, dòng tiêu thụ trung bình trong 1 giờ là:
(17*5*2 + 35*0,3*2 + 0,5*3589)/3600 = 0,55 mA ≈ 0,6mA. Thời gian hoạt động lý tƣởng của Slave với tính toán nhƣ trên là:
580/0.6 = 967 giờ = 40 ngày (thực tế có thể đạt 50% giá trị này).
- Khởi tạo ADC, RF, các tham số khác - Về chế độ nghỉ
- Wake up C1010 - Thu thập số liệu
- Phát số liệu cho Master - Trở về chế độ nghỉ
F
T
Đến thời điểm phát số liệu?
Với Master, việc tiết kiệm năng lƣợng không đặt thành vấn đề vì nó đƣợc đặt cùng máy tính ở trung tâm, nơi có sẵn nguồn điện lƣới. Sơ đồ hoạt động của Master nhƣ sau:
5.1.4 Khảo sát số liệu khí áp tại Hà nội
Việc khảo sát số liệu khí áp tại Hà nội đƣợc thực hiện liên tục trong vòng 10 ngày từ 08/06/2005 đến 18/06/2005 nhằm mục đích phục vụ dự báo thời tiết. Sau đây là kết quả khảo sát:
Bảng 4. Số liệu khí áp tại Hà Nội từ 08 đến 18/06/2005
Thời gian (giờ) Áp suất (mBar) Thời gian (giờ) Áp suất (mBar) Thời gian (giờ) Áp suất (mBar) 6:00 991 72:00 991 144:00 994 12:00 990 78:00 993 150:00 992 18:00 989 84:00 992 156:00 995 24:00 988 90:00 990 162:00 994 Khởi tạo: - Khởi tạo RF - Khởi tạo UART
- Khởi tạo các tham số khác
Chờ nhận dữ liệu từ Slave
Đã nhận xong
Truyền dữ liệu về máy tính
T
F
30:00 992 96:00 989 168:00 995 36:00 993 102:00 988 174:00 994 42:00 991 108:00 991 180:00 995 48:00 993 114:00 999 186:00 994 54:00 999 120:00 991 192:00 995 57:00 1004 126:00 990 198:00 993 60:00 990 132:00 989 204:00 993 66:00 987 138:00 990 210:00 994 216:00 995
Khí áp là thông số cơ bản để dự báo sự thay đổi thời tiết, đặc biệt khi biết sự thay đổi khí áp trong vòng một giờ dP/dt. Thông tin thay đổi khí áp liên quan đến thay đổi thời tiết đã đƣợc tổng kết nhƣ sau:
dP/dt > 2,5mb/h: khí áp cao mức trung bình, không ổn định
0,5mb/h < dP/dt < 2,5mb/h: Khí áp cao trong thời gian dài, thời tiết rất ổn định - 0,5mb/h < dP/dt < 0,5mb/h: Thời tiết ổn định
- 2,5mb/h < dP/dt < - 0,5mb/h: Khí áp thấp trong thời gian dài, trời mƣa liên tục
dP/dt < -2,5mb/h: khí áp thấp trung bình, dông tố, không ổn định.
Nhƣ vậy, từ kết quả đo có thể dự báo rằng sẽ có mƣa trong các ngày 10 và 12/06/ 2005.
5.2 Thử nghiệm mạng gồm nhiều nút mạng
Mạng đƣợc tổ chức theo sơ đồ hình cây theo dạng sau:
1 2 1 4 5 9 10 1 3 6 7 8 11 Master RS232 Hình 5.9. Mô hình mạng dạng cây
Master và Slave đều là Vi điều khiển CC1010
Master giao tiếp với máy tính trung tâm qua đƣờng RS232.
Các Slave giao tiếp với nhau hoặc với Master qua đƣờng truyền không dây
Master và Slave đều phải chứa toàn bộ topology của mạng, qua đó mỗi nút sẽ biết đƣờng đi để truyền gói tin đến đích.
Topology của mạng đƣợc xây dựng ngay từ lúc viết chƣơng trình. Khi một nút nhận đƣợc lệnh truyền từ nút cha, nó sẽ xem địa chỉ đích: - Nếu địa chỉ đích chính là nó, nó sẽ gửi dữ liệu về cho nút cha. - Nếu không, nó sẽ tìm trong bảng địa chỉ:
o Nếu tồn tại một đƣờng đi từ nó tới nút đích, nó sẽ chuyển tiếp gói tin tới chặng tiếp theo. Chặng tiếp theo chính là nút con của nó có khả năng tới đích.
o Nếu không tồn tại đƣờng đi thì không làm gì cả.
5.2.1 Biểu diễn cây trong bộ nhớ
Biểu diễn cây bằng danh sách các con của mỗi đỉnh
Với mỗi đỉnh của cây, ta thành lập một danh sách các đỉnh con của nó theo thứ tự từ trái sang phải. Ở đây ta sử dụng một mảng để lƣu giữ các đỉnh của cây. Mỗi thành phần của mảng là một tế bào chứa thông tin gắn với mỗi đỉnh và danh sách các đỉnh con của nó. Danh sách các đỉnh con của một đỉnh có thể biểu diễn bởi mảng hoặc bởi danh sách liên kết. Tuy nhiên, vì số con của mỗi đỉnh có thể thay đổi nhiều nên ta sẽ sử dụng danh sách liên kết. Nhƣ vậy mỗi tế bào mô tả của cây là một bản ghi gồm 2 trƣờng: trƣờng id là địa chỉ của nút mạng, trƣờng next là con trỏ trỏ tới danh sách các con của đỉnh đó. Giả sử các đỉnh của cây đƣợc đánh số từ 1 đến N. Với cách cài đặt này, ta có thể khai báo cấu trúc dữ liệu biểu diễn cây nhƣ sau:
#define N 11
{
int id;
node *next;
}
node tree[N];
Trong khai báo trên, Member biểu diễn các thành phần của danh sách các con, còn Node biểu diễn các đỉnh của cây. Với cách cài đặt này, cấu trúc dữ liệu biểu diễn cây trong hình trên đƣợc minh hoạ nhƣ sau:
1 2 3 4 . 5 6 . 7 8 . 9 . 10 . 11 . 2 3 . 4 5 . 6 7 . 9 10 . 11 id next id next
Ta có nhận xét rằng, trong cách cài đặt này, với mỗi đỉnh k ta xác định đƣợc ngay con trƣởng của nó. Chẳng hạn, với cây trong hình trên, con trƣởng của đỉnh 3 là đỉnh 6, con trƣởng của đỉnh 5 là đỉnh 9, còn đỉnh 6 không có con. Phép toán tìm con trƣởng EldestChild(k) có thể đƣợc mô tả nhƣ sau:
int EldestChild(int k, Tree T)
{ node *p; if(T[k]) { p = T[k].next; return pid; }
else return -1; //không tìm thấy con }
Tuy nhiên trong cách cài đặt này, việc tìm cha và em liền kề của mỗi đỉnh lại không đơn giản. Chẳng hạn, để tìm cha của đỉnh k, ta phải duyệt các danh sách các con của mỗi đỉnh. Nếu phát hiện ra trong danh sách các con của đỉnh m có chứa k