Вообщем проблема не понятная.
Смысл такой. Есть основной цикл. по прерыванию набирается пакет байтов.
Так вот если убрать
AppBrake = GetAppBrake();
//____________________________________________ Опрос углов _____________________________
Azimut.Angle = GetAngle() + Azimut.Corr;
Elev.Angle = 14.5 + Elev.Corr;
... // Рсчеты, расчеты
т.е. различные расчеты, то все работает отлично, стоит только добавить фунцию GetAngle(); так возникает проблема DAbt_Handler?A, причем все время по разному. Обмен может происходить 30 секунд, минуту, но все равно срабатывает прерывание по DAbt_Handler?A.
Код
while(1)
{
AppBrake = GetAppBrake();
//____________________________________________ Опрос углов _____________________________
Azimut.Angle = GetAngle() + Azimut.Corr;
Elev.Angle = 14.5 + Elev.Corr;
... // Рсчеты, расчеты
//___________________________________________ Обработка команд по RS _________________
switch (Action) // !!!!!!
{
case PACK:
IDCommand(PackNumber);
Action = FALSE;
for (cl = 0; cl < 20; cl ++) PackRead[cl] = 0;
break;
case ERR_CHECK:
WriteData(PackRead[1], "d", 1);
Action = FALSE;
for (cl = 0; cl < 20; cl ++) PackRead[cl] = 0;
break;
case ERR_PACK:
WriteData(PackRead[1], "e", 1);
Action = FALSE;
for (cl = 0; cl < 20; cl ++) PackRead[cl] = 0;
break;
}
}
{
AppBrake = GetAppBrake();
//____________________________________________ Опрос углов _____________________________
Azimut.Angle = GetAngle() + Azimut.Corr;
Elev.Angle = 14.5 + Elev.Corr;
... // Рсчеты, расчеты
//___________________________________________ Обработка команд по RS _________________
switch (Action) // !!!!!!
{
case PACK:
IDCommand(PackNumber);
Action = FALSE;
for (cl = 0; cl < 20; cl ++) PackRead[cl] = 0;
break;
case ERR_CHECK:
WriteData(PackRead[1], "d", 1);
Action = FALSE;
for (cl = 0; cl < 20; cl ++) PackRead[cl] = 0;
break;
case ERR_PACK:
WriteData(PackRead[1], "e", 1);
Action = FALSE;
for (cl = 0; cl < 20; cl ++) PackRead[cl] = 0;
break;
}
}
Функция GetAngle()
Код
float GetAngle()
{
USHORT *Adress;
USHORT go, to;
int s, c, turn;
float res;
c = 0;
go = 0;
to = 0;
//====================== Азимут =====================================================
Adress = 0x82020000; //грубый отсчет
IOCLR1 = SP(21);
go = *Adress;
IOSET1 = SP(21);
Adress = 0x82040000; //точный отсчет
IOCLR1 = 0x200000;
to = *Adress;
IOSET1 = 0x200000;
s = (go & 0x7FF) - (to >> 5);
if (s > 1500) c = 2047;
if (s < -1500) c = - 2047;
go = go & 0xF800;
res = go + (to >> 5) + c;
turn = IOPIN0;
turn = (turn >> 19) & 1;
if ( (turn == 1) && (res < 50000) ) res += 65536;
res = res * 360 / 65536;
return res - 5;
}
{
USHORT *Adress;
USHORT go, to;
int s, c, turn;
float res;
c = 0;
go = 0;
to = 0;
//====================== Азимут =====================================================
Adress = 0x82020000; //грубый отсчет
IOCLR1 = SP(21);
go = *Adress;
IOSET1 = SP(21);
Adress = 0x82040000; //точный отсчет
IOCLR1 = 0x200000;
to = *Adress;
IOSET1 = 0x200000;
s = (go & 0x7FF) - (to >> 5);
if (s > 1500) c = 2047;
if (s < -1500) c = - 2047;
go = go & 0xF800;
res = go + (to >> 5) + c;
turn = IOPIN0;
turn = (turn >> 19) & 1;
if ( (turn == 1) && (res < 50000) ) res += 65536;
res = res * 360 / 65536;
return res - 5;
}
Вообщем что делать ума не приложу.
Что то в уме смутно бродит про защиту выполнения кода от прерывания. Есть ли такое? и поможет ли?