Пишу программу под 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' );
}
}
#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'.