AVR Урок 14. USART. Связь МК с ПК. Часть 4



 

Урок 14

Часть 4

 

USART. Связь МК с ПК

 

Сегодня мы продолжим изучение программирования интерфейса  USART.

В предыдущей части занятия мы закончили код функции инициализации USART. Продолжаем трудиться над кодом дальше.

Но прежде чем над ним трудиться, давайте подключим переходник к отладочной плате

 

image30

 

Мы видим здесь, что общий провод подключен на общую шину платы, а информационные входы соответственно на ножки 2 и 3 контроллера.

Теперь мы на функцию инициализации напишем прототип в файл usart.h

 

#include «main.h»

void USART_Init( unsigned int speed);

 

Определимся со значением UBRR

 

image31

 

 

Вызовем данную функцию в функции main()

 

int main(void)

{

unsigned char i;

USART_Init (8);//115200

 

Теперь USART у нас инициализирован. Но нам хочется уже что-то передать в шину. Для этого в файле usart.c организуем ещё одну функцию для передачи по шине

 

void USART_Transmit( unsigned char data ) //Функция отправки данных

{

}

 

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

В функцию передачи напишем такой код. Прежде чем что-то передать, нам нужно убедиться, что шина передачи у нас никак не занята. Делается это проверкой бита UDRE в регистре UCSRA. Данный бит обнуляется, как только освобождается регистр приема-передачи данных и как только он будет готов к записи в него новых данных

 

void USART_Transmit( unsigned char data ) //Функция отправки данных

{

  while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема

 

И мы будем вечно висеть в цикле, пока буфер не будет готов к записи в него данных.

Тем самым мы защитим себя от потери данных при передаче.

Затем мы, собственно положим в буфер передачи данных наш байт, который мы собираемся отправить в ПК

 

  while ( !(UCSRA & (1<<UDRE)) ); //Ожидание опустошения буфера приема

  UDR = data; //Начало передачи данных

}

 

На этом функция закончена. Напишем на неё также прототип в файле usart.h

 

void USART_Init( unsigned int speed);

void USART_Transmit( unsigned char data );

 

 

Теперь, вызывая данную функцию, мы попробуем передать в шину USART какое-нибудь слово, например слово «OK», закончив его символа перевода строки и возврата каретки

 

USART_Init (8);//115200

USART_Transmit('O');//Передаем при включении

USART_Transmit('k');//сообщение «Ok!», что свидетельствует

USART_Transmit('!');//о правильно работе программы

USART_Transmit(0x0d);//переход в начало строки

USART_Transmit(0x0a);//переход на новую строку

while(1)

 

Соберём наш код и прошьём контроллер.

Теперь у нас появилась другая задача. Нам нужно принять данные на стороне ПК. Для этого, соответственно, нам нужна будет терминальная программа. Сегодня мы воспользуемся программой Terminal 1.9b. Она абсолютно бесплатная и при небольшой нагрузке на порт, вполне функциональная. Ссылку на данную программу я размещу в конце этой части урока.

 

Таже для, того чтобы мы могли уверенно использовать USART в микроконтроллере, нам желательно установить туда кварцевый резонатор. Чтобы не исправлять проекты, я нашел кварцевый резонатор именно на 8 МГц и установил его в плату. Это видно в картинке вверху данной части.

Ну и, соответственно, при установке кварцевого резонатора, нам необходимо немного исправить фьюзы, пользуясь двумя следующими таблицами

 

image32

 

image33

 

Подключим программатор к компьютеру, запустим AVRDUDE и, не устанавливая пока резонатор, считаем контроллера, затем перейдём на закладку с фьюзами, считаем их и установим следующим образом

 

image34

 

У нас, соответственно, всё наоборот и галки мы в поля чекбоксы не ставим, так как биты у нас инверсные.

Затем жмём кнопку программирование и фьюзы прошьются. Отключаем программатор от ПК, подключаем кварцевый резонатор, подключаем программатор к ПК, переходим на закладку Program и заново читаем контроллер. Если он читается, значит мы всё сделали правильно. Твёрдо помните о том, что неправильные фьюзы могут превратить контроллер в кирпич.

Запускаем и настраиваем терминальную программу. Жмём в ней затем кнопку ReScan и программа должна будет найти наш порт. Устанавливаем туда точку. и жмём кнопку Connect

 

image35

 

Выбираем нашу прошивку и прошиваем контроллер.

Наши байты должны прийти в терминальную программу

 

image37      image36

 

Теперь давайте, чтобы не ждать определённого времени на ПК, весь наш код передачи мы переместим в бесконечный цикл, а также в конце добавим ещё задержку на полсекунды. И наш «Ok!» будет передаваться в ПК бесконечно

 

while(1)

{

  USART_Transmit('O');//Передаем при включении

  USART_Transmit('k');//сообщение «Ok!», что свидетельствует

  USART_Transmit('!');//о правильно работе программы

  USART_Transmit(0x0d);//переход в начало строки

  USART_Transmit(0x0a);//переход на новую строку

  _delay_ms(500);

}

 

Соберём код, остановим терминальную программу, нажав кнопку Disconnect, прошьём контроллер и нажмём в терминальной программе кнопку Connect. И мы должны теперь увидеть следующую картину

 

image38

 

Данная картина свидетельствует о том. что наши данные передаются без ошибок.

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

 

 

Предыдущая часть Программирование МК AVR Следующая часть

 

Исходный код

 

Терминальная программа

 

Программатор и переходник USB-TTL можно приобрести здесь:

Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером

Переходник USB-TTL лучше купить такой (сейчас у меня именно такой и он мне больше нравится)

 

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

AVR USART. Связь МК с ПК

12 комментариев на “AVR Урок 14. USART. Связь МК с ПК. Часть 4
  1. Segey:

    А как реализовать функцию для передачи числа (int)?

    • Смотря как нужно передать. Если для того, чтобы просто увидеть его в терминальной программе, то посредством функции sprintf, а если для того, чтобы с ним затем работать в приёмном устройстве, то передать 2 байта из памяти, поставив указатель на расположение Вашего числа, наподобие как мы передавали число с плавающей точкой в уроке по датчику давления. А затем в приёмном устройстве уже также принять эти 2 байта в память и работать с указателем на них.

  2. Александр:

    Информация для тех кто имеет программатор KidPik2.
    У него оказывается есть своя терминальная программа. В результате не нужен переходник и не надо дополнительно устанавливать программу.

  3. Александр:

    Извините за спешку, конечно правильное название программатора PICkit 2

  4. Igor_Digital:

    Здравствуйте!

    Подскажите пожалуйста, при работе с UART на передачу с микроконтроллера есть ли необходимость инициализировать порт на выход на соответствующей ножке. В видеоуроке 14.4 Вы этого не делаете.
    У меня заработало, но только после прописи в коде команд PORTD=0b00000001; DDRD=0b00000010.(RX на вход, TX на выход). Я для тренировки использую микроконтроллер AT90S8535-8PI.

    С уважением, Игорь

    • Скорей всего забыл. Я конечно не вдавался в подробности работы команд в регистрах USART, возможно и не надо, ножки могут сами могут включиться в нужное направление при использовании альтернативных функций, но обычно это делается.

  5. Boba:

    UDRE ne Obnylaetca a naoborot.

  6. Дмитрий:

    У меня проблема,передает в термінале.Что не так?

  7. Trackout:

    После прошивки фьюзов, как у Вас, получил кирпич (((

  8. Константин:

    Считываю фьюзы, ничего не меняя защиваю их обратно, мк работает, но программатор выдает ошибку при любом обращении к мк, где косяк?

  9. Юрий:

    Канал «живой»?

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*