Урок 14
Часть 4
USART. Связь МК с ПК
Сегодня мы продолжим изучение программирования интерфейса USART.
В предыдущей части занятия мы закончили код функции инициализации USART. Продолжаем трудиться над кодом дальше.
Но прежде чем над ним трудиться, давайте подключим переходник к отладочной плате
Мы видим здесь, что общий провод подключен на общую шину платы, а информационные входы соответственно на ножки 2 и 3 контроллера.
Теперь мы на функцию инициализации напишем прототип в файл usart.h
#include «main.h»
void USART_Init( unsigned int speed);
Определимся со значением UBRR
Вызовем данную функцию в функции 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 МГц и установил его в плату. Это видно в картинке вверху данной части.
Ну и, соответственно, при установке кварцевого резонатора, нам необходимо немного исправить фьюзы, пользуясь двумя следующими таблицами
Подключим программатор к компьютеру, запустим AVRDUDE и, не устанавливая пока резонатор, считаем контроллера, затем перейдём на закладку с фьюзами, считаем их и установим следующим образом
У нас, соответственно, всё наоборот и галки мы в поля чекбоксы не ставим, так как биты у нас инверсные.
Затем жмём кнопку программирование и фьюзы прошьются. Отключаем программатор от ПК, подключаем кварцевый резонатор, подключаем программатор к ПК, переходим на закладку Program и заново читаем контроллер. Если он читается, значит мы всё сделали правильно. Твёрдо помните о том, что неправильные фьюзы могут превратить контроллер в кирпич.
Запускаем и настраиваем терминальную программу. Жмём в ней затем кнопку ReScan и программа должна будет найти наш порт. Устанавливаем туда точку. и жмём кнопку Connect
Выбираем нашу прошивку и прошиваем контроллер.
Наши байты должны прийти в терминальную программу
Теперь давайте, чтобы не ждать определённого времени на ПК, весь наш код передачи мы переместим в бесконечный цикл, а также в конце добавим ещё задержку на полсекунды. И наш «Ok!» будет передаваться в ПК бесконечно
while(1)
{
USART_Transmit('O');//Передаем при включении
USART_Transmit('k');//сообщение «Ok!», что свидетельствует
USART_Transmit('!');//о правильно работе программы
USART_Transmit(0x0d);//переход в начало строки
USART_Transmit(0x0a);//переход на новую строку
_delay_ms(500);
}
Соберём код, остановим терминальную программу, нажав кнопку Disconnect, прошьём контроллер и нажмём в терминальной программе кнопку Connect. И мы должны теперь увидеть следующую картину
Данная картина свидетельствует о том. что наши данные передаются без ошибок.
В следующей части занятий мы подключим к контроллеру символьный дисплей, который мы подключали в 12 уроке, а также поработаем уже с интерфейсом USART на приём, используя прерывания.
Предыдущая часть Программирование МК AVR Следующая часть
Программатор и переходник USB-TTL можно приобрести здесь:
Программатор USBASP USBISP с адаптером USBASP USBISP 3.3 с адаптером
Переходник USB-TTL лучше купить такой (сейчас у меня именно такой и он мне больше нравится)
Смотреть ВИДЕОУРОК (нажмите на картинку)
А как реализовать функцию для передачи числа (int)?
Смотря как нужно передать. Если для того, чтобы просто увидеть его в терминальной программе, то посредством функции sprintf, а если для того, чтобы с ним затем работать в приёмном устройстве, то передать 2 байта из памяти, поставив указатель на расположение Вашего числа, наподобие как мы передавали число с плавающей точкой в уроке по датчику давления. А затем в приёмном устройстве уже также принять эти 2 байта в память и работать с указателем на них.
Информация для тех кто имеет программатор KidPik2.
У него оказывается есть своя терминальная программа. В результате не нужен переходник и не надо дополнительно устанавливать программу.
Извините за спешку, конечно правильное название программатора PICkit 2
Здравствуйте!
Подскажите пожалуйста, при работе с UART на передачу с микроконтроллера есть ли необходимость инициализировать порт на выход на соответствующей ножке. В видеоуроке 14.4 Вы этого не делаете.
У меня заработало, но только после прописи в коде команд PORTD=0b00000001; DDRD=0b00000010.(RX на вход, TX на выход). Я для тренировки использую микроконтроллер AT90S8535-8PI.
С уважением, Игорь
Скорей всего забыл. Я конечно не вдавался в подробности работы команд в регистрах USART, возможно и не надо, ножки могут сами могут включиться в нужное направление при использовании альтернативных функций, но обычно это делается.
UDRE ne Obnylaetca a naoborot.
У меня проблема,передает в термінале.Что не так?
Не так сформулирован вопрос. Если бы Вам такой задали, Вы бы смогли ответить?
После прошивки фьюзов, как у Вас, получил кирпич (((
Считываю фьюзы, ничего не меняя защиваю их обратно, мк работает, но программатор выдает ошибку при любом обращении к мк, где косяк?
Канал «живой»?