Пн мар 29, 2021 18:49:38
#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){}
}
Пн мар 29, 2021 19:20:17
Вт мар 30, 2021 11:59:02
Без крайней нужды так делать не стоит. При входе в прерывание глобальные прерывания автоматически запрещаются, потом перед самым выходом вы их вручную разрешаете, но остается небольшой зазор, когда прерывание уже разрешено, но еще не завершилось, то есть не освободило стек. И если в этот момент возникнет еще одно, а потом еще... В общем, срыв стека так и выглядит.Попробуйте отключить прерывание при вхождении в USART_RXC_vect. Потом снова включить перед выходом из обработки прерывания.
Вт мар 30, 2021 13:07:11