M@ik (25.09.2008 10:22, просмотров: 197) ответил Alex B. на ну, наверное понял правильно. Ты код-то обработчика прерывания привел бы. Который не работает...
Не работал вот этот код:
static void exchange_complete_event()
{
control_task_execute();
}
//----------------------------------------------------
// Прерывание по завершению приема кадра
void __attribute__((interrupt, auto_psv)) _T5Interrupt(void)
{
uart_set_off_mode();
stop_timer();
exchangeCompleted = True;
exchange_complete_event();
IFS1bits.T5IF = 0;
}
//----------------------------------------------------
В control_task_execute() используются константы в PSV.
В ассемблерном листинге _T5Interrupt PSVPAG не устанавливается компилятором!
Заработало после изменения exchange_complete_event():
// установка страницы по умолчанию
//
#define SET_DEFAULT_PSV_PAGE() \
Uint16 psvpage_saved = PSVPAG; \
Bool psv = CORCONbits.PSV; \
CORCONbits.PSV = 0; \
asm("push w0 \n" \
"mov #__const_psvpage, w0 \n" \
"mov w0,_PSVPAG \n" \
"pop w0 " ); \
CORCONbits.PSV = 1;
//----------------------------------------------------
// Восстановление сохраненной PSV страницы
//
#define RESTORE_PSV_PAGE() \
CORCONbits.PSV = 0; \
PSVPAG = psvpage_saved; \
CORCONbits.PSV = psv;
//----------------------------------------------------
static void exchange_complete_event() {
SET_DEFAULT_PSV_PAGE();
control_task_execute();
RESTORE_PSV_PAGE();
}
//----------------------------------------------------