Перейти к содержанию

Прием По Usart В Cvavr


artos5

Рекомендуемые сообщения

Добрый день уважаемые! Есть вопрос , на который не могу найти / получить ответ.

Есть такой код:


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

// USART Receiver interrupt service routine
interrupt [uSART_RXC] void usart_rx_isr(void)
{
char status,data;
unsigned char buffer_clear , x;
//status=UCSRA;
data=UDR;
//if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
// {
buffer_clear=0;
//for(x=0; x<99; x++) if(rx_buffer[x] != 0) buffer_clear=1;

//if(buffer_clear==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;
 };
// };

PORTB.0 = ~PORTB.0;
}

С генерированный визардом.

Если , к примеру передатчиком , с другой стороны послать "START" , По какому адресу окажется это слово в массиве rx_buffer[] ?

Что то не могу отловить... Или его нужно искать в массиве? И оно может быть в любых ячейках? Вроде по коду видно, что запишутся символы в первые ячейки....

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

По какому адресу окажется это слово в массиве rx_buffer[] ?

По адресу rx_buffer[rx_wr_index]. После чего rx_wr_index инкрементируется и следующая посылка придет в следующую ячейку массива.

Когда массив заполнится, rx_wr_index сбросится в нуль и массив начнет заполняться с начала, при этом переменная rx_buffer_overflow сигнализирует, что буфер был заполнен.

Изменено пользователем TDSS

Иван Сусанин - первый полупроводник

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Кажется я понял : ))) Самый первый раз , данные окажутся в 0 ячейке. То есть мне можно после считывания очищать и обнулять буфер, и данные каждый раз в начале?

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Да. А если надо чтоб данные всегда были в 0 ячейке массива сделайте RX_BUFFER_SIZE 1

Изменено пользователем TDSS

Иван Сусанин - первый полупроводник

Ссылка на комментарий
Поделиться на другие сайты

так не подходит. мне нужно получать сразу около 30 байт . Нужно просто обнулять массив и обнулять счётчик.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Тогда как только rx_wr_index станет равным 30, забираете данные из буфера и обнуляете rx_wr_index. Это можно вынести в отдельную функцию которая выполнится при достижении необходимого количества данных в массиве. Можно разметить её в отдельном файле и вызывать её передав ей в качестве аргумента указатель на массив.

if (rx_buffer_index == 30)
{
 ReadData(buffer);
 rx_buffer_index = 0;
}

void ReadData(char *buffer)
{
 //здесь обрабатываем данные из буфера
}

Изменено пользователем TDSS

Иван Сусанин - первый полупроводник

Ссылка на комментарий
Поделиться на другие сайты

Именно так и хочу сделать! Только немного усовершенствовать. А именно:

Буду добавлять в посылку спец. символы, и в буфере потом их отлавливать. Отловив спец. символ - можно смело читать данные до след. спец. символа.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

ПС: Залил такой код в общий исходник - все супер работает!!!

 #asm("cli")
        if(rx_buffer[0] == 'S') printf("OK");
        Ttermo[0] == rx_buffer[1]; // пред прогрев сотки / или десятки если <100
        Ttermo[1] == rx_buffer[2]; // пред прогрев десятки / или единицы если <100
        Ttermo[2] == rx_buffer[3]; // пред прогрев единицы

        for(x=0; x<59; x++) rx_buffer[x] = 0;
        rx_wr_index=0;
    #asm("sei")

Код тестовый.

количество байт для получения , будет гораздо больше :) всего около 40.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

А зачем запрещать прерывания для printf ? Он же долго выполнятся будет. Это равносильно тому, что его запихнуть в обработчик прерываний :)

И тут

			 Ttermo[0] == rx_buffer[1]; // пред прогрев сотки / или десятки если <100
			 Ttermo[1] == rx_buffer[2]; // пред прогрев десятки / или единицы если <100
			 Ttermo[2] == rx_buffer[3]; // пред прогрев единицы

наверное знаки "=", а не "==" :huh:

Ссылка на комментарий
Поделиться на другие сайты

Да-да со знаками накосячил : ))) копи-пасте - злая штука...... :)

А зачем запрещать прерывания для printf ?

Да все равно, по алгоритму у меня в это время , на линии будет тишина :)

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Методом долгого т*ахания своего мозга , вырисовался такой программный понос : )))

Код принимает строку , обрабатывает каждый символ , преобразовывает в число и складывает каждый разряд.

if(rx_buffer[0] == 'S') printf("OK");
x=1;
Tdenat_temp[0] = rx_buffer[x]; // данные о температуре
x++;

if (rx_buffer[x] != ' ')
{
Tdenat_temp[1] = rx_buffer[x];
}
else
{
Tdenat_temp[1] = 0xFF;
}
x++;

if (rx_buffer[x] != ' ' && Ttermo[1] !=0xFF)
{
Tdenat_temp[2] = rx_buffer[x];
}
else
{
Tdenat_temp[2] = 0xFF;
}
x++;

if (rx_buffer[x] != ' ' ) // десятые доли градусов
{
Tdenat_temp[3] = rx_buffer[x];
}
else
{
Tdenat_temp[3] = 0xFF;
}
x++;

Tdenat_temp[0] -= 48;
Tdenat_temp[1] -= 48;
Tdenat_temp[2] -= 48;
Tdenat_temp[3] -= 48;

if(Ttermo[2] > 9)
{
Tdenat_temp[4] = Tdenat_temp[0] * 10 + Tdenat_temp[1]; // готовое время
}
else
{
Tdenat_temp[4] = Tdenat_temp[0] * 100 + Tdenat_temp[1] * 10 + Tdenat_temp[2]; // готовое время при >99
}

Tdenat_temp_reg = Tdenat_temp[4] + Tdenat_temp[3]/10; // преобразование температуры с десятыми долями градуса.

Что может быть лучше в радиоэлектронике, чем программирование микроконтроллеров ?

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...