совсем недавно начал работать с контроллерами, "классический" первый проэкт "бегущая строка", ну дальше в том же духе...
в своей конструкции применяю EEPROM типа 24cXX. насколько правильно я понял из буржуйкого даташита, микруха эта, после каждого принятого байта (в направлении от мастера к EEPROM) должна выдавать сигнал подтверждения приема (АСК). Не имея достаточного практического опыта я проверяю сигнал подтверждения следующим образом: на линию данных вывожу "1" на протяжении 9-го импульса синхронизации, после чего считываю состояние этой линии, и проверяю на наличие "1". расчет сделан на то (возможно это и ошибочно), что если EEPROM выдает "0", т.е. не подтверждает прием, соответственно к "0" притягивается и линия данных, что сигнализирует контроллеру об отсутствии подтверждения. в результате получаю зависание (зацикливание) контроллера.
интересно и то, что зависание вообще не происходит в подпрограммах чтения (хотя нижеследующая процедура там используется тоже, для передачи контрольного байта чтения), а на записи виснет сразу после второго вызова. убираю выделенные жирным шрифтом команды - все работает. понимаю, можно оставить и так, но вопрос отчего же такое случается все равно остается...
Код
byte_trans:
mov bt_count,#8;8 bits - кол-во передаваемых бит
x16:
rlc a
mov sda,c
nop;готовность данных
nop
setb scl
nop
nop
nop
nop
nop
clr scl
djnz bt_count,x16
x17:
setb sda;ACKNOWLEDGE
nop
nop
nop
nop
nop
setb scl
nop
nop
nop
nop
agn:
[b]mov c,sda ;анализ флага подтверждения (АСК) от EEPROM
jnc agn[/b]
clr scl
ret
mov bt_count,#8;8 bits - кол-во передаваемых бит
x16:
rlc a
mov sda,c
nop;готовность данных
nop
setb scl
nop
nop
nop
nop
nop
clr scl
djnz bt_count,x16
x17:
setb sda;ACKNOWLEDGE
nop
nop
nop
nop
nop
setb scl
nop
nop
nop
nop
agn:
[b]mov c,sda ;анализ флага подтверждения (АСК) от EEPROM
jnc agn[/b]
clr scl
ret