Итак сначала рассказываю как работает прога.
1)Сначала инициализируется
2)Потом производит 4 блока измерений - проверяет она 4 провода в кабеле, поэтому и 4 блока.
3)выводит результаты
Думаю что п.п. 1 и 3 понятны из исходника и так, поэтому рассказываю 2-й.
Блок-схема:
http://narod.ru/disk/9865244001/pic.rar.html
См. 1-й файл.
Блок схема одного (из 4-х) блоков. Блок номер 0.
В этом блоке мы обращаемся на запись к 2-м переменнм
переменная, которая должна стать = 1 если что-то плохо с нулевым (по счету) проводом.
И переменная
эта переменная должна стать = 1 если провод кросс, и = 0 если провод прямой.
На 0-м блоке сначала мы выставляем на выходе "b'00010000".
Далее прога ищет на входах логическую единицу. (схему входов, выходов смотри там же где и блок схема).
Первые 2 проверки - ищем КЗ. Если встречаем единицу где не надо, то пишет 1-цу в
Далее проверяем провод номер 2. Он - парный, так что на нем может быть и 1, если провод - кросс. Так что если там единица, то пишем 1-цу в
И осталось проверить сам провод на предмет обрыва, т.е. 0-й бит порта B. Но дело в том, что если провод - кросс, то там ноль, а единица - во втором бите.
Таким образом надо написать 1-цу в
только если либо и там и там 0, либо и там и там 1. Иными словами надо написать единицы если не XOR от WIRE,CROSS0 и B0.
Теперь про то как написан XOR. Для понимания неисправности это, похоже, важно.
См. рисунок номер 2.
Я рисую как команды BTFSS (check BiT in register F Skip if Set) BTFSC (check BiT in register F Skip if Cleared) выглядят на ленте команд.
А внизу приведена картинка как работает половина XOR-а - блок кода, который выполнит "Command" если оба аргумента равны 1.
Аналогично пишется кусок кода, где выполнится "Command" если оба аргумента равны 0.
Они записываются подряд и получается XOR.
Для него мне нужен какой-нибудь бит, значение которого я знаю наверняка, чтобы сделать "Skipper" - команду, которая прыгает через строчку ленты команд всегда.
Вот тут и есть вся проблема!! Этот XOR, хоть и мудреный и в 10 строчек (напишите оптимальнее??), но написан правильно и в эмуляции работает, а в аппаратном исполнении - нет!
В качестве бита, значение которого всегда = 0 я взял
Ну просто потому что какая разница что брать - этот я сам сбрасываю в начале программы.
И вот это место и не работает, похоже. Такое ощущение, что регистр INTCON не сбрасывается и из-за этого XOR не выполняется нормально.
При комментировании этой части кода прога работает всегда.
Собственно вопрос к тем кто осилил: господа, почему может не сброситься регистр INTCON? или может быть я упустил из виду еще что-то?