_______________
Цитата
Что то у меня ничего не получаетсяsad.gif, а никто не помощет исправить исходник, который в первом сообщении лежит?
Laksus Дата Dec 25 2005, 21:26
_______________
Во первых вот
Нажмите для просмотра прикрепленного файла проверенный, т.е. работающий, (AT90S2313, 4.0MHz) исходник,
с оставленными правками.
Во вторых:
Мой предыдущий совет был непроверен. Основывался на примерах ICC.
Но, когда попробовал на макетке, обнаружилось следующее:
-Когда отправлял 2 символа, то проблем нет как с вариантом
{
UDR=c;
}
так и с вариантом
{
while((USR&0x20)==0);
UDR=c;
}
Но, когда вместо двух символов захотел отправить серию из 12 символов:
putchar('R');
putchar('x');
putchar('0');
putchar('1');
putchar('2');
putchar('3');
putchar('4');
putchar('5');
putchar('6');
putchar('7');
putchar('8');
putchar('9');
то в терминале (http://bray.velenje.cx/avr/terminal,9600 baud)
принималось: ...R9R9R9R9R9... . Причем как без while(), так и с while().
Наверное компилятор оптимизировал функцию и while выбросил,
так как она пустая .
Как правильно решить это я не знаю, но по "колхозному" сделал так:
volatile unsigned char temp1;
void putchar(char c)
{
while ((USR & 0x20) == 0)
{
temp1++;
}
; // UDRE, data register empty
UDR = c;
}
После этого в терминале появилось: ...Rx0123456789Rx...,
что и хотелось.
2005 12 27
Александр
PS После того, как написал это, еще немного поигрался со схемкой.
И обнаружил, что в опциях компилятора стояло
"Не использовать регистры R20...R23".
После того, как убрал галочку, получилось нормально и без volatile...temp1.
Хотя это не должно бы влиять.
Но после обратной установки галочки компилирует все равно правильно без
volatile...temp1. В чем была проблема я так и не понял, какие то глюки.
А без
while((USR&0x20)==0);
в терминале, по прежнему, принимаю только первый и последний символы группы.