我正在布线测试一组导线是否开路或短路的程序。该程序运行在AVR上,将测试矢量(步行'1')驱动到电线上并接收结果。它将此结果向量与已存储在SD卡或外部EEPROM上的预期数据进行比较。在位阵列中找到'1'的位置有效
下面是一个例子,假设我们有一组8根导线,它们都是直通的,即它们没有连接点。所以如果我们开车0b00000010,我们应该收到0b00000010。
假设我们收到0b11000010。这意味着线7,8和线2之间存在短路。我可以通过0b00000010^0b11000010 = 0b11000000来检测我感兴趣的位。这清楚地告诉我线7和线8有问题,但是如何在大比特阵列中有效地找到这些'1'的位置。使用位掩码只需要8根电线即可轻松完成此操作,但我正在开发的系统必须能够处理多达300根电线(位)。在我开始像以下这样使用宏并在300 * 300位数组中测试每一位之前,我想问问这里是否有更优雅的解决方案。
#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)
只是为了进一步展示如何检测开路。预期数据:0b00000010,收到数据:0b00000000(电线未拉高)。 0b00000010^0b00000000 = 0b0b00000010 - 电线2打开。
注意:我知道测试300线不是AVR Mega 1281内部的小型RAM可以处理的,这就是为什么我将它分成组,即测试50根线,比较,显示结果然后向前移动。
我通过de Brujin链接阅读,它似乎需要连续0。不能保证故障是连续的。我的编译器是AVR-GCC。要去做一些研究,看看它是否实现了这些。 – saad 2012-02-15 15:32:18