[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Дело в том, что выключать биты 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;
}
Пришла тут как-то в метро идея - объявить функцию прерывания как функцию, которой передается в качестве параметра массив слов и обратиться к этому массиву по отрицательному индексу. По идее, минус первый элемент будет адресом возврата, а минус второй - как раз статусом. Но не пробовал. Если не лень, попробуйте, доложите общественности.
E-mail: info@telesys.ru