Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

Счет принятых байт в CodeVisionAVR

Отправлено DIMITRIY0000 24 октября 2009, г. 13:46


Здравствуйте!
Разрабатываю устройство на AVR, которое при помощи аппаратных ШИМ управляет нагрузкой.
Значения ШИМ принимаются по USART, интерфейс RS 232.Передавются пакеты по 8 байт. Первые три байта значения трех ШИМ соответственно,
как правильно считывать номера принятых байт.есть подозрение, что непрaвильно расположена переменная счета принятых байт.
Вот кусок программы:

unsigned int schet_ad; //СЧЕТЧИК ПРИНЯТЫХ АДРЕСОВ


// USART Receiver buffer
#define RX_BUFFER_SIZE 8 //величина буфера
// остановился здесь
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;
//*************
schet_ad ++; //СЧЕТЧИК АДРЕСОВ
//**************
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
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 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: Off
// USART Mode: Asynchronous
// USART Baud rate: 115200 (Double Speed Mode)
UCSRA=0x02;
UCSRB=0x90;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x08;
----------------------------
while (1)
{
while (schet_bayt != schet_ad ) //СРАВНЕНИЕ СКОЛЬКО ДЛИТСЯ ПАКЕТ
{
if (schet_ad == 1) //ВЫДЕЛЕНИЕ АДРЕСА 1
{
pwm1 = getchar();
OCR2 = pwm1; //шим
};//ДЛЯ if (schet_ad == 1)

if (schet_ad == 2) //ВЫДЕЛЕНИЕ АДРЕСА 2
{
pwm2 = getchar();
OCR1A = pwm2; //шим
};//ДЛЯ if (schet_ad == 2)
if (schet_ad == 3) //ВЫДЕЛЕНИЕ АДРЕСА 3
{

flag1 = 1; //УСТАНОВКА ФЛАГА-КОНЕЦ СЧЕТА НУЖНЫХ АДРЕСОВ
pwm3 = getchar();
OCR1B = pwm3; //ТАИМЕР 1
flag1 = 1; //УСТАНОВКА ФЛАГА-КОНЕЦ СЧЕТА НУЖНЫХ АДРЕСОВ
};//ДЛЯ if (schet_ad == 3)

}; //ДЛЯ while (schet_ad <= schet_bayt-1)


if (flag1 == 1) //ОБРАБОТКА ВСПОМОГАТЕЛЬНОГО ФЛАГА
{
schet_ad = 0; //ОБНУЛЕНИЕ СЧЕТЧИКА АДРЕСОВ
flag1 = 0; //установка флага в0
}//ДЛЯ if (flag1 == 1)
};//ДЛЯ while (1)



Составить ответ | Вернуться на конференцию.

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
сложите 2 и 3:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru