[an error occurred while processing this directive]
|
Собственно код
void main(void)
{
LONG ADelay;
BYTE ABreak = 0;
BYTE AReceive;
_CLI();
DDRD = 0x44;
PORTD = 0x00;
UCR = 0x1B;
UBRR = 51;
CLKPR = 0x80;
CLKPR = 0x00;
while(1)
{
if (CHECKBIT(USR,RXC) == 0x80)
{
AReceive = UDR;
if (AReceive == 'G')
{
ADelay = 0;
while (CHECKBIT(USR,RXC) != 0x80)
{
ADelay = ADelay + 1;
if (ADelay >= 10000)
{
ABreak = 1;
break;
}
}
if (ABreak == 0)
{
AReceive = UDR;
if (AReceive == 'R')
{
ADelay = 0;
while (CHECKBIT(USR,RXC) != 0x80)
{
ADelay = ADelay + 1;
if (ADelay >= 10000)
{
ABreak = 1;
break;
}
}
if (ABreak == 0)
{
AReceive = UDR;
if (AReceive == 'P')
{
ADelay = 0;
while (CHECKBIT(USR,RXC) != 0x80)
{
ADelay = ADelay + 1;
if (ADelay >= 10000)
{
ABreak = 1;
break;
}
}
if (ABreak == 0)
{
AReceive = UDR;
if (AReceive == 1)
{
while (CHECKBIT(USR,UDRE) == 0x00);
UDR = 'G'; //WDT v1.00'+ #1
while (CHECKBIT(USR,UDRE) == 0x00);
UDR = 'R';
while (CHECKBIT(USR,UDRE) == 0x00);
UDR = 'P';
while (CHECKBIT(USR,UDRE) == 0x00);
UDR = '0 ';
while (CHECKBIT(USR,UDRE) == 0x00);
UDR = '0';
while (CHECKBIT(USR,UDRE) == 0x00);
UDR = '1';
while (CHECKBIT(USR,UDRE) == 0x00);
UDR = 1;
}
}
}
}
}
}
}
ABreak = 0;
}
}
Проще некуда, решение в лоб, но почему то работает не всегда корректно. Когда пограммировал mega128 прием вешал на прерывание по переполнению таймера (команда из одного байта состояла), а передачу вешал на одну из функций в теле main, на любой скорости никаких проблем. Принимаю сообщения с помощью компа, программа коректно работает, с другими устройствами никаких проблем. Дело скорее всего в приведенной программе. Имена регистров UART умышленно заменены в h файле для совместимости с кодом для 90S2313. Заранее спасибо!
E-mail: info@telesys.ru