по UART-у перестают приниматся данные

Обсуждаем контроллеры компании Atmel.
Ответить
zsxdcf
Открыл глаза
Сообщения: 61
Зарегистрирован: Вт авг 25, 2009 08:14:38

по UART-у перестают приниматся данные

Сообщение zsxdcf »

Дорогие коты
Нужно принять данные и выловить нужные символы по UART ,AVR atmega8 в CVAVR.
этот участок программы ,сгенерированный визардом CVAVR приводится ниже:


#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 120
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;

//-----------------------------------------мой код для выловливания


if(data==0x4E)
a1=1;
if(data==0x3E)
a2=1;
if(data==0x2D)
a3=1;
if(data==0x33)
a4=1;
if(data==0x43)
a5=1;
if(data==0x67)
a6=1;



//-------------------------------------------------------------- конец моего кода

if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif

// USART Transmitter buffer
#define TX_BUFFER_SIZE 120
char tx_buffer[TX_BUFFER_SIZE];

#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif

// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

// SPI functions
#include <spi.h>

// Declare your global variables here

void main(void)
{
-----
-------

когда увеличиваю количкство вылавливаемых символов после определенного числа UART перестает принимать . в буфуре записываются одни нули.
Уменьшу -опять нормально .
Ктонибудь может разобрать меня в этом вопросе?
Может надо по другому принимать и выловить нужные символы
Заранее благодарен.
Реклама
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: по UART-у перестают приниматся данные

Сообщение uk8amk »

Почему бы не проводить сравнение в самой программе?

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

interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
	uart_data = data;
};
}

void main(void)
{
....
if( uart_data == CODE1 )
{
	//делать что-то
	uart_data = RESET_CODE;
};
....
}
Реклама
krokodandi
Открыл глаза
Сообщения: 47
Зарегистрирован: Ср ноя 12, 2014 14:48:39

Re: по UART-у перестают приниматся данные

Сообщение krokodandi »

код для вылавливания прост, а вот все остальное заумно как-то.
Мка символ вообще принимает?
У меня, на самом деле, проблема схожая. =-)
Только мне не переслать символ. Бяка какая-то. Но вот может быть тебе поможет ютьб
http://www.youtube.com/channel/UCczziZl2-kvBUhzX9awdNEA
Канал этого мужика разрывается от примеров работы с мк. Да и посмотреть есть на что. Очень наглядно пишет код
Ответить

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