Tôi đang nối dây chương trình kiểm tra một bộ dây cho mạch hở hoặc ngắn. Chương trình, chạy trên một AVR, điều khiển một vector thử nghiệm (đi bộ '1') lên dây và nhận kết quả trở lại. Nó so sánh vector kết quả này với dữ liệu dự kiến đã được lưu trữ trên thẻ SD hoặc EEPROM bên ngoài.Tìm vị trí của '1 hiệu quả trong một mảng bit
Đây là một ví dụ, giả sử chúng ta có một bộ gồm 8 dây, tất cả đều thẳng qua tức là chúng không có nút giao. Vì vậy, nếu chúng ta lái xe 0b00000010 chúng ta sẽ nhận được 0b00000010.
Giả sử chúng tôi nhận 0b11000010. Điều này ngụ ý có một mạch ngắn giữa dây 7,8 và dây 2. Tôi có thể phát hiện các bit mà tôi quan tâm bằng 0b00000010^0b11000010 = 0b11000000. Điều này cho tôi biết rõ ràng dây 7 và 8 có lỗi nhưng làm thế nào để tôi tìm được vị trí của những '1 hiệu quả trong một mảng bit lớn. Thật dễ dàng để làm điều này cho chỉ 8 dây sử dụng mặt nạ bit nhưng hệ thống tôi đang phát triển phải xử lý lên đến 300 dây (bit). Trước khi tôi bắt đầu sử dụng các macro như sau và kiểm tra từng bit trong một mảng 300 * 300-bit, tôi muốn hỏi ở đây nếu có một giải pháp thanh lịch hơn.
#define BITMASK(b) (1 << ((b) % 8))
#define BITSLOT(b) ((b/8))
#define BITSET(a, b) ((a)[BITSLOT(b)] |= BITMASK(b))
#define BITCLEAR(a,b) ((a)[BITSLOT(b)] &= ~BITMASK(b))
#define BITTEST(a,b) ((a)[BITSLOT(b)] & BITMASK(b))
#define BITNSLOTS(nb) ((nb + 8 - 1)/8)
Chỉ để tiếp tục cho biết cách phát hiện mạch mở. Dữ liệu dự kiến: 0b00000010, dữ liệu nhận được: 0b00000000 (dây không được kéo cao). 0b00000010^0b00000000 = 0b0b00000010 - dây 2 đang mở.
LƯU Ý: Tôi biết thử nghiệm 300 dây không phải là một cái gì đó RAM nhỏ bên trong một AVR Mega 1281 có thể xử lý, đó là lý do tại sao tôi sẽ chia này thành các nhóm, nghĩa là kiểm tra 50 dây, so sánh, kết quả hiển thị và sau đó di chuyển về phía trước.
Tôi đọc qua liên kết de Brujin và dường như yêu cầu 0 liên tiếp. Đây không phải là đảm bảo rằng các lỗi sẽ được liên tục. Trình biên dịch của tôi là AVR-GCC. Gonna đi và làm một số nghiên cứu để xem nếu nó thực hiện những. – saad