Добрый день!
Пишу программу под pic16f1825 в MPLABX 1.3 и HI_TECH PICC 9.71.

Код
#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
#include "../inc/al_types.h"
#include "../inc/al_bits.h"
#include "../inc/al_config.h"
#include "../inc/al_osc.h"
#include "../inc/al_uart.h"
#include "../inc/al_leds.h"
#include "../inc/al_timer.h"
#include "../inc/al_protocol.h"
#include "../inc/al_sleep.h"

static uint8_t G_deviceId[8];

static void interrupt isr(void)
{
    static char x;
    if(RCIF)
    {
       x = RX9D;
       x = RCREG;
    }
}

int main(int argc, char** argv)
{
    __CONFIG((1<<13)|(0<<12)|(1<<11)|(2<<9)|(1<<8)|(1<<7)|(1<<6)|(1<<5)|(1<<3)|4);
    __CONFIG((1<<13)|(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(7<<5)|(3<<2)|3);
    osc_init();
    uartInit();
    uartSendByte( '0' );
    uartSendByte( status );
    uartSendByte( pcon );
    led_init();

    clrb( TRISA, 5 );
    setb( PORTA, 5 );
    for ( uint32_t i=0; i<100000; i++);

    GIE = 0;
    PEIE = 0;
    IOCIE = 1;
    IOCAN1 = 1;
    //Если раскомментировать следующую строчку - микроконтроллер ребутится
    clrb( PORTA,5 ); // ( * )
    for ( uint32_t i=0; i<100000; i++);
    SLEEP();
    asm("nop");
    led_on( );
    setb( PORTA, 5 );
    IOCIE = 0;
    IOCAN1 = 0;
    GIE = 1;
    PEIE = 1;

    while(1)
    {
            for ( uint32_t i=0; i<100000; i++);
            uartSendByte( '1' );
    }
}

В программе камень посылает символ '0' и засыпает до прихода какого-либо символа по УАРТу. После пробуждения шлет в цикле символ '1'.
Если строчка ( * ) закомментирована - программа работает нормально - крутится в цикле и шлет "1". Если же ее раскомментировать, то в случае, если по УАРТу приходит входящее сообщение до того, как программа доберется до команды SLEEP, то камень перезагружается - шлет символ '0' ( т.е. камню в цикле шлется любой символ по УАРТу - в ответ на это камень ребутится и шлет в цикле символ '0', а не '1'.