ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
19 мая
132409 Топик полностью
M@ik (25.09.2008 10:22, просмотров: 180) ответил 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(); } //----------------------------------------------------