[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]

Отправлено Сергей Борщ 21 мая 2002 г. 12:39
В ответ на: MSP430 на С от IAR. Как отключить LPM3 на C от IAR. отправлено YuryS 21 мая 2002 г. 06:31

Дело в том, что выключать биты LPM3 надо не в регистре статуса, а в его копии, которая сохранилась на стеке в момент входа в прерывание и откуда они попадут в регистр статуса при выходе из прерывания. Для этого действительно, как советует коллега John, нужно взять компилятор версии 1.25 - там для этого добавлены instrinc - функции _BIS_SR_IRQ и _BIC_SR_IRQ.

В более старых версиях - красиво никак.

Александр Гайворонский придумал такую конструкцию:


interrupt [TIMERB0_VECTOR] void start (void)
{
char * ptr;
ptr = (char*) &ptr;
ptr+=4;
if ( rdiv== 0xf0 ) *ptr &=0xef;
}

Недостаток ее в том, что смещение (в этом примере +4) будет меняться в зависимости от того, сколько регистров компилятор использует в прерывании.

Пришла тут как-то в метро идея - объявить функцию прерывания как функцию, которой передается в качестве параметра массив слов и обратиться к этому массиву по отрицательному индексу. По идее, минус первый элемент будет адресом возврата, а минус второй - как раз статусом. Но не пробовал. Если не лень, попробуйте, доложите общественности.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru