Добрый день,
столкнулся с такой непонятной для меня ситуацией.
Есть ATMega32, которая реализует: ШИМ (1 таймер), импульсы переменной длительности (1 таймер), замеры напряжения с двух каналов АЦП и общение с ПК. Общение с ПК по UART. Протокол общения строго синхронный. Запрос с ПК - ответ с МК.
Взял код UART из спецификации на mega32.
Если контроллер не загружен - буквально, если выключить АЦП (предделитель 64), а всю остальную переферию оставить (2 таймера), то UART работает нормально - проходит тестирование в 60 тыс. обменов с ПК.
Только стоит подключить АЦП начинаются проблемы - ПК фиксирует, что контроллер не отвечает ему за отведенное время.
При этом если код функций работы UART заключить в скобки cli-sei, то даже при включенном АЦП, обмен идет хорошо. Если запрещение прерываний убрать, начинаются проблемы.
Код UART навсякий случай:
Код
void usrtSendByte( u08 data )
{
cli();
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
_delay_ms(2);
/* Put data into buffer, sends the data */
UDR = data;
sei();
}
u08 usrtReadByte( void )
{
cli();
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
_delay_ms(2);
/* Get and return received data from buffer */
u08 temp=UDR;
sei();
return temp;
}
На лицо полное не понимание чего-то

Прошу помощи.
Спасибо
Сообщение отредактировал rezident - Mar 10 2010, 14:12
Причина редактирования: оформление цитаты исходника.