Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проверка бита четности UART
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Andrnow
Пытаюсь изучить микроконтроллеры AVR. Эмулирую в VMLABе.

Проблема такая - не работает проверка по четности при получении байта через UART.
На сколько я понял, при ошибке контроля четности 2 бит регистра ucsrA должен стать в единицу, но этого не происходит. crying.gif Мучаюсь уже пол ночи. В чем может быть ошибка?

Приемо-передатчик конфигурирую так:

ldi temp, 0x00
out ubrr0h, temp
ldi temp, 0x05
out ubrr0l, temp
ldi temp, 0x94
out ucsr0b, temp
ldi temp, 0xa6
out ucsr0c, temp
SSerge
А откуда при эмуляции взяться ошибке чётности? Помехи в линии связи вроде-бы не эмулируются smile.gif

Ну и чисто практический совет: не следует придавать такого большого значения контролю по чётности.
Редко когда от него есть польза. В большинстве случаев либо можно совсем никак не контролировать правильность передачи, либо наоборот, необходимо применять гораздо более сильные средства типа контрольных сумм для пакетов или даже кодов, исправляющих ошибки, но и тогда бит четности оказывается лишним.
_Pasha
Цитата(SSerge @ Dec 28 2008, 06:01) *
Ну и чисто практический совет: не следует придавать такого большого значения контролю по чётности.
Редко когда от него есть польза.

Низачот за совет sad.gif
Пример - MODBUS ASCII в соединении с контролем четности очень даже применим. Вообще, все, что юзает ASCII, благодаря контролю четности, позволяет упростить подсчет CRC до банального суммирования.
smac
Цитата(Andrnow @ Dec 28 2008, 04:15) *
Пытаюсь изучить микроконтроллеры AVR. Эмулирую в VMLABе.
....
Приемо-передатчик конфигурирую так:

...
ldi temp, 0x94
out ucsr0b, temp
ldi temp, 0xa6
out ucsr0c, temp

А зачем вы настроили 9-ти битный символ? может быть в этом проблема? Т. е. у вас сейчас просисходит такая передача(побитно )
старт-бит, 0-бит, 1-бит, ... 7-бит, 8-бит, бит четности, стоп бит, может быть надо 8 битный сивол?
Вообще не плохо-бы контроллер указать, для которого пишете.
И еще, приучайтесь писать так
Код
    ldi temp, (1<<RXIE)|(1<<RXEN)| (1<<UCSZ2)
    out ucsr0b, temp
Maik-vs
Цитата(Andrnow @ Dec 28 2008, 04:15) *
Пытаюсь изучить микроконтроллеры AVR. Эмулирую в VMLABе.
... Мучаюсь уже пол ночи.

"ночью надо спать!" smile.gif (с) Жириновский

>> благодаря контролю четности, позволяет упростить подсчет CRC до банального суммирования.
07.gif это как это?
_Pasha
Цитата(Maik-vs @ Dec 28 2008, 14:40) *
это как это?

Пример корнями уходящий в: структура строки в intel hex файле smile.gif Вместо ЦРЦ у нас контрольная сумма. Патамушо большего и не нада: при передаче строки с паритетом это как раз работает.
Andrnow
Цитата
А откуда при эмуляции взяться ошибке чётности? Помехи в линии связи вроде-бы не эмулируются

Зато в передатчике можно включить контроль по четности\нечетности, следовательно если этот переключатель поставить неправильно должна появиться ошибка.


Цитата
Ну и чисто практический совет: не следует придавать такого большого значения контролю по чётности.
Редко когда от него есть польза. В большинстве случаев либо можно совсем никак не контролировать правильность передачи

Объясняю. Я сейчас пишу дипломную работу. Ну надо же при защите вставить фразу типа "При передаче данных от компьютера к устройству происходит проверка переданных данных" smile.gif
off: А вообще во всем виноват препод. Я хорошо знаю 51-е, на них бы написал за один вечер... а ему видите ли "микроконтроллер поновее" захотелось. Пришлось AVRки изучать.


Цитата
А зачем вы настроили 9-ти битный символ? может быть в этом проблема? Т. е. у вас сейчас просисходит такая передача(побитно )
старт-бит, 0-бит, 1-бит, ... 7-бит, 8-бит, бит четности, стоп бит, может быть надо 8 битный сивол?

Указывал 8 бит - все равно не работает(



Цитата
Вообще не плохо-бы контроллер указать, для которого пишете.

А это важно? Ну ATMega162




Цитата
И еще, приучайтесь писать так
ldi temp, (1<<RXIE)|(1<<RXEN)| (1<<UCSZ2)
out ucsr0b, temp

Но понимаю, что обозначают такие записи и зачем они нужны.
_Pasha
Цитата(Andrnow @ Dec 28 2008, 18:52) *
Указывал 8 бит - все равно не работает(

Смотрите на железяке, а не на отстойном очке "в иной мир" . Vmlab, емнип, такая же горбуха в плане эмуляции, как и AVRstudio. ...ммм в Протеусе можно глянуть.
Цитата
что обозначают такие записи и зачем они нужны

Ню-ню biggrin.gif А потом, когда надо посмотреть, чего там записано в регистр, надо в 10^N раз открывать волшебную даташиту и смотреть, где какие биты сидят.
defunct
Цитата(_Pasha @ Dec 28 2008, 17:26) *
Vmlab, емнип, такая же горбуха в плане эмуляции, как и AVRstudio. ...ммм в Протеусе можно глянуть.

А Протеус другая горбуха? biggrin.gif

Цитата(Andrnow @ Dec 28 2008, 16:52) *
А это важно? Ну ATMega162

Конечно важно, расположение регистров и их содержимое от МК к МК могут меняться.
Например, в m162 UCSRxB - шарится в одной ячейке I/O с UBBRxH, а в m128 - нет.
Andrnow
В общем, как я и думал, это глюк VMLABа. В реальном микроконтроллере все работает)
rezident
Цитата(Andrnow @ Dec 29 2008, 03:20) *
В общем, как я и думал, это глюк VMLABа. В реальном микроконтроллере все работает)

Тему можно закрывать?
Andrnow
Закрывай) А нужно?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.