Так вот, начал я с того, что просто наладил обмен по двум UART. Все работало. Затем присоединил микросхемы MAX487, добавил контроль переключения режимов приема/отправки. Все работать перестало.
Код Меги:
Код: Выделить всё
void initUART()
{
UCSRB|=(1<<3)|(1<<4);
UBRRH=0x00;
UBRRL=0x33;
}
int main(void)
{
lcd_init();
lcd_str("first str");
lcd_gotoxy(1,5);
lcd_str("second str");
initUART();
DDRD|=0b00001000;
lng=strlen(mystr);
_delay_ms(250);
lcd_clr();
lcd_str("after clr");
_delay_ms(1000);
while (1)
{
_delay_ms(500);
PORTD|=0b00001000;
while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема
UDR = '1'; //Начало передачи данных
lcd_str("w");
_delay_ms(500);
while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема
UDR = '5'; //Начало передачи данных
while (1)
{PORTD&=0b11110111;
if ((UCSRA & (1<<7)))
{
lcd_clr();
rc=UDR;
char mystr1[33];
sprintf(mystr1,"t1=%i",rc);
lcd_str(mystr1);
break;
}
}
}
}
Код: Выделить всё
void USART_Init( unsigned int baudrate ) //Функция инициализации USART
{
UBRRH=0x0;
UBRRL=0x33;//2A
UCSRB = ( 1 << RXEN ) | ( 1 << TXEN ); //Разрешение на прием и н апередачу через USART
UCSRC = (1<<USBS) | (3<<UCSZ0);
}
void main(void)
{
unsigned char devices; //переменная в которой количество присоеденённых датчиков
int temp; //переменная для хранения температуры
char addr;
DDRD.3=1;
PORTD.3=0;
devices=w1_init(); //ищим датчики
USART_Init( 47 );
while(devices>0) //бесконечный цикл, если датчик подключен devices>0
{
//USART_Transmit( USART_Receive()-0xA0); //Отправка принятого символа назад
delay_ms(500);
PORTD.3=0; //перевод в режим приема
temp=ds18b20_temperature(0); //читаем температуру
if (temp>1000){ //если датчик выдаёт больше 1000
temp=4096-temp; //отнимаем от данных 4096
temp=-temp; //и ставим знак "минус"
}
delay_ms(500);
addr = USART_Receive();
if (addr=='1')
delay_ms(500);
addr = USART_Receive();
if (addr=='5')
{
delay_ms(400);
PORTD.3=1; // перевод в режим передачи
USART_Transmit(temp);
}
};
}
Файл проекта прилагаю. Там схема протеуса и все проекты.