Lu đồ thuật toán của các chức năng chính

Một phần của tài liệu thiết kế hệ thống phần mềm cho C AT90S8535 (Trang 109)

4.2.1. Chức năng giao tiếp với LCD controller.

Để àC có thể giao tiếp đợc với LCD controller, ta cần thực hiện khởi tạo LCD controller ngay sau khi nguồn đợc bật. Do mục đích của đồ án, ta sử dụng cơ chế

Y N

để giao tiếp với LCD controller là LCD_BUSY, LCD_INSTR LCD_DATA. Lệnh đợc đặt trong thanh ghi Instr và dữ liệu trong thanh ghi Data.

Hình 4.3 : Lu đồ chơng trình kiểm tra LCD busy

Hình 4.4 : Lu đồ chơng trình ghi lệnh và dữ liệu tới LCD controller

Trang 110

BF = 1?

Bắt đầu

Cho phép đọc thanh ghi lệnh của LCD controller

(RS = 0, RW = 1)

Đọc 4 bit MSB của thanh ghi lệnh

Đọc 4 bit LSB của thanh ghi lệnh

Kết thúc

Bắt đầu

Cho phép ghi thanh ghi lệnh của LCD controller

(RS = 0, RW = 0) Ghi 4 bit MSB của mã lệnh tới thanh ghi lệnh

Kết thúc

Lấy 4 bit thấp của mã lệnh Ghi 4 bit LSB của mã lệnh tới thanh ghi lệnh

Bắt đầu

Cho phép ghi thanh ghi dữ liệu của LCD controller

(RS = 1, RW = 0) Ghi 4 bit MSB của byte dữ liệu tới thanh dữ liệu

Kết thúc

Lấy 4 bit thấp của byte dữ liệu Ghi 4 bit LSB của byte dữ liệu tới thanh dữ liệu

4.2.2. Chức năng điều khiển và hiển thị kết quả ADC.

Khi bộ ADC thực hiện xong một chu kỳ chuyển đổi, kết quả chuyển đổi sẽ đợc lu vào thanh ghi ADCL và ADCH, tiếp sau đó cờ ngắt kết thúc chuyển đổi

A/D đợc dựng và chơng trình con phục vụ ngắt tơng ứng là END_CONVERT

đợc gọi.

Hình 4.6 : Lu đồ chơng trình con phục vụ ngắt END_CONVERT

Trong ngắt END_CONVERT có sử dụng hai module MULL_RESULT_CONVER

DIVIDE_TO_GET_TEMPR đợc sử dụng để chuyển kết quả ADC sang số thập phân. Trớc khi thực hiện các module này cần phải xác định số nhân hoặc số chia trong thanh ghi Data. Chơng trình MULL_RESULT_CONVER sẽ thực hiện nhân nội (adsbygoogle = window.adsbygoogle || []).push({});

Bắt đầu

Lưu lại trạng thái MCU Lấy kết quả chuyển đổi A/D Lưu lại các thanh ghi cần sử dụng

Gửi ký hiệu truyền dữ liệu ( # ) sang PC

Lấy phần nguyên của kết quả ADC đặt vào ResultADCH

Thực hiện chương trình MULL_RESULT_CONVER vớisố nhân = 100 Thực hiện chuơng trinh DIVIDE_TO_GET_TEMPR với số chia = 255

Gửi phần nguyên của kết quả ADC sang PC

Lấy phần thập phân của kết quả ADC đặt vào ResultADCL

Thực hiện chương trình MULL_RESULT_CONVER vớisố nhân = 10 Thực hiện chuơng trinh DIVIDE_TO_GET_TEMPR với số chia = 255

Gửi phần thập phân của kết quả ADC sang PC

Dựng cờ báo cần hiển thị kết quả ADC ra giao diện LCD Lấy lại giá trị các thanh ghi sử dụng Lấy lại trạng thái MCU

ResultADCH và ResultADCL. Chơng trình DIVIDE_TO_GET_TEMPR thực hiện chia kết quả từ chơng trình MULL_RESULT_CONVER cho nội dung thanh ghi Data, phần nguyên của kết quả đặt trong thanh ghi ResultADCH, phần d của kết quả đặt trong thanh ghi ResultADCL.

Hình 4.7 : Lu đồ chơng trình MULL_RESULT_CONVER

Hình 4.8 : Lu đồ chơng trình DIVIDE_TO_GET_TEMPR

Trang 112

Bắt đầu

Xoá cờ carry ( C = 0 ) Khởi tạo các thanh ghi tạm

R11 = 0, R12 = ResultADCL Giảm số nhân đi một

Data  Data - 1 Kết thúc Data = 0? Y N ResultADCL  ResultADCL + R12 ResultADCH  ResultADCH + R11 + C Bắt đầu Xoá cờ carry ( C = 0 )

Khởi tạo các thanh ghi tạm R11  0, R12  0

ResultADCL  ResultADCL - Data ResultADCH  ResultADCH - R11 - C C  0

R12  R12+1

Kết thúc

N

Lấy phần nguyên của kết quả ResultADCH  R12

ResultADCL < Data? N

ResultADCH = 0? Y

Ngoài hai module trên, để hiển thị kết quả chuyển đổi A/D tới giao diện

LCD, cần sử dụng chơng trình con DISPLAY_TEMPR_TO_LCD chơng trình

này đợc gọi từ chơng trình điều khiển khi cờ báo có kết quả ADC cần đợc hiển thị. Dữ liệu đầu vào của chơng trình này là nội dung hai thanh ghi chứa kết quả A/D dới dạng số hệ 10 sau khi thực hiện ngắt END_CONVERT, trong đó phần nguyên chứa trong thanh ghi ResultADCH và phần thập chứa trong thanh ghi ResultADCL.

Hình 4.9 : Lu đồ chơng trình con DISPLAY_TEMPR_TO_LCD (adsbygoogle = window.adsbygoogle || []).push({});

Kết thúc Bắt đầu

Lấy toạ độ đầu Instr  $CB Lưu nội dung ResultADCL ResultADCL  ResultADCH ResultADCL  0

N

Show_CK = 1? Y Đổi giá trị nhiệt độ sang 0K

ResultADCH:ResultADCL  ResultADCH:ResultADCL + 273

Lấy số hàng trăm để hiển thị

Gọi chương trình DIVIDE_TO_GET_TEMPR với Data = $64

Y

ResultADCH = 0? N

Lấy mã ASCII của số cần hiển thị

Data  ResultADCH Data  Data + 30

Không hiển thị số hàng trăm

Data  $20

Hiện dữ liệu

Lấy số hàng chục để hiển thị

ResultADCH  0

Gọi chương trình DIVIDE_TO_GET_TEMPR với Data = $0A

Y

ResultADCH = 0? N

Lấy mã ASCII của số cần hiển thị

Data  ResultADCH Data  Data + $30 Hiện 0 ở hàng chục Data  $30 Hiện dữ liệu Hiện số hàng đơn vị Data  ResultADCL Data  Data + $30 Hiện dữ liệu

Hiện dấu chấm thập phân

Data  $2E

Hiện dữ liệu Hiện số thập phân

Lấy lại nội dung ResultADCL Data  ResultADCL

Data  Data + $30

4.2.3. Chức năng giao tiếp với KeyPad.

Chức năng giao tiếp với bàn phím đợc bắt đầu bằng việc giải mã ma trận bàn phím để xác định phím nào trên bàn phím đợc ấn. Để àC nhận biết có phím ấn, một yêu ngắt ngoài đợc xác định bằng mức thấp trên chân INT0 (PD2) đợc phát sinh và ngắt bàn phím SCAN_CODE đợc thực hiện. Trớc khi bắt thực hiện chơng trình con phục vụ ngắt, cần đặt 0 trên các hàng và đặt 1 trên các cột.

Hình 4.10 : Lu đồ ngắt SCAN_CODE giải mã ma trận bàn phím

Trang 114 (adsbygoogle = window.adsbygoogle || []).push({});

Bắt đầu

Lưu lại trạng thái MCU Keypress  0 Câm ngắt bàn phím Đợi 0.2ms cho cổng ổn định Col1 = 0? Y N Col2 = 0? Y N Col3 = 0? Y N Col4 = 0? Y N KeyPress  0 KeyPress  4 KeyPress  8 KeyPress  12

Đảo 4 bit của cổng B

Đưa 0 ra các cột vào đưa 1 ra các hàng Đợi 0.2ms cho các cột ổn định Row1 = 0? Y N KeyPress  KeyPress + 0 Row2 = 0? Y N KeyPress  KeyPress + 1 Row3 = 0? Y N KeyPress  KeyPress + 3 A B

Do mỗi một phím thờng trên bàn phím đợc mã hoá nhiều hơn một ký tự, vì vậy để xác định đợc chính xác ký tự nào đợc mã hoá của phím bị ấn đợc lựa chọn một thanh ghi OldKey đợc sử dụng. Nội dung của thanh ghi này chứa giá trị của phím đợc ấn và đợc dùng để so sánh với giá trị của phím đợc ấn trong thanh ghi KeyPress ở lần tiếp theo. Nếu hai thanh ghi này có giá trị bằng nhau thì tổng số lần ấn phím tăng lên 1 và ký tự tiếp theo đợc mã hoá bởi phím sẽ đợc chọn, ngợc lại phím đợc coi là ấn lần đầu tiên. Nội dung thanh ghi OldKey sẽ đ- ợc ghi nhớ trong một khoảng thời gian 200ms, nếu sau khoảng thời gian này mà phím không đợc ấn lại nội dung thanh ghi OldKey đợc xác lập lại trang thái không phím nào đợc ấn (OldKey = -1). Việc này đợc thực hiện bởi chơng trình phục vụ ngắt KEY_RATE của ngắt tràn TC1. Hình 4.11 : Lu đồ ngắt KEY_RATE Kết thúc Row4 = 0? Y N KeyPress  KeyPress + 4 A B KeyPress<10? N Y

Dựng cờ báo phím điều khiển

Dựng cờ báo có phím ấn

Cấn ngắt KEY_RATE

Lấy lại trạng thái MCU

Kết thúc

Lưu trạng thái MCU

Cấn ngắt KEY_RATE

Lấy lại trạng thái MCU

Bắt đầu

Tuỳ thuộc vào phím đợc ấn là phím điều khiển hay phím thờng mà chơng trình điều khiển sẽ thực hiện một trong hai chơng trình con DISPLAY_KEY

ứng với một phím thờng và CONTROL_KEY ứng với một phím điều khiển.

Hình 4.12 : Lu đồ chơng trình DISPLAY_KEY

Chơng trình con FIND_ASCII_CODE có chức năng tìm mã ascii tơng ứng với ký tự đợc lựa chọn và lu kết quả vào thanh ghi Data với số lần phím đ- ợc ấn lu trong 4 bit cao của thanh ghi điều khiển CtrlReg.

Hình 4.13 : Lu đồ chơng trình FIND_ASCII_CODE Trang 116 Bắt đầu Tăng tổng số lần ấn phím Xác định vị trí hiển thị và con trỏ LPtrTx KeyPress = OldKey? N Y A OldKey  KeyPress Tổng số lần ấn phím = 0 Số lần ấn phím = 4 ? N Y B Tổng số lần ấn phím = 0 CtrlReg  CtrlReg$0F Data  $38 Position  $58 Data  $37 Position  $55 Temp  0 CtrlReg  CtrlReg$0F Data  $39 Position  $19 A B Tổng số lần ấn phím = 0 CtrlReg  CtrlReg$0F Lấy tổng số lần ấn phím Temp  CtrlReg swap Temp Temp  Temp$0F Keypress<5? N C Y Keypress<3? N Y Keypress= 1? Y N Data  $31 Position  $43 Keypress= 2? Y Data  $32 Position  $46 N Data  $30 Position  $40 Keypress=4? N Y Data  $33 Position  $49 Data  $34 Position  $4C

Lấy mã ASCII của ký tự tương ứng

chương trình GET_ASCII_CODE Kết thúc C Keypress<7? Y N Keypress= 6? N Y Data  $35 Position  $4F Data  $36 Position  $52 Keypress= 8? Y N Temp= 3? N Y Temp  0

CtrlReg  CtrlReg$0F Keypress= 9? Y N Temp= 2? N Y Kết thúc Gọi chương trình FIND_ASCII_CODE

Hiện thông báo tràn bộ đệm TxBuff

Bắt đầu

LPtrTx = EndTxBuf+1? Y N

Tăng con trỏ cuối bộ đệm TxBuff LPtrTx  LPtrTx + 1

Hiện 15 ký tự cuối trong bộ đệm Gọi chương trình SHOW_CHAR_IN_TxBuff

Xác định vị trí hiển thị tiếp theo Hiện ký tự tương ứng phím ấn

Lưu ký tự vào bộ đệm TxBuff XL  LPTrTx, X  Data

Giảm con trỏ cuối bộ đệm TxBuff LPtrTx  LPtrTx - 1 (adsbygoogle = window.adsbygoogle || []).push({});

Chơng trình con GET_ASCII_CODE có chức năng lấy mã ascii và lu vào trong thanh ghi Data. Đầu vào của chơng trình là thanh ghi Data chứa mã ascii của chữ số và thanh ghi Position chứa mã ascii của ký tự đứng ngay trớc ký tự đầu tiên đợc mã hoá bởi phím. Ví dụ, phím số 1 mã hoá các ký tự 1, D,E và F, khi đó nếu phím số 1 đợc ấn thì Data chứa giá trị $30 (mã ascii của số 1) còn Position chứa giá trị $43 (mã ascii của ký tự đứng trớc chữ D). Tổng số lần ấn phím đợc đặt trong thanh ghi Temp.

Hình 4.14 : Lu đồ chơng trình GET_ASCII_CODE

Trớc khi hiển thị ký tự của phím đợc ấn ra màn hình LCD, chơng trình

DISPLAY_KEY, gọi chơng trình con SHOW_CHAR_IN_TxBuff để hiện thị lại 15 ký tự cuối cùng đợc lu trong bộ đệm TxBuff, nếu tổng số ký tự đang có trong bộ đệm TxBuff lớn hơn 15 ký tự.

Ngoài chơng trình DISPLAY_KEY đợc thực hiện khi một phím thờng đ- ợc ấn. Một chơng trình khác là chơng CONTROL_KEY sẽ đợc chơng trình điều khiển thực hiện mỗi khi một phím chức năng đợc ấn. Trên bàn phím có tất cả 6 phím chức năng nh trình bầy ở các phần trớc. Tuỳ thuộc vào việc giải mã bàn phím các chơng trình con tơng ứng với phím chức năng bị ấn sẽ đợc thực hiện.

Hình 4.15 :Lu đồ chơng trình CONTROL_KEY

Trang 118

Bắt đầu

Position  Position + Temp Data  Postion Temp = 0? Y N Kết thúc Kết thúc Bắt đầu Gọi chương trình BACK_SPACE KeyPress <13? N Y

Xoá cờ báo phím điều khiển

Y N Gọi chương trình SHIFT_LEFT N Y Gọi chương trình SEND_TxBUFF_TO_PC KeyPress =11? KeyPress =10? Gọi chương trình SELECT_TxRx Y N Gọi chương trình SHIFT_RIGHT N Y Gọi chương trình CLEAR_Tx_OR_Rx KeyPress =14? KeyPress =15?

4.2.4. Chức năng truyền nhận dữ liệu nối tiếp với PC.

Khi PC thực hiện truyền dữ liệu cho àC, thì mỗi khi àC hoàn thành việc nhận một byte dữ liệu từ cổng nối tiếp, cờ ngắt kết thúc nhận của bộ UART trên

àC AT90S8535 đợc dựng. Chơng trình con phục vụ ngắt tơng ứng là

Rx_COMPELET đợc thực hiện. Chơng trình này có nhiệm vụ phân biệt dạng dữ liệu nhận đợc từ PC là mã lệnh hay chuỗi ký tự hiển thị để báo cho chơng trình điều khiển thực hiện những tác vụ tơng ứng.

Hình 4.16 :Lu đồ ngắt Rx_COMPELET

Bắt đầu

Lưu lại trạng thái MCU Lưu thanh ghi cần sử dụng

Đọc dữ liệu nhận được Data  URD Mã lệnh? Y N Ký tự #? Y N CR? Y N Xác định địa chỉ cần lưu ký tự vừa nhận trong RxBuff

Ghi ký tự vừa nhận vào bộ đệm RxBuff

Xác định con trỏ hiển thị của chuỗi ký

tự

Lấy lại giá trị các thanh ghi Lấy lại trạng thái MCU

Lấy mã lệnh

Implement  Data nhận mã lệnhXoá cờ báo

Dựng cờ báo nhận mã lệnh

Dựng cờ báo cần hiển thị dữ liệu nhận được

Khi àC nhận đợc một lệnh từ PC gửi tới, thanh ghi chứa mã lệnh Implement sẽ chứa giá trị mã hoá của lệnh. Khi àC nhận đợc một lệnh từ CPU, chơng trình con EXCUTER_FROM_PC sẽ đợc gọi để thực hiện lệnh. Trong đồ án này, chơng trình trên PC chỉ có thể truyền hai lệnh đơn giản cho àC thực hiện là hiển thị giá trị nhiệt độ theo 0C hay 0K.

Hình 4.17 :Lu đồ chơng trình con EXCUTER_FROM_PC

Không chỉ có khả năng nhận dữ liệu từ PC, mà àC AT90S8535 cũng có thể gửi một chuỗi dữ liệu trong bộ đệm TxBuff sang PC tại bất kỳ thời điểm nào mỗi khi phím Send trên bàn phím đợc ấn. (adsbygoogle = window.adsbygoogle || []).push({});

Hình 4.18 :Lu đồ chơng trình SEND_TxBUFF_TO_PC

Trang 120

Bắt đầu

Xác lập lại nội dung thanh ghi mã lệnh Implement  -1 Hiển thị 0C? Y N Kết thúc Xoá cờ cho phép hiển thị theo độ K Dựng cờ cho phép hiển ký hiệu dạng nhiệt độ hiển thị

Dựng cờ cho phép hiển thị theo độ K Bắt đầu SelectRx? Y N Kết thúc TxBuff = 0? Y N

Hiện thông báo truyền dữ liệu Lấy địa chỉ đầu của bộ đệm

XL  LOW(TxBuff) Truyền dữ liệu sang PC

Chơng 5

Thiết kế hệ thống phần mềm trên PC

5.1. Mục đích của phần mềm trên PC.

Để hệ thống có thể giao tiếp đợc với máy tính, ta cần phải thiết kế một phần mềm trên máy tính để nó có thể giao tiếp đợc với àC. Điều này có nghĩa là ta phải thiết lập một hệ thống trao đổi dữ liệu giữ máy tính và àC, nhằm mục đích tạo ra một sự kết hợp giữa máy tính và àC để tạo nên một hệ thống hoàn chỉnh cho dù chúng ở cách xa nhau. Mặt khác, so với àC thì PC có nhiều khả năng xử lý dữ liệu với độ phức tạp cao, điều này làm cho hệ thống hoạt động một cách thực sự có hiệu quả.

Toàn bộ chơng trình phần mềm viết cho PC đợc thực hiện trên ngôn ngữ Visual C++ 6.0. Phơng pháp trao đổi dữ liệu giữa PC và àC đợc thực hiện theo phơng pháp truyền nối tiếp theo chuẩn RS232 nh đã trình bầy ở các chơng trớc. Sơ đồ tổng thể của chơng trình viết trên PC nh trên hình 5.1.

Hình 5.1 : Sơ đồ khối chơng trình viết trên PC

Sau khi chơng trình đợc khởi động, nó sẽ do tìm port nối tiếp và thiết lập kết nối với àC. Nếu kết nối không đợc thực hiện, thì thao tác truyền nhận dữ liệu giữa PC và àC sẽ không đợc thực hiện. Trong trờng hợp này, chơng trình chỉ thực hiện các thao tác với các thông tin đã đợc lu lại trên PC. Khi kết nối thành công chơng trình sẽ liên tục nhận dữ liệu đợc gửi từ àC, khi đó chơng trình sẽ thực hiện các xử lý tiếp theo tuỳ thuộc loại dữ liệu nhận đợc là thông tin hay giá trị nhiệt độ.

Trong trờng hợp chơng trình không tự động thực hiện đợc kết nối, ngời sử dụng có thể tự thực hiện kết nối khi cần thiết bằng cách gọi chơng trình thực hiện kết nối mới thông qua chức năng Configure\Set port to connect của Menu chính trong chơng trình.

Chương trình

Truyền thông tin sang

àC qua cổng RS232

Nhận dữ liệu từ giao diện nối tiếp RS232

Xử lý dữ liệu nhận được

Hiện thông tin

nhận được từ àC nhận được từ àCHiện dữ liệu

Lưu trữ dữ liệu nhận được

Hình 5.2 : Giao diện thiếp lập kết nối với àC

5.2. Một số chức năng chính của chơng trình

Sau khi kết nối đợc thực hiện, kết quả chuyển đổi A/D của àC sẽ đợc gửi liên tục sang PC. Khi nhận đợc dữ liệu, chơng trình sẽ thực hiện phân tích dữ liệu nhận đợc. Nếu nhận đợc ký tự "#" thì hai byte dữ liệu tiếp theo sẽ đợc nhận dới dạng giá trị của kết quả chuyển đổi A/D. Chơng trình sẽ thực hiện hiển thị

Một phần của tài liệu thiết kế hệ thống phần mềm cho C AT90S8535 (Trang 109)