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
đị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
Lưu đồ chương trình Chuyển nibble thấp A thành mã ASCII và phát lên PC