[an error occurred while processing this directive] [an error occurred while processing this directive]
Крыша едет!
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено cobra 02 февраля 2002 г. 14:26

Господа спецы!Уже пару дней парюсь над следующим эффектом.В моём устройстве стоит 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