реклама на сайте
подробности

 
 
> DAbt_Handler?A или проблема с прерыванием?, Можно ли как то отложить прерывания?
GenEv
сообщение Jul 23 2007, 12:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 29-11-06
Пользователь №: 22 884



Проект для LPC2294.
Вообщем проблема не понятная.
Смысл такой. Есть основной цикл. по прерыванию набирается пакет байтов.
Так вот если убрать
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;
        }
    }


Функция 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;
}

Вообщем что делать ума не приложу.
Что то в уме смутно бродит про защиту выполнения кода от прерывания. Есть ли такое? и поможет ли?

Сообщение отредактировал GenEv - Jul 23 2007, 12:43
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th August 2025 - 05:35
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016