Доброго времени суток коты и кошечки
пробую написать обмен по аппаратному UART с использованием прерываний и возникла непонятка, далее код
инициализирую UART так
обработчик прерывания по приему байта
собственно main
проблема в чём, в том что после инициализации uart-а не происходит возврат в ф-цию main ...
переменная dbg об этом говорит ясно (в протеусе)
т.е. запускаю моделирование, останавливаю и смотрю значения переменных
по идее с dbg должно происходить следующее
dbg = 3 - начало main
dbg = 2 - инициализировали uart и разрешили прерывания
dbg = 1 - вошли в главный while
dbg = 0 - по uart получили CR
а в протеусе я вижу что dbg = 3, т.е. не произошёл возврат в main после инициализации uart ...
при этом если в терминал протеуса отправить строку и <CR> то переменная busy встаёт в 1, собственно как и должно ...
wtf друзья ?
пробую написать обмен по аппаратному UART с использованием прерываний и возникла непонятка, далее код
инициализирую UART так
Код: Выделить всё
//hardware UART
#define baudrate 9600L
#define bauddivider (F_CPU/(16*baudrate)-1)
#define HI(x) ((x)>>8)
#define LO(x) ((x)& 0xFF)
void HUART_init( void )
{
//настройка скорости обмена
UBRRL = LO(bauddivider);
UBRRH = HI(bauddivider);
//8 бит данных, 1 стоп бит, без контроля четности
UCSRC = ( 1 << URSEL ) | ( 1 << UCSZ1 ) | ( 1 << UCSZ0 );
//разрешить прием, передачу данных и прерывание по приёму байта
UCSRB = ( 1 << TXEN ) | ( 1 << RXEN ) | (1 << RXCIE );
}Код: Выделить всё
ISR( USART_RXC_vect )
{//доделать проверку на переполнение буфера
unsigned char rxbyte = UDR;
if (m_busy == 0)
{
command_buff[byte_count] = rxbyte;
byte_count++;
if (rxbyte == CR)
{
m_busy = 1;
}
}
else
{
//как-то уведомить что занят пока
}
}Код: Выделить всё
int main(void)
{
//обнуляем переменные команд
m_busy = 0;
byte_count = 0;
//
dbg = 3;
HUART_init();
sei();
dbg = 2;
while(1)
{
dbg = 1;
if(m_busy == 1)
{
dbg = 0;
//тут то-то делаем с полученными данными
m_busy = 0;
byte_count = 0;
}
}
}переменная dbg об этом говорит ясно (в протеусе)
т.е. запускаю моделирование, останавливаю и смотрю значения переменных
по идее с dbg должно происходить следующее
dbg = 3 - начало main
dbg = 2 - инициализировали uart и разрешили прерывания
dbg = 1 - вошли в главный while
dbg = 0 - по uart получили CR
а в протеусе я вижу что dbg = 3, т.е. не произошёл возврат в main после инициализации uart ...
при этом если в терминал протеуса отправить строку и <CR> то переменная busy встаёт в 1, собственно как и должно ...
wtf друзья ?

