реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> UART в 9-ти битном режиме, ATmega64
Д_М
сообщение Jan 13 2014, 08:29
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Здравствуйте!
Я AVR работаю давно и успешно. Про 9-ти битный режим знал давно, но на AVR ранее никогда не использовал.
В программе в инициализации одни раз делаю следующее:
UCSZ2_1 = 1;
UCSZ1_1 = 1;
UCSZ0_1 = 1;
MPCM_1 = 1;
TXB8_1 = 0;

Процессор является ведомым устройством. При ответе он выдаёт только 8 бит, а не 9, как хотелось бы. К такому заключению я прищёл после того, как установил 2 стоп-бита, и ведущее устройство стало воспринемать запросы от ведомого устройства. Ведущее устройство не анализирует состояние 9-го бита при ответах от ведомого устройства. Лишь бы был. Для него не важно - только бы было всего 11 бит.
Получается, что 9-ти битный режим не включился. Что делаю не так? Объясните, пожалуйста, почему по умолчанию, если не инициализировать UCSZ получается 8-ми битный формат, а не 5-ти?
Спасибо!
Go to the top of the page
 
+Quote Post
alag57
сообщение Jan 13 2014, 08:53
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 130
Регистрация: 26-06-06
Из: Березовский
Пользователь №: 18 355



TXB8n is the ninth data bit in the character to be transmitted when operating with serial frames with nine data bits.
Must be written before writing the low bits to UDRn.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 13 2014, 10:02
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Д_М @ Jan 13 2014, 12:29) *
Объясните, пожалуйста, почему по умолчанию, если не инициализировать UCSZ получается 8-ми битный формат, а не 5-ти?

Потому, что по сбросу в регистр UCSRnC заносится не нулевое значение (UCSZn1=1, UCSZn0=1).
Go to the top of the page
 
+Quote Post
Д_М
сообщение Jan 13 2014, 12:07
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Цитата(alag57 @ Jan 13 2014, 12:53) *
TXB8n is the ninth data bit in the character to be transmitted when operating with serial frames with nine data bits.
Must be written before writing the low bits to UDRn.


Если в этот бит ничего не записать, то передаваться он будет всёравно, но с нулевым значением. У меня же не передаётся 9-й бит совсем. Правильно ли я понимаю, что для того чтобы передавалось 9 бит достаточно включить UCSZ2 в единицу? UCSZ1 и UCSZ0 уже установлены после сброса процессора.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 13 2014, 13:39
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Д_М @ Jan 13 2014, 16:07) *
Правильно ли я понимаю, что для того чтобы передавалось 9 бит достаточно включить UCSZ2 в единицу? UCSZ1 и UCSZ0 уже установлены после сброса процессора.

Для того, чтобы передавались 9 информационных бит достаточно установить в единицу UCSZ2, UCSZ1 и UCSZ0. Всё равно каким способом.
У Вас зачем-то ещё включен режим мультипроцессорной связи (MPCM), однако на работу передатчика он не влияет - только на работу приёмника.
Go to the top of the page
 
+Quote Post
Д_М
сообщение Jan 13 2014, 18:11
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Спасибо за поддержку! Нашёл свою ошибку! Теперь процессор формирует 9-ти битные посылки. Даже игнорирует посылки с нулевым 9-м битом в режиме MPCM. Но не отбраковывает 8-ми битные посылки. Добавил обратку бита FE, но эффекта не дало. Что ещё посоветуете?
Go to the top of the page
 
+Quote Post
Alex11
сообщение Jan 13 2014, 20:05
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 106
Регистрация: 23-10-04
Из: С-Петербург
Пользователь №: 965



А как Вы хотите, чтобы он отбраковывал 8-битные посылки? В последовательности нет бита с третьим состоянием, который бы говорил - посылка кончилась. Если приемник в 9-битном режиме, то он будет брать 9 бит, и то, что последний бит при 8-битовой посылке в передатчике будет стоповым, приемник никак смутить не может. В лучшем случае после нескольких посылок напоретесь на отсутствие стоп-бита.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 14 2014, 05:18
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Д_М @ Jan 13 2014, 22:11) *
Но не отбраковывает 8-ми битные посылки. Добавил обратку бита FE, но эффекта не дало. Что ещё посоветуете?

Восьмибитные данные с двумя стоп-битами biggrin.gif
Цитата
If the receiver is set up to receive frames that contain 5 to 8 data bits, then the first stop
bit indicates if the frame contains data or address information. If the receiver is set up for
frames with 9 data bits, then the ninth bit (RXB8) is used for identifying address and
data frames. When the frame type bit (the first stop or the 9th bit) is one, the frame contains
an address. When the frame type bit is zero the frame is a data frame
Go to the top of the page
 
+Quote Post
Д_М
сообщение Jul 28 2014, 08:31
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Есть нужда поднять эту тему. Так и не получается у меня 9-ти битный режим. Смотрел работу передатчика по осциллографу. Если передавать 0xFF, то при нулевом TXB8 была бы видна "иголка", подобная старт-биту. Но при передаче 0xFF видна только одна "иголка" - старт бит. Пробовал смотреть по осциллографу передачу со включенным битом чётности. Его видно на осциллографе чётко. Одна "иголка" старт бит, другая "иголка" - бит чётности. Как мне кажется, 9-ти биный режим должне включаться также легко и бесхитростно, как и контроль чётность. Но так он и не включается. Пробовал так
UCSZ2_1 = 1;
UCSZ1_1 = 1;
UCSZ0_1 = 1;
И пробовал включать только UCSZ2_1 = 1;
Не работает и всё!

Кто-то использовал 9-ти битный режим на практике?

Заранее благодарен!
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jul 28 2014, 09:25
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Д_М @ Jul 28 2014, 12:31) *
Смотрел работу передатчика по осциллографу.

Вероятно, Вы не туда смотрели... Ещё в январе я вам давал цитату из DS, где "английским по белому" написано: девятый бит данных передаётся вместо первого стоп-бита!
Go to the top of the page
 
+Quote Post
Kompot
сообщение Jul 28 2014, 10:15
Сообщение #11


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 10-06-08
Из: Хочу в пампасы...
Пользователь №: 38 192



Цитата(Д_М @ Jul 28 2014, 12:31) *
Так и не получается у меня 9-ти битный режим.
UCSZ2_1 = 1;
UCSZ1_1 = 1;
UCSZ0_1 = 1;

Не работает и всё!

Кто-то использовал 9-ти битный режим на практике?


Да, использовал. И даже работало.
С конфигурационными битами там есть нюанс - они хоть и названы единообразно и последовательно, но находятся в РАЗНЫХ физических управляющий регистрах. Подробностей не помню - давно не брал в руки шашек. Но наш горе-программист чуть не поседел с этим девятым битом, пока я не указал ему на неверную инициализацию. Ключ к успеху - внимательное прочтение даташита.
Go to the top of the page
 
+Quote Post
Д_М
сообщение Jul 28 2014, 11:19
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185



Цитата(Палыч @ Jul 28 2014, 13:25) *
Вероятно, Вы не туда смотрели... Ещё в январе я вам давал цитату из DS, где "английским по белому" написано: девятый бит данных передаётся вместо первого стоп-бита!


Спасибо! Попробовал. Не помогло. И на осциллографе картина не поменялась. Не увидел я ожидаемой "иголки" между данными и стоп-битом.

Цитата(Kompot @ Jul 28 2014, 14:15) *
Да, использовал. И даже работало.
С конфигурационными битами там есть нюанс - они хоть и названы единообразно и последовательно, но находятся в РАЗНЫХ физических управляющий регистрах. Подробностей не помню - давно не брал в руки шашек. Но наш горе-программист чуть не поседел с этим девятым битом, пока я не указал ему на неверную инициализацию. Ключ к успеху - внимательное прочтение даташита.


Тут то всей инициализации одна команда
UCSZ2_1 = 1;
Ещё посоветовали сделать два стоп бита - USBS_1 = 1;, но эффекта нет
Go to the top of the page
 
+Quote Post
Kompot
сообщение Jul 28 2014, 11:52
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 242
Регистрация: 10-06-08
Из: Хочу в пампасы...
Пользователь №: 38 192



Цитата(Д_М @ Jul 28 2014, 15:19) *
Тут то всей инициализации одна команда
UCSZ2_1 = 1;


Битового процессора в АВР нет. Такое выражение НЕ сработает.
Вам дали достаточно информации.

Для справки:

/* Set frame format: 9data, 1stop bit */
UCSR1B = (1<<UCSZ12); // for UART1 Atmega644

Кстати UCSZ2_1 быть не может. Ибо UCSZn2, n=0,1.
Опять же, внимательно читайте даташит.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01513 секунд с 7
ELECTRONIX ©2004-2016