078-Проверка модуля UART ATtiny2313 (тестовая прошивка).

Автор: | 08.07.2011

Титл для тестаКак Вы наверно заметили, во многих устройствах блога используется протокол связи UART. Причина – простота организации и использования этого интерфейса, как в микроконтроллерах, так и в прикладных приложениях компьютера. Но как оказалось, на практике есть определенные затруднения. Часто возникают случаи, когда правильно собранное устройство работает по UART с ошибками или отказывается работать вообще.

Причин может быть множество, вот некоторые из них:
— неправильные установки параметров UART. Параметры должны быть идентичные для обоих, участвующих в обмене устройств;
— неправильное подключение сигнальных линий. Нужно подключать накрест
TxD—>RxD и  RxD—>TxD;
— неправильная работа программы-терминала. Нужно попробовать поменять программу;
— неисправность COM порта компьютера. Нужно попробовать на другом порте (если есть) или компьютере;
— неправильная работа драйвера преобразователя USB-to-UART (если он используется). Проверить на заведомо исправных проектах или перемкнуть линии TxD и RxD преобразователя и проверить есть ли эхо при отправке сообщений из программы терминала;

Еще, частой причиной сбойной работы модуля является уход частоты внутреннего задающего генератора микроконтроллера в проектах без кварца. Внутренний задающий RC-генератор у AVR микроконтроллеров не может обеспечить большой точности работы и «плывет» при изменении температуры. Без цифрового осциллографа или логического анализатора довольно сложно определить с какой реальной частотой работает модуль UART.
Вопросы по работе UART довольно часто возникают в блоге, поэтому было решено сделать специальную прошивку, при помощи которой можно было протестировать работу модуля в каждом конкретном микроконтроллере.

Для проверки модуля UART на микроконтроллере ATtiny2313 необходимо прошить кристалл специальной тестовой прошивкой:
078-test-UART.zip - Тестовая прошивка для проверки UART.
Фьюз-биты выставляются наиболее ходовые в устройствах (работа от внутреннего задающего генератора на 8МГц)
ATtiny2313_internal_RC_8.0 - Фьюзы ATtiny2313 внутренний RC генератор на 8.0МГц 
Как правильно прошить AVR фьюзы

Схема тестирования UART:

Схема тестирования UART
Как видно, схема совместима со схемой драйвера сенсорных устройств — можно использовать плату как тестовую.

Параметры модуля UART:
Скорость (boud rate) — 9600;
Количество бит данных (data bit) – 8;
Наличие бита четности (parity) – нет;
Количество стоп-бит (stop bits) — 1.

Проверяется модуль UART следующим образом:
1 После подачи питания на микроконтроллер, модуль UART начинает с секундным периодом выдавать по линии передатчика TxD (ножка 3) строку «*Test_UART». При помощи программы терминала можно отследить, как ведется передача.
2 Если отослать на модуль UART (ножка 2) строку (например, вида «Another_Test»), эта строка начнет выдаваться  с секундным периодом вместо начальной (вот так: «*Another_Test»). Звездочка «*» всегда предшествует сообщению. Во время этого теста можно проверить, как воспринимаются строки по UART. В случае если при приеме возникли ошибки (аппаратно определяемые модулем) будет установлен высокий уровень на линии (PB5 ножка 17), который продержится 1 секунду.
3 При приеме по UART символов цифр «1», «2», «3», «4», «5», «6», «7», «8», «9» (не имеет значения в теле сообщения или отдельно) линии, соответственно (PD2 ножка 6), (PA0 ножка 5), (PA1 ножка 4), (PD6 ножка 11), (PB0 ножка 12), (PB1 ножка 13), (PB2 ножка 14), (PB3 ножка 15), (PB4 ножка 16) будут перебрасывать свое состояние. Так можно проверить качество приема, если нет возможности посмотреть выдаваемые символы в терминале.

Файлы:
078-test-UART-source.zip - Исходник тестовой прошивки для UART

Ссылки:
060-Драйвер сенсорной клавиатуры «Touch Me» на ATtiny2313.


(Visited 1 787 times, 4 visits today)

078-Проверка модуля UART ATtiny2313 (тестовая прошивка).: 24 комментария

  1. Ghjuhfvvf

    На одной из Tiny2313 от внутренней RC частота на столько уходит, что никак не могу догнать ее UARTом:)) Не расскажешь, как калибровать … Спасибо.
    В OCR1A запихиваешь для 1 с интервала, а прерывание по переполнению. Или что-то недопонимаю …

  2. GetChiper Автор записи

    Сама идея этой прошивки — проверка внутреннего задающего генератора микроконтроллера, а не калибровка его.
    Калибровка это отдельный и довольно сложный процесс Есть специальный байт, доступный только через программатор, в который записывается значение корректировки внутреннего задающего генератора. Это значение рассчитывается по эталонной частоте.

    Да, прерывания по переполнению значения в OCR1A.

  3. ankar

    У Рюмика есть такое выражение.Цитата:
    Новинка – внутренний регистр контроллера под названием OSCCAL (OSCillator CALibration). Этот регистр незримо участвует во всех операциях, когда МК работает от внутреннего RCгенератора. При каждом включении питания в него автоматически заносится число, которое с точностью до 3% устанавливает тактовую частоту, максимально близкую к номиналу 1 МГц (2, 4 или 8 МГц). Просмотреть это число можно через PonyProg, выбрав пункты меню: “Command – Read Osc. Calibration Byte”. В частности, для ATmega8 OSCCAL=167 или в HEXвиде 0xA7. Тактовую частоту генератора можно в любой момент времени подстроить программно, причем довольно в широких пределах»
    Эта цитата относится к меге8. Так, что подстраивать В ней можно ипрограмно.

  4. ankar

    Вот кусок его программ в WinAVR
    OSCCAL=0x00; //Начальная низкая частота генератора =16
    while (1) //Бесконечный цикл из чет.-нечет, тактов =17
    { a++; //Увеличение счетчика времени (0…65535) =18
    if ((a % 64)==0) //Делитель на 64 для канала 1 =19
    { PORTB ^= _BV(PB0); //Изменение РВО 0-1-0-1… =20
    if (PIND != 0xFF) //Проверка нажатия кнопок =21
    { if (bit_is_clear(PIND,PD0)) //Если нажата SB1=22
    { sdvig = 63; PORTC = 0xFE; //Дельта, HLl =23
    } //Установлен дельта-ритм 3 Гц, светится HL=24
    if (bit_is_clear(PIND,PD1)) //Если нажата SB2=25
    { sdvig = 62; PORTC = 0xFD; //Тета, HL2 =26
    } //Установлен тета-ритм 7 Гц, светится HL2 =27
    if (bit_is_clear(PIND,PD2)) //Если нажата SB3=28
    { sdvig = 61; PORTC = 0xFB; //Альфа, HL3 =29
    } //Установлен альфа-ритм 12 Гц, светится HL3=30
    if (bit_is_clear(PIND,PD3)) //Если нажата SB4=31
    { sdvig = 60; PORTC = 0xF7; //Бета, HL4 =32
    } //Установлен бета-ритм 16 Гц, светится HL4 =33
    if (bit_is_clear(PIND,PD4)) //Если нажата SB5=34
    { if (++c > 5) c = 0; //Цикл смены частот =35
    OSCCAL = c * 0x33; //Новое Значение частоты=36
    } //Установлена новая частота генератора =37
    for (b = 0; b < (8 + c * 7) ; b++) //Цикл =38
    { _delay_loop_2(62500); //Задержка времени =39

  5. bornik

    Добрый день!
    Такой вопрос:
    Данная схема правильно работает (правильно и без ошибок) только при напряжении питания от 3,5 до 3,9 вольт, а как только увеличиваю к 5, то начинается «свистопляска». Пробовал поменять микроконтроллер — та-же картина (правда другой из той-же партии).
    Может кто сталкивался с такой проблеммой и подскажет «где собака порылась» ?

  6. GetChiper Автор записи

    ankar :

    У Рюмика есть такое выражение …

    Да, есть такое дело. Регистр OSCCAL подстраивает внутренний задающий генератор. Но всеравно нужно к чемуто привязатся эталонному. Еще его нужно прошить или программатором или подправить в листинге программы, для того чтобы он записывался в начале исполнения прораммы. Или делать автоподстройку во время UART приема…?

    bornik :

    Добрый день!
    Такой вопрос:
    Данная схема правильно работает (правильно и без ошибок) только при напряжении питания от 3,5 до 3,9 вольт, а как только увеличиваю к 5, то начинается «свистопляска». Пробовал поменять микроконтроллер – та-же картина (правда другой из той-же партии).
    Может кто сталкивался с такой проблеммой и подскажет «где собака порылась» ?

    Странное поведение микроконтроллера. Может это и есть значительный уход частоты? А если напряжение снижаешь — частота приближается к номиналу?

  7. ankar

    Я гонял в свое время эту прогу. (Ну учился по его статьям). То действительно вполне можно сделать автоподстройку. Частота меняется при програмном вводе.
    OSCCAL=0×00; //Начальная низкая частота генератора =16
    и дальше после выполнения какой-то работы мы вновь меняем частоту
    OSCCAL = c * 0×33; //Новое Значение частоты=36
    Но зависмость дюже неравномерная , где-то по параболле. При OSCCAL=0 Частота чуть больше 4мгц.
    А при OSCCAL=221 частота 12мгц.
    Сам график не могу выложить.Не знаю как вставлять картинки.

  8. GetChiper Автор записи

    На мыло («О проекте») — я выложу.

  9. smg

    Посмотрел исходник. Проверка принятого байта на цифры 1-9 работать не будет, т.к. по мануалу АВ при условном пропуске оператора в условии нельзя ставить константу. Встроенный симулятор это подтвердил.

  10. alex55498

    Уважаемый автор, буквально позавчера видел на этой или одной из ваших статей очень полезные скриншоты по настройке UART для ATtiny2313 в AB и CodeVisionAVR. Теперь никак не могу найти!

    Не подскажете где они находится?

  11. GetChiper Автор записи

    smg :

    Посмотрел исходник. Проверка принятого байта на цифры 1-9 работать не будет, т.к. по мануалу АВ при условном пропуске оператора в условии нельзя ставить константу. Встроенный симулятор это подтвердил.

    Да, операторы пропуска не могут иметь константу, но билдер в этом случае заменяет такую конструкцию на обычный переход по условию (по крайней мере в последней версии).

  12. prikumsk

    Здравствуйте.
    Подключаюсь к контроллеру с помощью переходника masterkit bm8050. Приходит такой набор символов каждую секунду.
    €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€
    С чем это может быть связано?

  13. prikumsk

    €€€€€€€€€€€€€€€€€€€€€€€€€€€€€€€

  14. GetChiper Автор записи

    Может задающий генератор микроконтроллера сильно уходит? На другом кристалле есть возможность попробовать?

  15. prikumsk

    На двух пробовал. Результат — один и тот же.

  16. GetChiper Автор записи

    Переходник masterkit bm8050 — это переходник USB-COM (RS323).
    Хотя COM порт и работает по UART протоколу, но уровни там другие и соответственно напрямую их стыковать нельзя.

  17. chipgetter

    ну что ж, прошил 078-test-UART.hex из архива 078-test-UART, который обрзовался при распаковке 078-test-UART-source.zip — это тот же файл, что и из архива 078-test-UART.zip?
    короче, заработало! фьюзы — 8MHz, div/8 отключен (CKDIV8=1)
    при этом мой код при тех же фьюзах не работал.
    теперь вопросы: что за файл EE_078-test-UART.hex и вообще что находится в папке с сорсами? как бы посмотреть код в c?
    ну или мой код может быть можно раскритиковать?

  18. prikumsk

    bm8050 сделан на микросхеме cp2102. это переходник usb-uart

  19. iamstreetstyle

    Фюзы прошил ?! masterkit bm8050 это конструктор я так понимаю ты собрал его сам !? Руками 😐 !?

  20. GetChiper Автор записи

    @chipgetter
    файл EE_078-test-UART.hex — это файл содержимого EEPROM — в проекте он не нужен.
    На С код никак не посмотреть, так как он написан на другом языке программирования.
    Я уже писал как запустить UART http://www.getchip.net/posts/044-uart-primenenie-v-ehlektronnykh-proektakh/ там можно глянуть и код на С

    @prikumsk
    Я вот здесь смотрел http://www.masterkit.ru/main/set.php?code_id=214386
    — это «BM8050 — Переходник USB – COM (RS232C)»

  21. hogval

    Здравствуйте.
    Не могу понять следующее:

    3 При приеме по UART символов цифр «1», «2», «3», «4», «5», «6», «7», «8», «9» (не имеет значения в теле сообщения или отдельно) линии, соответственно (PD2 ножка 6), (PA0 ножка 5), (PA1 ножка 4), (PD6 ножка 11), (PB0 ножка 12), (PB1 ножка 13), (PB2 ножка 14), (PB3 ножка 15), (PB4 ножка 16) будут перебрасывать свое состояние.

    С ножек pin можно только прочитать информацию как происходит запись (а ведь работает, всю голову изломал), в симуляторе записи нет.

  22. GetChiper Автор записи

    При записи единички в PIN, порт (настроенный на выход) будет перебрасывать свое состояние.

  23. hogval

    Спасибо, только симулятор Algoritm Builder этого не понимает поэтому и возник вопрос, в AVR Studio все работает.

Добавить комментарий