Проблема с UART

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 1
Зарегистрирован: Чт сен 25, 2014 11:29:18

Сообщение Sergo2 »

Dear Kot's! I neeeeeed HELP!!! Прошу помощи, тк уже замучался и не знаю куда еще обратиться!
Проблема с передачей данных по уарт через интерфейс max485. Передаю данные между двумя контроллерами Atmega16 (master)<->Atmega8. В одну сторону (от мастера к слейву передача проходит на ура!) отправляю символ, на приемной стороне он опознается, производится соответствующее действие, но в обратную сторону беда - передача идет, но единожды и передается не то, что нужно!
Думаю инит уарта приводить смысла нет, тк передача проходит (на обоих контроллерах прошита одна и таже конфигурация)
На стороне мастера:

Код: Выделить всё

ISR(TIMER1_OVF_vect) //опрос кнопок в таймере
{
	//--------------кнопка 1------------------------------------
	if (bit_is_clear(PINA,4)) // если нажали кнопку 1
	{
		knopka1 = 1;
	}
	else
	{
		knopka1 = 0;
	}

	if (knopka1 != knop_1) //если произошло изменение состояния кнопка
	{
		if (knop_1 == 0) //кнопка нажата
		{
			PORTD &= ~(1<<PD5); //загорелась лампочка
			
			knop_1 = 1;
		}
		else // кнопка отжата
		{
			PORTD |= (1<<PD5); //выкл лампочка
			knop_1 = 0;
		}
	}	
	//-----------------------------------------------------------------
}
далее в главном цикле:

Код: Выделить всё

while(1)
	{
		if (knop_1 == 1)
		{
			cli();
			PORTD |= (1 << PD3); //включили передачу
			uart_putc('g'); //отправили символ
			PORTD &= ~(1<<PD3); //выкл передачу
	    	       sei();
               }
	}
На приемной стороне(слейве)
ISR(USART_RXC_vect) //
{
PORTB &= ~(1<<PB1); //вкл лампочку
unsigned char c;
c = UDR;

if (c == 'g')
{
PORTD |= (1 << PD2); //вкл передачу
uart_putc('a'); //на тебе ответ!
PORTD &= ~(1 << PD2); //выкл передачу
}
}

На приемной стороне (стороне мастера)

Код: Выделить всё

ISR(USART_RXC_vect) 
{
    PORTB &= ~(1<<PB0); //вкл лампочку
    unsigned char cc;
   cc = UDR;
    if(cc == 'a')
   {
      lcd_dat('A', 0x00); //вывод на дисплей
   }
   else
   {
      lcd_dat('B', 0x00);вывод на дисплей
   }
}



Процедура отправки:

Код: Выделить всё

void uart_putc( char c )
{
  UDR = c;
  while((UCSRA & (1 << UDRE)) == 0); 
  while ((UCSRA & (1<<TXC)) == 0);   	
  _delay_us(90); //без нее не работает
}

Помогите кто чем может! Замучался - сил нет!!!
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

А бит НАПРАВЛЕНИЕ ПЕРЕДАЧИ в MAX485 на мастере и на слейве дергаете ? Это бит 2 порта D? . Линия длинная? Помех нет ? "Не то, что нужно " - это как ? Слейв правильные данные шлет и они искажаются при передаче или Х.З. ?Надо осциллом посмотреть на выходе UART . Какой протокол ? Мастер при приеме от слейва не выдает Frame Error ?
Нужно в слейве передаваемые данные продублировать, например, в EEPROM - затем можно прочитать и определить, что же он передавал.
Само собой понятно -- бит НАПРАВЛЕНИЕ ПЕРЕДАЧИ на мастере и слейве должны быть противоположны. Поставить светодиод на бит НАПРАВЛЕНИЕ ПЕРЕДАЧИ на слейве и убедиться, что он каждый раз пытается посылать ответ, иначе ошибка не в приеме-передаче данных, а в главной проге.
Реклама
Ответить

Вернуться в «AVR»