Какие ошибки могут возникнуть при использовании UART.

 

При разработке одного устройства была выбран такой алгоритм работы...

ATmega8 подсчитывает "пачку" внешних импульсов в счетчике TC1; по окончании "пачки" происходит "захват" значения ТС1 по внешнему сигналу на выводе ICP1; сразу после захвата, значение регистра ICP запоминается... В основном цикле программы запомненное значение регистра ICP передается в РС через UART.

При работе оказалось, что младший байт ТС1 "считает" только до 127 (0x7F). При этом старший байт ТС1 "считает" нормально - инкриминируется не каждый раз при достижении младшим значения 127, а в два раза медленнее. То есть, как если бы, младший считал правильно - до 255.

Сначала "исправить" ситуацию удалось изменением программы. Заменил вывод через UART с использования "printf(..)", на "UDR=" . Подсчет стал верным.

Через сутки все повторилось. Снова младшая часть ТС1 "считала" до 127. То есть, применение "printf(..)" ОШИБКИ НЕ ВНОСИТ!!!!

 

Следующим моим ошибочным выводом, был вывод о неисправности AVR. Я решил, что неисправен (не доступен для чнения) 7 бит ТС1. Заменил микросхему. Все стало работать правильно, при этом в программе снова использовалась ф-ция "printf". А FUSE опять прошил неправильно, как и в первой микросхеме.

Прошли сутки... Ошибка возникла вновь. Было сделано предположение о "неустойчивом" режиме работы (максимальная частота, внешнее тактирование...). Решел "перевести" работу AVR от внутреннего RC-генератора. И, при анализе FUSE -бит, обнаружил, что вместо режима тактирования от внешнего "CLOK", задан режим "ExtXTAL". То есть должен быть подключен кварцевый резонатор!

"Исправление" FUSE-бит позволило "устранить" ошибку. Через сутки все повторилось.

Переписал программу на ASM'е, максимально упростив ее при этом. Снова на сутки "обрадовался"... И когда снова ошибка повторилась, задал вопрос в форуме:

http://electronix.ru/forum/index.php?showtopic=19041

Спасибо Petka, подсказал:

(Petka @ Jul 26 2006, 14:27)

ещё мысль. тактируется МК от RC или от кварца? может немного не совпадают частоты и старший бит просто "наползает" на стоповый?

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

Что и приводило к ошибке в моем случае.

Так что, если используется UART, то лучше выбирать кварц (а не внутренний RC ген.) для тактирования МК. И частоту работы UART выбирать ту, при которой процент ошибок минимален (зависит от кварца, см. раздел Examples of Baud Rate
Setting
datasheet).

 

(C)STAS633

19.07.06г. - 26.07.06г.

Главная

Hosted by uCoz