CHƯƠNG TRÌNH THU THẬP DỮ LIỆU TỪ CÁC BOARD

Một phần của tài liệu Thiết kế mạng giám sát và điều khiển MC68HC11 dùng RS 485 (Trang 76 - 85)

BOARD

Vì hệ thống dùng RS485 để liên kết các node mạng, do đĩ để cĩ thể thu thập dữ liệu chính xác từ các node địi hỏi phải quản lý đường truyền theo cách thức xác định sao cho bảo đảm chỉ cĩ một node được phát trên đường mạng tại một thời điểm. Để thực hiện điều này chương trình giữa node yêu cầu phát và node yêu cầu nhận phải cĩ sự phối hợp theo một giao thức (protocol) cĩ thể quản lý được đường truyền và giao thức được chọn sử dụng trong chương trình là giao thức Master/Slave do tính đơn giản, dễ thực hiện và hiệu quả. Máy tính đĩng vai trị là Master yêu cầu thu thập dữ liệu từ các Slave là các board Vi xử lý.

II.1 Chương trình trên Vi xử lý

II.1.1 Truyền dữ liệu theo giao thức

Mỗi giao thức địi hỏi dữ liệu được phát theo một frame xác định để cĩ thể xử lý. Trong khuơn khổ luận văn và với giao thức Master/Slave, khung truyền phát lên từ mỗi board Vi xử lý như sau

Địa chỉ node Data (gồm 6 byte) Checksum

Địa chỉ của mỗi board sẽ là giá trị đọc về trên hai bit PC6 và PC7, sau khi reset, MCU sẽ đọc PORTC và lưu vào biến MYADD, giá trị của biến này được xem như là địa chỉ board, do chỉ sử dụng hai bit nên các địa chỉ mà board cĩ thể nhận được sẽ là %1100000($C0), %10000000($80), %01000000($40). Hai bit PC6 và PC7 khơng sử dụng ở cùng mức logic thấp vì cĩ thể xảy ra trường hợp địa chỉ board bằng $00 là giá trị mặc định lưu trong biến MYADD khi khởi động chương trình. MYADD sẽ giữ địa chỉ board khi chương trình chạy cho dù mức logic trên hai bit PC6 và PC7 thay đổi. MYADD sẽ nhận địa chỉ mới (nếu thay đổi trên PORTC) khi nút reset được nhấn.

Khi nhận được một byte từ bộ đệm, chương trình sẽ kiểm tra xem byte này cĩ bằng MYADD khơng, nếu bằng, tức byte truyền xuống là địa chỉ board, MCU sẽ chờ khoảng 1ms để bảo đảm đường truyền trống và phát vùng dữ liệu (trong một bộ đệm định trước – là 3 byte trong vùng RAM nội) lên PC. Nếu khơng phải là địa chỉ của mình, MCU sẽ khơng làm gì cả.

Địa chỉ của node sẽ được phát lên đầu tiên đĩng vai trị như ACK báo cho Master biết dữ liệu thuộc node nào, sau đĩ là đến các byte dữ liệu, các byte này sẽ được cộng vào biến Checksum trước khi được phát, khi phát hết dữ liệu, byte cuối cùng được phát đi là Checksum. Để tránh trùng địa chỉ và dữ liệu, tất cả các byte data và Checksum sẽ được chuyển sang dạng mã ASCII trước khi phát. Do số byte data là 3 byte (cố định) nên khi phát dưới dạng mã ASCII, số byte dữ liệu mà

máy tính nhận được sẽ là 6 byte (1 byte dữ liệu khi chuyển sang mã ASCII sẽ cần 2 byte). Mặt khác, do số byte dữ liệu phát là cố định và đều theo dạng mã ASCII, nên ta khơng cần thêm các byte phụ để chỉ độ dài dữ liệu, kiểu định dạng, bắt đầu hoặc kết thúc khối dữ liệu (vì máy tính sẽ hiểu sau byte địa chỉ là 6 byte data được mã hố) và như vậy khối dữ liệu phát được đơn giản hố, node nhận khơng phải xử lý phức tạp và tốc độ truyền nhận cũng tăng lên.

Bắt đầu

Nhận địa chỉ trên PORTC

Nhận byte truyền xuống

Byte truyền xuống = địa chỉ board

Truyền dữ liệu lên PC

Kết thúc Y

N

Lưu đồ tổng quát chương trình Vi xử lý Delay 1ms

Các MCU được viết sử dụng ngắt nhận để phát hiện yêu cầu lấy dữ liệu của máy tính. Việc phát dữ liệu sẽ nằm trong chương trình chính đối với 68HC11E2 nhưng trong chương trình viết cho 68HC11E9, ngắt phát sẽ được sử dụng. Cứ mỗi lần cĩ một byte truyền xuống, các MCU sẽ nhảy vào chương trình ngắt nhận để xem thử byte này cĩ phải là địa chỉ của mình khơng. Nếu đúng, MCU sẽ thực hiện một số nhiệm vụ đã định trước. Nếu khơng MCU sẽ thốt ra ngồi và khơng làm gì cả.

II.1.2 Sử dụng mode standby giảm thời gian chờ địa chỉ

Cĩ một điểm cần chú ý trong mạng RS485, tất cả các node (ngoại trừ node phát) đều ở trạng thái lắng nghe, như vậy nếu slave 1 truyền dữ liệu lên máy tính, dữ liệu này tất nhiên cũng được gởi đến slave 2 và các slave khác. Mặc dù, slave 2

sẽ kiểm tra và khơng làm gì đối với các dữ liệu này, nhưng rõ ràng vẫn cĩ một khoảng thời gian mà các slave này phải nhảy vào chương trình ngắt, so sánh byte nhận được với địa chỉ và sẽ thốt ra mà khơng làm gì (vì khối dữ liệu khơng chứa địa chỉ của các slave). Nếu khối dữ liệu truyền lên cĩ 9 byte, các slave sẽ thực hiện các thao tác trên 9 lần. Thời gian này tuy khơng dài nhưng vơ ích, thậm chí là lãng phí nếu MCU cần phải thực hiện nhiều cơng việc khác nhau.

Để tránh trường hợp này, ta sẽ dùng mode standby được 68HC11 hỗ trợ cho mạng. Khi nhận được một byte khơng phải là địa chỉ board, ta sẽ set bit RWU đưa bộ nhận vào trạng thái sleep, ở trạng thái này MCU sẽ khơng thực hiện ngắt khi nhận các byte tiếp theo. Như vậy, mỗi MCU sẽ chỉ nhảy vào chương trình ngắt một lần khi trên đường mạng cĩ một khối dữ liệu đang truyền đi thay vì 9 lần như trên. Khi đường mạng đã ở trạng thái rảnh (iddle) cĩ nghĩa là khơng cĩ node nào truyền dữ liệu sau một khoảng thời gian bằng độ dài một ký tự (khoảng 1,05ms ở baud 9600), bộ nhận sẽ được đánh thức dậy và hoạt động bình thường – tiếp tục lắng nghe yêu cầu mới.

Bắt đầu

RTI

Cĩ byte truyền xuống hay khơng

BYTEIN = Byte truyền xuống

Set bit RWU bỏ qua các byte tiếp theo

Y

N

Lưu đồ chương trình ngắt SCI nhận 1 byte từ PC gởi xuống Kiểm tra với (adsbygoogle = window.adsbygoogle || []).push({});

địa chỉ Board Sai

Bắt đầu

? Ngắt phát

Xố cờ báo ngắt phát

A = Byte trỏ đến bởi X Đưa A vào bộ đệm phát

Tăng biến DEM DEM = Dem +1

RTI Y

N Chương trình ngắt nhận

Lưu đồ chương trình ngắt SCI ở 68HC11E9

II.1.3 Lưu đồ các chương trình hỗ trợ cho việc truyền dữ liệu :

Để truyền theo giao thức đề ra, trước khi khối dữ liệu được phát, cần phải chuyển tất cả dữ liệu kể cả byte checksum ra dạng mã ASCII.

Giải thuật để chuyển một byte sang mã ASCII như sau

Nếu 0 <A<9, thì mã ASCII của A sẽ là A=A+$30 (1) Nếu A khơng nằm trong tầm trên, thì phép tính (1) sẽ cho kết quả A >39, ta chỉ cần cộng thêm với 7 là được kết quả mong muốn.

Mỗi byte dữ liệu sẽ được truyền lên PC theo thứ tự từ nibble cao đến thấp Sau đây là lưu đồ các chương trình chuyển một byte sang mã ASCII và phát một byte chứa trong thanh ghi A lên máy tính.

Lưu đồ chương trình Đổi A thành 2 byte mã ASCII và phát lên PC Bắt đầu

RTS Cất A

Chuyển nibble cao A thành mã ASCII và phát lên PC

Chuyển nibble thấp A thành mã ASCII và phát lên PC

Lấy A

Bắt đầu

RTS

Chuyển nibble cao của A thành nibble thấp bằng cách dịch phải A bốn lần

Chuyển nibble thấp A thành mã ASCII và phát lên PC

Bắt đầu Cờ báo bộ đệm phát rỗng set lên 1 Bộ đệm phát = A RTS Y N

Lưu đồ chương trình Truyền byte chứa trongA lên PC Bắt đầu

RTS Che 4 bit cao Cộng A với $30

A <= $39

A = A + $07

Truyền byte chứa trong A lên PC

Y N (adsbygoogle = window.adsbygoogle || []).push({});

Lưu đồ chương trình Chuyển nibble thấp A thành mã ASCII và phát lên PC

II.2 Chương trình trên PC

Máy tính sẽ đĩng vai trị là Master lần lượt gởi địa chỉ của các Slave cần thu thập dữ liệu theo thứ tự và chờ data từ các Slave gởi về.

PC sau khi gởi địa chỉ của node cần đọc sẽ chờ cho đến khi vùng đệm nhận cĩ số byte data cần thiết (nếu số byte dữ liệu từ vi xử lý là 3 byte, bộ đệm sẽ chờ

cho đến khi nhận được 9 byte bao gồm 1 byte địa chỉ, 6 byte dữ liệu dưới dạng mã ASCII và 2 byte là Checksum cũng được mã hố theo dạng mã ASCII). Khối dữ liệu truyền lên sẽ được kiểm tra địa chỉ, nếu khơng đúng địa chỉ cần nhận, bộ đệm nhận sẽ bị xố và PC sẽ yêu cầu data data được gởi lên lại (bằng cách gởi xuống vi xử lý địa chỉ board). Nếu địa chỉ của khối dữ liệu đúng với địa chỉ đã phát, khối dữ liệu sẽ tiếp tục được kiểm tra checksum. Tổng giá trị của các byte data được gán vào một biến (biến này cĩ thể là một hoặc hai byte). Byte thấp của biến này sẽ được so sánh với byte checksum truyền lên. Dữ liệu chỉ được coi là đúng khi hai giá trị này bằng nhau. Sau khi thực hiện so sánh checksum, nếu đúng data sẽ được xử lý (cĩ thể lưu vào bộ nhớ, hiển thị ra màn hình …). Nếu khơng, PC sẽ gởi lại địa chỉ board cần nhận, tiếp tục chờ và kiểm tra dữ liệu gởi lên.

Các thao tác trên sẽ tiếp tục lặp lại cho đến khi nào việc kiểm tra địa chỉ và checksum cho kết quả đúng hoặc vẫn cĩ kết quả sai mà hết thời gian Timeout, đây là khoảng thời gian ấn định trước được bắt đầu tính từ khi gởi địa chỉ lần đầu tiên để thu thập dữ liệu từ một board. Khoảng thời gian này là cần thiết vì PC khơng thể chờ data thích hợp một cách vơ tận mà chỉ chờ trong khoảng thời gian cho phép. Nếu quá thời gian này mà khơng cĩ dữ liệu hay dữ liệu khơng đúng, máy tính sẽ báo việc nhận thất bại. Sau đĩ PC sẽ gởi địa chỉ board kế tiếp và thực hiện các thao tác thu thập dữ liệu tương tự như trên.

II.3 Kết quả thực hiện :

Mạng hoạt động đúng như yêu cầu, dữ liệu thu thập được cho hiển thị theo dạng thơ (hiện tồn bộ kể cả địa chỉ và checksum).

Tuy nhiên đây chỉ là bước đầu, dù cĩ thể yêu cầu dữ liệu từ từng board theo đúng giao thức định sẵn, nhưng đây chỉ là dữ liệu ngẫu nhiên từ vùng đệm là 3 byte chọn trước trong vùng nhớ RAM của mỗi MCU, mạng chưa cho thấy khả năng tương tác giữa Master với các Slave, chưa thể thay đổi hay tác động đến dữ liệu gởi lên. Cần tạo các dữ liệu khác nhau để cĩ thể kiểm tra độ ổn định cũng như phát hiện các sai sĩt cĩ thể cĩ của mạng trong điều kiện hoạt động thực tế.

Bắt đầu

Gởi địa chỉ node cần nhận Nhận data gởi lên

Kết thúc

Lưu đồ tổng quát chương trình trên máy tính Xử lý dữ liệu

Lấy địa chỉ node kế tiếp So sánh địa chỉ gởi lên với

địa chỉ node đã yêu cầu Đúng

Sai

Kiểm tra Checksum

khối dữ liệu nhận được Sai Đúng

Time out ? Y

N

Địa chỉ Board khơng đúng Slave - MCU Master - PC Địa chỉ board Ignore các byte tiếp theo

Dữ liệu

Hoạt động khơng lỗi

Slave - MCU Master - PC

Địa chỉ board

Kiểm tra địa chỉ đúng Nhận dữ liệu Kiểm tra checksum đúng Xử lý dữ liệu (hiển thị, lưu trữ ...)

Địa chỉ Board đúng Dữ liệu Slave - MCU Master - PC Địa chỉ board

Kiểm tra địa chỉ sai Địa chỉ board

Dữ liệu

Kiểm tra Checksum sai (adsbygoogle = window.adsbygoogle || []).push({});

Địa chỉ board

. .

. . . . . .

Báo Timeout. Receive fail !

. . . . K hoa ûng thơ øi gia n Time ou t Hoạt động cĩ lỗi Địa chỉ Board đúng Địa chỉ Board đúng . . . . Cách thức hoạt động của mạng

Một phần của tài liệu Thiết kế mạng giám sát và điều khiển MC68HC11 dùng RS 485 (Trang 76 - 85)