Nếu đây là lần đầu tiên đến với Điện Tử Việt Nam, bạn có thể đọc phần Hỏi đáp bằng cách nhấn vào liên kết. Có thể bạn cần đăng kí trước khi có thể gửi bài . Để bắt đầu xem bài viết, chọn diễn đàn bạn muốn thăm dưới đây.
mình đang làm bài truyền thông giữa 4 AVR loại ATmega 16 để tạo thành 1 đường bus.(3 con slave +1con master),truyền data từ slave về master truyền lên PC.mong các cao thủ chỉ giáo cách tạo đường Bus.có ví dụ minh họa thì càng tuyệt.
Sử dụng giao thức modbus master/slave RTU hoặc ASCII, kết nối bằng chuẩn truyền thông RS485. Chịu khó search sẽ có cả tài liệu và ví dụ về cái này. rất nhiều.
Chỉ truyền có 4 con với nhau không thì dùng một số giao thức cơ bản đều được hết. Nếu khoảng cách xa có thể dùng chuẩn RS485,CAN, gần dùng chuẩn RS232, SPI, I2C... Nếu là bài tập trong nhà trường thì dùng chuẩn SPI hoặc RS232 là hợp lý hơn hết. Với SPI thì dễ quá rồi. Tôi giới thiệu khái quát thêm với RS232.
Cách làm với RS232 cơ bản như sau:
+ Cách lắp phần cứng
- Tất cả chân RX, TX của ATmega đều được nối với MAX232. Gọi chung là TX232 và RX232.
- TX232 của con Master nối với các chân RX232 của Slave. Slave gồm 3 con còn lại và cổng COM giao tiếp máy tính.
- RX232 của con Master nối với các chân TX232 của con Slave bao gồm cả chân TXD (chân số 3) của COM giao tiếp máy tính.
Tóm lại lấy một con ATmega16 làm Master, 3 con ATmega còn lại và máy tính làm slave
Đến đây đã hoàn thành công đoạn nối bus truyền.
Tiếp theo là công đoạn tạo dựng khung truyền thông đồng bộ nhau.
+ Khung truyền thông giao tiếp:
Cần có khung truyền thông giữa các con với nhau. Và cần phân biệt các con slave với nhau.
Cách làm như sau:
Đặt địa chỉ ID cho con Slave đầu tiên là ID = 1, con tiếp theo là ID = 2,...3, máy tính là 4.
Khung truyền thông sẽ gồm 2 byte Header dùng để nhận biết bắt đầu của khung.
Với Khung từ Master xuống Slave cần 2 byte Header, kế đến là byte ID rồi đến byte lệnh CMD, và đến các byte dữ liệu, kết thúc là byte kiểm tra tổng Checksum.
Còn từ Slave gửi lên Master thì : 2 byte Header, kế đến là ID của con Slave, rồi đến dữ liệu, và kết thúc là Checksum.
Tôi xin viết tiếp.
Nếu ta muốn ra lệnh cho con Slave 1 gửi dữ liệu về Master ta sẽ làm như sau:
Ví dụ 2 byte Header là 0x45 và 0xDE, quy ước lệnh gửi dữ liệu trở lại CMD = 1, CMD = 2 là yêu cầu xử lý dữ liệu của Master ( ví dụ Master yêu cầu Slave cho nhấp nháy đèn led, máy tính nhận dữ liệu và hiển thị....) có thể thêm nữa tùy bạn. Ví dụ dữ liệu của chúng ta có 3 byte dùng để truyền giá trị đếm được từ slave....
Checksum sẽ được tính : Checksum = (CMD + ID + Byte Data1 + Byte Data2 + Byte Data3)%100.
Vậy khung truyền thông như sau: 0x45; 0xDE; 0x02; 0x01; 0x12; 0x13; 0x85, Checksum.
Truyền ra từ Master như sau:
putchar(0x45);
putchar(0xDE);
putchar(0x02); //lệnh xử lý dữ liệu...
putchar(0x01); //slave 1 nhận dữ liệu
putchar(0x01); // byte dữ liệu cao
putchar(0x12); //byte dữ liệu giữa
putchar(0x13); //byte dữ liệu thấp
putchar((unsigned char)Checksum);
đến đây đã truyền được dữ liệu ra đến slave.
Còn Slave sẽ nhận dữ liệu. Dựa vào ID trùng với của mình rồi mới cho phép nhận dữ liệu. Dựa vào lệnh tương ứng mà Slave làm việc.....
Cách nhận dễ thôi. Tôi để các bạn tự tìm hiểu cho thêm thú vị.
Với máy tính. Coi như là một slave . máy tính sẽ hiển thị hoặc đưa lệnh cho Master cũng tương tự như trên.
Chúc thành công!
Dù làm ở đâu thì cũng nên theo một tiêu chuẩn đã có sẵn và thiết thực khi áp dụng vào thực tế. Chẳng lẽ sinh viên thì có thể làm nhăng cuội sao?
Chào Hungnp!
Làm theo chuẩn là đúng. Tuy nhiên không ai thiết kế chuẩn dùng cho kết nối xa vào khoảng cách gần. Đã sinh ra chuẩn quốc tế thì chẳng lẽ nó là nhăng cuội? nó không được ứng dụng thực tế sao?. Bạn biết rằng đây là bài tập của sinh viên. Mà sinh viên làm bài tập nào đều có ứng dụng trong thực tế là nhỏ hay lớn thôi, thực tế có thể vài Km đến vài chục Km là chuyện thường nhưng nó sẽ áp dụng cho bài tập nâng cao cho sinh viên sau khi ra trường hoặc muốn tự mày mò để tìm hiểu thêm. Tôi đưa ra giải pháp ở đây là trong phạm vi năng lực của bạn trên. Vì trong nhà trường khoảng cách để thử mấy con kết nối với nhau cho giáo viên xem cũng chỉ vài mét đổ lại. Hoặc xa hơn thì 485 cũng không khác gì là mấy. Hơn nữa nếu bạn đã làm thực tế rồi bạn sẽ áp dụng được cách này đó. Chuẩn nào cũng vậy, chốt lại là để truyền dữ liệu và điều khiển. Tất cả đều phải có khung truyền thông.
Chào hungnp!
Giao thức trên sử dụng giao thức của RS232. Cách mã hóa bit theo chuẩn 232 (phần cứng của IC đã làm việc này). RS232 đưa ra dữ liệu theo byte. Còn khung truyền thông tùy thuộc vào người thiết kế để có hiệu quả tốt nhất - việc này không bắt buộc theo chuẩn nào. Đây là phương pháp được sử dụng nhiều trong các hệ thống của nước ngoài cho mạng nhỏ và truyền thông RF không dây, phương pháp này tôi đã học được từ người Nhật và Hàn Quốc. Phương pháp áp dụng cho khung cố định. Để hiệu quả về mặt giảm thiểu thời gian chiếm đường truyền, người thiết kế có thể làm khung động...
Việc sử dụng RS232 để kết nối bus như bạn nói ở trên là tự dân chúng ta nghĩ ra thôi chứ chả ai bảo nó là một chuẩn cả? Bạn tìm được tài liệu công bố chính thức tôi xin đầu hàng vô điều kiện. Còn việc sử dụng cổng RS232 kết nối với Module RF như của bạn lại là một vấn đề khác. Cái này tôi cũng không rành vì chưa làm bao giờ.
Trong bài trên bạn dùng 2 byte liên tiếp để đánh dấu đầu của khung truyền, có nghĩa nếu bên nhận tìm thấy 2 byte đó liên tiếp nhau thì nó hiểu bắt đầu một khung truyền mới. Bạn có chắc chắn phần dữ liệu ngẫu nhiên của bạn sẽ không có 2 byte đó nằm sát nhau hay không? Nếu việc trùng lặp xẩy ra khung dữ liệu nhận được sẽ bị thiếu.
Mạng RS232 ở trên là một mạng như dạng Modbus. Việc trùng lặp xảy ra là có. Tuy nhiên rất ít, Checksum cũng chưa hẳn đã đúng nếu nó nhận được 2 byte bị đổi vị trí cho nhau... Ngay như với chuẩn RS232 cũng có khi bị nhận sai bit. Cũng tùy ứng dụng và tùy dạng dữ liệu ta sẽ thay đổi Header để hạn chế tối đa việc mất dữ liệu. Một số giao thức để giảm việc trùng lặp này người ta có thể dùng tới nhiều Header và có thể lên tới hàng chục Byte hay nhiều khung (mỗi khung có thể 24 byte) Header riêng, như các giao thức mạng internet chẳng hạn... Tuy nhiên ứng dụng của mình trong giới hạn truyền 4 con này với nhau việc xảy ra trùng lặp dữ liệu với Header là rất hiếm. Hơn nữa còn tùy thuộc vào việc truyền dữ liệu của bạn gì ở trên nữa để có thay đổi khung truyền thông tốt. Trên đây là tôi đưa ra gợi ý giải pháp cho bạn đó. Không có nghĩa là phải làm giống y nguyên như vậy.
Nếu nó là một chuẩn truyền thông công nghiệp thì không thể có một sai sót nào dù là nhỏ nhất hoặc ít xẩy ra. Nếu khi nhận bị lỗi khung truyền do tín hiệu điện, chất lượng IC... đó là một điều bình thường. Nhưng sai sót do phương thức mã hóa dữ liệu thì không thể chấp nhận được.
Với RS232 modbus chỉ sử dụng để kết nối điểm-điểm thôi. Còn kết nối mạng thì dùng rs485 và giao thức Master/Slave. ngoài ra Modbus còn có thêm Ethernet.
- Modbus sử dụng 2byte CRLF để đánh dấu frame nếu sử dụng ở mode ASCII, 2 byte này không bao giờ trùng vào phần dữ liệu vì phần dữ liệu tất cả được mã hóa dưới dạng ký tự '0':'9' và 'A':'F'. Còn ở mode RTU thì không cần byte đánh dấu mà dùng timer để tính timeout tùy thuộc vào tốc độ baud.
- Hy vọng sau một số bài trên bạn thanh48ctu có thể rút ra cho mình hướng giải quyết hợp lý.
Mình chỉ nói chung chung thôi. Ai cần thì ghép lại để thành một project cho riêng mình.
Compiler: CodevisionAVR V2.03.4.
Code sử dụng cho Atmega128. sử dụng cho slave. Master thì quá đơn giản rồi. Giao thức sử dụng là Modbus RTU. Baud 57600
cho e hỏi các pác về kịch bản truyền nhận của master và slave như thế nào để khỏi có sự xung đột đường truyền bus? ví dụ để tránh 2 con slave hoặc 1 con slave và 1 con master cùng truyền 1 lúc.
Uống rượu 1 mình, thấy trang này nhớ lại cách đây vài chục năm hàn thiếc với inox cực kỳ khó, phải dùng acid Hcl tác dụng lên kẻm Zn để có Zncl2 làm thuốc trợ hàn, lúc đó làm gì có acid Hcl và thuốc trợ hàn?
À, sản phẩm họ thiết kế ra, họ yêu cầu mình chứng minh là sau chỉnh sửa thì 1 là gỡ jump cắm lại không hư mạch, 2 là gỡ jump thì 220Vdc vẫn dùng được led áp thấp 20V mà không hư led như mình báo, nên họ hiểu rõ mà....
Bài học kiểu trực tuyến dù là loại đơn giản bậc nhất cũng vẫn cần chú tâm. Chỉ bật tai nghe lên thì không có loại nào thấm nổi đâu. Cách hay hơn, dễ hơn là kiếm phim tiếng Anh nào đó xem, ban đầu bật phụ đề tiếng Việt, nghe và...
Comment