[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Господа спецы!Уже пару дней парюсь над следующим эффектом.В моём устройстве стоит Cygnal C8051F000,внешняя RAM,графический ЖКИ и регистр 74HC573(портов не хватает).
Так как у Cygnal контроллера внешней шины нет,протокол обмена эмулирую программно.Уже сделал процентов 80 всей проги всё прекрасно работало на макетке,и вдруг шефу захотелось
добавить ещё один узел а так как управлять им надо я поставил ещё один внешний регистр.И началось...В первом регистре три бита используются для сканирования матрицы клавиатуры и переключение этих
битов происходит по прерыванию от таймера,другие же биты переключаются из фоновой задачи.После подключения второго регистра в первом регистре биты стали переключаться произвольно с интервалом прерывания.
Сначала думал что железо глючит(добавил паразитной ёмкости и т.д.) но когда запретил прерывания и стал опрашивать клаву из фоновой задачи этот эффект исчез.ВЫВОД - глюк программный!
В фоновой задаче перед обращением к регистру прерывания запрещаются,после обращения - разрешаются.В программе ничего подозрительного найти не удалось.
Крышу рвёт!!! Ей-богу,в таком дурацком положении первый раз! Я прекрасно понимаю что заочно ответить на этот вопрос очень трудно поэтому больше уповаю на то,что может кто- то уже натыкался на подобные грабли и поделится опытом.
На всякий случай привожу фоновую процедуру записи в регистр.CopyReg1 обьявлена как глобальная переменная.
#define Bus P2
#define Clr_WrRegister1 WrRegister1 = 0
#define Set_WrRegister1 WrRegister1 = 1
sbit WrRegister1 = P3^6;
data uchar CopyReg1;
void ResBitReg1(uchar MaskaBit)
{
EA = 0;
CopyReg1 = CopyReg1 & (~MaskaBit);
Bus = CopyReg1;
Set_WrRegister1;
_nop_();
_nop_();
_nop_();
_nop_();
Clr_WrRegister1;
EA = 1;
}
E-mail: info@telesys.ru