我正在佈線測試一組導線是否開路或短路的程序。該程序運行在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