Юарт сам отправляет после приема

Обсуждаем контроллеры компании Atmel.
Ответить
vadosSinica
Родился
Сообщения: 3
Зарегистрирован: Пт май 03, 2024 14:29:46

Юарт сам отправляет после приема

Сообщение vadosSinica »

приветствую всех, мучаюсь с юартом, есть прикол если сразу после включения отправить 4 символа на контроллер, то обратно приходит 4 пустых символа(хотя я не пытался ничего отправить), потом если с контроллера отправить символы то они нормально приходят, полсе этого если принять на контроллере и не пытыться отправить обратно то приходит то что было отправлено с контроллера. Другими словами при приеме на контроллере обратно само отправляется то что было в чем-то типа промежуточного буфера. атмега328p в симуляторе. Что Это Такое?

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

ISR(USART_RX_vect){  
	UCSR0B &= ~(1<<UDRIE0);
	if (rx_index < 4){
	  rxBuff[rx_index] = UDR0;
	  rx_index++;}
	if(rx_index >= 4){
		UCSR0B |= (1 << UDRIE0) | (1 << TXCIE0);  
		rx_index = 0;
		process_data = 1;
	}
}

ISR(USART_UDRE_vect) 
{
	if(tx_index < 4){ 	
		UDR0 = txBuff[tx_index];
		tx_index++;
	}
	else{
		tx_index = 0;
		UCSR0B &= ~(1 << UDRIE0);  
	}
}


void init_usart(void)
{
	UBRR0H = (uint8_t)(UBRR >> 8);
	UBRR0L = (uint8_t)UBRR;
	//Enable rx/tx  
	UCSR0B = (1<<TXCIE0) | (1<<RXCIE0) |(1 << RXEN0) | (1 << TXEN0);
	//Set frame format 8N1
	UCSR0C = (1 << UCSZ00) | (1 << UCSZ01);
	sei();
}

void tx_uart_string(char* str){
	for (int i = 0; i < 4; i ++){           
		txBuff[i] = str[i];
	}
	tx_index = 0;
	UDR0 = txBuff[tx_index++];	
	UCSR0B|=(1<<UDRIE0);
}
Реклама
vadosSinica
Родился
Сообщения: 3
Зарегистрирован: Пт май 03, 2024 14:29:46

Re: Юарт сам отправляет после приема

Сообщение vadosSinica »

Заработало вот так нормально, опять же не сильно понятно почему

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

volatile char txBuff[5];
volatile char rxBuff[5];
volatile int tx_index = 0;
volatile int rx_index = 0;

ISR(USART_RX_vect){ 
	UCSR0B &= ~(1 << UDRIE0);
	UCSR0B &= ~(1 << TXEN0);// вот прям тут запретил передачу
	if (rx_index < 4){
	  rxBuff[rx_index] = UDR0;
	  rx_index++;}
	if(rx_index >= 4){
		rx_index = 0;
		process_data = 1;
	}
}

ISR (USART_TX_vect)  // именно так с пустым работает нормально, без него передает несколько раз строку, строку для передачи
{

}

ISR(USART_UDRE_vect) 
{
	if(tx_index < 4){ 	
		UDR0 = txBuff[tx_index];	
		tx_index++;
	}
	else{
		tx_index = 0;
		UCSR0B &= ~(1 << UDRIE0); 
	}
}


void init_usart(void)
{
	//Set baud
	UBRR0H = (uint8_t)(UBRR >> 8);
	UBRR0L = (uint8_t)UBRR;
	//Enable rx/tx  
	UCSR0B = (1<<TXCIE0) | (1<<RXCIE0) |(1 << RXEN0) | (1 << TXEN0);
	//Set frame format 8N1
	UCSR0C = (1 << UCSZ00) | (1 << UCSZ01);
	sei();
}

void tx_uart_string(char* str){
	UCSR0B|= (1 << TXEN0);// а тут прямо перед передачей разрешаем передачу
	for (int i = 0; i < 4; i ++){           
		txBuff[i] = str[i];
	}
	tx_index = 0;
	UDR0 = txBuff[tx_index++];	
	UCSR0B|= (1 << UDRIE0);
}
Реклама
Martian
Друг Кота
Сообщения: 12867
Зарегистрирован: Сб дек 18, 2021 19:25:32
Контактная информация:

Re: Юарт сам отправляет после приема

Сообщение Martian »

а где проверка, что передавать уже можно?
vadosSinica
Родился
Сообщения: 3
Зарегистрирован: Пт май 03, 2024 14:29:46

Re: Юарт сам отправляет после приема

Сообщение vadosSinica »

[uquote="Martian",url="/forum/viewtopic.php?p=4577264#p4577264"]а где проверка, что передавать уже можно?[/uquote]

Вы про вот такие проверки перед записью в udr?

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

while (!(UCSR0A & (1<<UDRE0)));
		UDR0 = txBuff[tx_index];	
или еще какие-то бывают?
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

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