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

Передача по USART 9 бит (9N1)


Н_Д_А

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

Всем привет).

Может, кому-то эта статья  сэкономит много времени и нервов. 

Недавно  по работе встретился с интересной задачкой.

Нужно было передать на железку по порту RS485 информацию для проверки работоспособности последней.

Так как не всегда имеется в ремонте вся система, то для начала нужно было посмотреть, на заведомо исправной системе, что же там между ними (железками) передаётся.

Логический анализатор показал что девайсы общаются по не совсем стандартному, а по  9ти битному протоколу (USART 9n1).

А это усложняло задачу, так-так известные мне терминальные программы его не поддерживают.  И без бубна не обойтись))).

Начались поиски решения.

Через некоторое время стало понятно, что AVR позволяет это делать и даже в даташите подробно это описывает.

Дело за малым. Реализация задуманного))). 

Все регистры выставлены по документу………..Для Atmega8a.

void USART_Init( unsigned int speed)           	 		//Инициализация модуля USART
{
             UBRRH = (unsigned char)(speed>>8);
             UBRRL = (unsigned char)speed;            
             UCSRB=(1<<RXEN)|( 1<<TXEN);       			//Включаем прием и передачу по USART
             UCSRB |= (1<<RXCIE);                     	//Разрешаем прерывание при передаче
             UCSRA |= (1<<U2X);                       	//удвоение скорости
             UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ1)|(1<<UCSZ0);
             UCSRB |= (1<<UCSZ2);                    	// Включаем 9bit режим
             // Обращаемся именно к регистру UCSRC (URSEL=1)
             // ассинхронный режим (UMSEL=0), без контроля четности (UPM1=0 и UPM0=0)
             // 1 стоп-бит (USBS=0), 8-бит посылка (UCSZ1=1 и UCSZ0=1)
             // если (UCSZ1=1 и UCSZ0=1 и UCSZ2=1) 9bit mode.
             // UCSRC |= (1<<UPM1);//четность 
} 

По даташиту передача 9го бита происходит установкой или сбросом TXB8. 

То есть, установили бит, передаётся 1 в старшем 9ом разряде, сбросили – 0. 

void USART_Transmit( unsigned int data )   // функция передачи 9ти бит из даташита.
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Copy ninth bit to TXB8 */
UCSRB &= ~(1<<TXB8);
if ( data & 0x0100 )                 		//не понял, что они хотели этим сделать.
UCSRB |= (1<<TXB8);
/* Put data into buffer, sends the data */
UDR = data;
} 

И вот незадача, числа размером до 1 байт передаются без проблем, а числа больше 0xFF (255) нет).

А устройство передаёт числа до 510.

Предлагаю решение.  Может и не самое лучшее, но вполне работоспособное.

int main(void)
{
    USART_Init (103);//9600
//------------------------------------------------------------------------------------
    while(1)
    {
        for (i=0; i<22; i++)
       {
            code_simbol = simbol[i]; //символ из массива
//-------------------------------------отправка в UART--------------------------------
            if (code_simbol > 255)
           {
               pr=1; // флаг передачи символа больше 0xff (255 десятичное)
           }
               else
               {
                   pr=0; // флаг передачи символа меньше 0xff
               }
                  USART_Transmit(code_simbol,pr);//собственно сама функция отаравки
       }
    }
}

А теперь и сама функция передачи .

void USART_Transmit( unsigned char data, uint8_t prisnak ) 	//Функция отправки по USART
{
    while ( !(UCSRA & (1<<UDRE)) ); 						//Ожидание опустошения буфера приема
        if (prisnak==1)
       {
            UCSRB |= (1<<TXB8);								//устанавливаем для передачи еденицы в старшем разряде
       }
            else
           {
                UCSRB &= ~(1<<TXB8);						//сбрасываем старший разряд
           }
/* Put data into buffer, sends the data */
UDR = data;													//Начало передачи данных
asm volatile ("nop");

Соответственно если число для предачи мньше 256 мы передаём его при нулевом 9ом бите.

Ну а если больше то 9й бит выставляем в единицу.

А вот и результат.

log.png.4d9236f61971a932b43f4cfc1759bddc.png

 

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

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

5 часов назад, Н_Д_А сказал:
//не понял, что они хотели этим сделать

именно это они и хотели сделать - установить бит TXB8, если число больше 255.

но предварительно до начала передачи этот бит сбрасывается, а потом проверяется передаваемое число на превышение 255.

условие на превышение 255

if ( data & 0x0100 )

можно было записать и так:

if ( data > 0xFF )

или

if ( data >= 0x100 )

ВСЁ в той функции передачи делается СРАЗУ и без лишних телодвижений.

поэтому все твои измышления с созданием отдельного признака превышения и созданием отдельной функции совершенно излишни.

и поэтому твоя тема не может быть никому полезной.

Мудрость приходит вместе с импотенцией...

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

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

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

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

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

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

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

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

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

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

не вижу причин, чтобы не работало.

повторю еще раз:

сбросил бит.

проанализировал число.

если больше 255, установил бит.

абсолютно то же самое, что ты делаешь по предварительно установленному (или не установленному) признаку.

Мудрость приходит вместе с импотенцией...

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

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

  • 6 месяцев спустя...
В 29.12.2021 в 16:26, Starichok сказал:

не вижу причин, чтобы не работало.

повторю еще раз:

сбросил бит.

проанализировал число.

если больше 255, установил бит.

абсолютно то же самое, что ты делаешь по предварительно установленному (или не установленному) признаку.

Снова столкнулся с этой проблемой, но уже на 128ой меге.

Наверное что - то делаю не так. Писал в Microchip Studio.

Код прилагаю. Без телодвижений не работает, на выходе ересь)))).

Может потому что пытаюсь затолкать в библиотеку?

UART_128_C.rar

2 минуты назад, Н_Д_А сказал:

Снова столкнулся с этой проблемой, но уже на 128ой меге.

Наверное что - то делаю не так. Писал в Microchip Studio.

Код прилагаю. Без телодвижений не работает, на выходе ересь)))).

Может потому что пытаюсь затолкать в библиотеку?

UART_128_C.rar 26 \u043a\u0411 · 0 загрузок

А это старое под мега 8

 

usart_9n1.7z

4 минуты назад, Н_Д_А сказал:

Снова столкнулся с этой проблемой, но уже на 128ой меге.

Наверное что - то делаю не так. Писал в Microchip Studio.

Код прилагаю. Без телодвижений не работает, на выходе ересь)))).

Может потому что пытаюсь затолкать в библиотеку?

UART_128_C.rar

А это старое под мега 8

 

usart_9n1.7z

поэтому все твои измышления с созданием отдельного признака превышения и созданием отдельной функции совершенно излишни.

и поэтому твоя тема не может быть никому полезной.

Так весь разбор темы уже максимально полезен))).

Не так и много информации по этому вопросу в интернете........

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

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

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

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

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

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

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

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

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

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

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