Спасибо, Григорий, за вежливость и терпимость. Я действительно сильно напутал в коде. На самом деле моя вина в не слишком хорошо сформулированной идее.
То, что запуск измерения инициируется сторожевым таймером, не обязательно должно влиять на передачу байтов.
Преобразование типов (INT08U)(__ADCResult__ )) выделяет один байт из двухбайтного слова,
но в обработчике прерываний от Timer A происходит 8 сдвигов вправо (UARTBuff=UARTBuff >> 1),
предлагаю организовать передачу слова целиком, без дробления на байты. Например - превратить функцию SendUARTByte(INT08U Data) в дважды вызываемую процедуру SendUARTByte(void), а пересылаемое слово загружать в глобальную переменную UARTBuff = _ADCResult_ перед двухкратным вызовом этой процедуры.
Что-то вроде
Код
UARTBuff = _ADCResult_;
SendUARTByte(void);
SendUARTByte(void);
Кстати, этот фрагмент может стать ещё короче, если его поместить в обработчик прерываний от SD16
Код
#pragma vector=SD16_VECTOR
__interrupt void SD16ISR(void)
{
if (SD16CCTL0 & SD16IFG)
{
UARTBuff = SD16MEM0;
SendUARTByte(void);
SendUARTByte(void);
__bic_SR_register_on_exit(CPUOFF);
}
}
Единственное замечание - следует внимательно проследить, чтобы были разрешены оба типа прерываний (и TA, и SD16). Об их взаимном приоритете не беспокойтесь - он обеспечит правильность обработки.
Сообщение отредактировал VVlad - Mar 16 2010, 07:16