Зацикливается прерывание USART_RXC_vect

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

Подскажите по какой причине, при отправке одного байта в контроллер, в ответ начинают приходить бесконечное кол-во данных? Вроде как функцтя прерывантя дожна сработать один раз. Отправляю одно двоеточие(:) в аски.

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


#include <avr/io.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define F_CPU 8000000UL

#define REDE_PORT PORTD
#define REDE_PIN PD2
#define TRANSMIT 	REDE_PORT|=1<<REDE_PIN;
#define RECIEVE 	REDE_PORT&=~(1<<REDE_PIN);

void USART_Init( unsigned int ubrr)//Инициализация модуля USART
{
	/* Задаем скорость работы USART */
	UBRRH = (unsigned char)(ubrr>>8);
	UBRRL = (unsigned char)ubrr;
	/* Разрешаем прием и передачу по USART */
	UCSRB=(1<<RXEN)|( 1<<TXEN);
	UCSRB |= (1<<RXCIE);
	UCSRC |= (1 << URSEL)| 
	(1 << UCSZ1)|(1 << UCSZ0); 
}

void USARTTransmitChar(char c) {
  while(!( UCSRA & (1<<UDRE)));
  UDR = c;
}

ISR(USART_RXC_vect )
{
	TRANSMIT
	USARTTransmitChar('H');
	RECIEVE
	_delay_ms(100);
}

int main(void)
{
	sei();
	USART_Init(51);
	while (1){}
}


На картинке пришедшие данные
Вложения
Screenshot_2021-03-29_21-52-12.png
(82.67 КБ) 107 скачиваний
Реклама
Родился
Сообщения: 15
Зарегистрирован: Пн мар 01, 2021 09:01:13

Сообщение trojninalex »

Попробуйте отключить прерывание при вхождении в USART_RXC_vect. Потом снова включить перед выходом из обработки прерывания.

Добавлено after 4 minutes 49 seconds:
В USARTTransmitChar сделайте ожидание окончании передачи перед выходом из функции.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Не увидел в вашем прерывании чтения UDR, по которому контроллер понимает что байт прочитан и снимает флаг прерывания. Ну или можете попытаться сами снять флаг, но это сложнее.
Попробуйте отключить прерывание при вхождении в USART_RXC_vect. Потом снова включить перед выходом из обработки прерывания.
Без крайней нужды так делать не стоит. При входе в прерывание глобальные прерывания автоматически запрещаются, потом перед самым выходом вы их вручную разрешаете, но остается небольшой зазор, когда прерывание уже разрешено, но еще не завершилось, то есть не освободило стек. И если в этот момент возникнет еще одно, а потом еще... В общем, срыв стека так и выглядит.
Прорезались зубы
Сообщения: 214
Зарегистрирован: Чт май 23, 2013 18:31:58

Сообщение Али777 »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4006953#p4006953"]Не увидел в вашем прерывании чтения UDR, по которому контроллер понимает что байт прочитан и снимает флаг прерывания.[/uquote]
Огромное спасибо. Добавил чтение UDR. Все заработало. Бессонная ночь подошла к концу.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

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