- Заметки о Linux, электронике, радиолюбительстве
- воскресенье, 27 июля 2014 г.
- Работа с последовательным портом из консоли Linux
- Работа с COM-портом (RS-232) в Linux
- Программирование МК AVR в ОС Ubuntu. Часть 2 (GUI)
- Настройка среды и работа с программаторами для AVR микроконтроллеров в Linux
- Настройка прав доступа для программатора USBAsp
- Настройка программатора Громова (COM-порт) в Linux
- Настройка программатора используя LPT-порт в Linux
- Тестирование и работа с программаторами
- Заключение
Заметки о Linux, электронике, радиолюбительстве
Личный блог Вадима Кузнецова, RA3XDH
воскресенье, 27 июля 2014 г.
Работа с последовательным портом из консоли Linux
В предыдущем посте было показано как запустить UART на отладочной плате Launchpad для MSP430. Теперь рассмотрим как общаться с платой при помощи средств командной строки Linux. Используется плата с прошивкой из предыдущего поста. Для подробностей — см. под кат
Как известно, все устройства последовательных портов представлены файлами устройств в каталоге /dev.Через эти файлы и происходит общение ОС Linux с внешним устройством на последовательном порту. Чтобы передать что-то на внешнее устройство нужно записать данные в файл устройства, а чтобы считать информацию из устройства — прочитать данные из файла устройства. Это можно делать при помощи команд cat и echo так же как для обычных файлов на диске. Или внутри программы на С при помощи вызовов ioctl(), read() и write() или библиотеки termios.
Физическим последовательным портам RS232, к которым подключались диалапные модемы на старых компьютерах, соответствуют файлы устройств /dev/ttyS*, начиная с /dev/ttyS0. Виртуальным последовательным портам, которые создаются различными конвертерами USB UART соответствуют файлы устройств /dev/ttyUSB* и /dev/ttyACM*. Ядро Linux автоматически разпознаёт подключенное устройство, загружает для него драйвер и создаёт файл устройства. Вручную устанавливать драйвер, как в ОС Windows не требуется. Например, если подключить к USB преобразователь USB UART FT232, то создаётся файл устройства /dev/ttyUSB0, с которым можно работать также как и с обычным последовательным портом. На плате Launcpad находится микросхема TUSB3410, которая тоже представляет собой конвертер USB UART. Если подключить её к USB, то создаётся файл устройства /dev/ttyACM0. Чтобы общаться с платой нужно что-либо писать/читать с этого файла.
Чтобы пользователь мог читать или писать в файл устройства последовательного порта, его нужно добавить в группу dialout. Иначе работать с последовательным портом сможет только администратор root.
Простейшим приложением с графическим интерфейсом, которое работает с последовательным портом, является CuteCOM. Он обычно уже есть в вашем дистрибутиве Linux. Его можно установить из репозиториев. При помощи CuteCOM мы работали с платой в предыдущем посте. Выглядит CuteCOM вот так:
Работать с ним крайне просто. Указываем нужное устройство, если его нет в списке, то его можно впечатать вручную. Затем указываем скорость и параметры и нажимаем OpenDevice. В окне видим данные, которые пришли от устройства. В поле ввода в нижней части можем печать строку символов, которые предаются на устройство. Чтобы передать данный нажимаем Enter и смотрим ответ устройства в окне.
Теперь рассмотрим как работать с COM-портом из командной строки. Для этого служат три команды: stty, cat и echo.
Команда stty устанавливает параметры и скорость COM-порта. Её формат:
stty -F
Чтобы установить параметры для платы Launchpad для соединения на скорости 9600 нужно выполнить:
$ stty 9600 -F /dev/ttyACM0 raw -echo
Параметр raw устанавливает, что данные в компьютер передаются байт за байтом так же как приходят в порт без преобразований. Аппаратное управление потоком отключено. Подробнее о том, что включает и выключает raw — см. man stty. Если не включить raw, то скорее всего ничего работать не будет.
Теперь в той же консоли нужно набрать
$ cat /dev/ttyACM0
И можно смотреть данные, которые приходят от платы. Выход — нажать Ctrl+C.
Теперь нажимаем на плате RESET и видим, что в консоди напечатался текст.
Чтобы передать в плату данные, в другой консоли нужно использовать команду echo и перенаправление вывода в файл устройства. Наберём в другой консоли:
$ echo "1">/dev/ttyACM0
Видим, что на плате загорелся красный светодиод и в первой консоли было выдано сообщение об этом. Чтобы убрать конец строки в передаваемых данных, то нужно использовать запуск echo -n, а чтобы интерпретировать 16-ричные коды — нужно echo -e. Ключи можно комбинировать.
В итоге должно получиться так:
Чтобы увидеть 16-ричные коды данных, приходящих от устройства, нужно использовать команду hexdump:
$ cat /dev/ttyACM0|hexdump -C
Получится вот так:
Чтобы иметь вывод данных от устройство на экран и в текстовый файл нужно использовать tee:
Источник
Работа с COM-портом (RS-232) в Linux
Урок посвящен интерфейсу RS-232, который в простонародье называют COM-порт. Мы разберемся как он представлен в Linux, какой у него интерфейс, научимся его конфигурировать, а также узнаем, что написание программы для коммуникации через COM-порт в Linux не представляет сложности.
Разговор o коммуникации через COM-порт в Linux следует начать с того, что заметить, что каждому COM-порту в операционной системе соответствует файл устройства телетайп или tty. Он находится в каталоге dev и имеет имя /dev/ttyS и номер. Если посмотреть на мой каталог, то мы увидим следующее, что у меня таких файлов очень много [0:55]. Но по факту, в моем компьютере есть один физический COM-порт. Давайте попробуем его найти. Сделать это можно с помощью команды dmesg, которая выводит сообщения с момента инициализации системы. Если набрать
$dmeg | grep «ttyS»
то мы увидим, что, в действительности , у меня только один файл ttyS4 связанный с конкретным COM-портом, у которого есть некоторый диапазон ввода/вывода, номер прерывания, и который сейчас настроен на скорость обмена 150200 бит в секунду (или бод).
Для того, чтобы сконфигурировать мой COM-порт по умолчанию в Linux можно воспользоваться программой mincom, запускать её нужно от суперпользователя, либо добавить текущего пользователя в группу dialout. Запустим
$sudo minicom -s
Ключ -s – обозначает конфигурацию (setup),
Здесь мы видим следующее [2:24]. Есть параметры последовательного порта, важно прописать правильно файл, то есть указать тот файл, который у вас в системе связан с физическим COM-портом, Второй важный момент – это настройка параметров обмена (ключ Е). Дело в том, что корректный обмен данными по последовательному соединению возможен только тогда, когда обе стороны имеют один и тот же набор параметров. В этом окне можно набор этих параметров менять [3:08]. Мы видим, что у нас задана скорость 8 бит, нет контроля четности, и один стоповый бит. Именно здесь можно это все увидеть и настроить так, как требуется или, как требует ваше устройство.
Сохраняем конфигурацию по умолчанию. Дальше будем взаимодействовать — сначала с помощью команды терминала, чтобы проверить, как вручную это работает; а потом напишем небольшую программу, которая будет слать данные в COM-порт. Выйти из Mincom можно набрав ctrl-A-X.
Для того чтобы проверить, как работает COM-порт можно воспользоваться программой miniterm [4:03]. Я создал виртуальную машину с обычным linux, у неё указал, что в наличии имеется один COM-порт (это COM1), по умолчанию назначились линии обработки запросов прерывания. Я ассоциировал этот COM-порт с файлом на моей host-машине. С этого файла мы будем читать данные записанные в порт.
Итак, мы видим, что в левой части экрана у нас есть логин на виртуальную машину [4:46]. Давайте проверим с помощью minicom -s, как настроены коммуникации. Проверим, что /dev/ttyS0 – это действительно правильный физический порт – да, это именно так. Теперь мы можем вызвать команду
$sudo miniterm
она говорит, что есть следующие доступные порты, и просит ввести, через какой порт работать. Далее я попадаю терминал, связанный с COM-портом, где могу набирать текст. Набирая команды, я вижу «эхо» в моем файле справа. Обратите внимание, что я пишу в левом окне, а на экране надпись мы видим в правом. В левом окошке – виртуальная машина, на которой настроен порт. В правом – тот лог, который мы видим в файле ассоциированном с этим COM-портом на host-машине.
Создадим какой-нибудь каталог, в котором будем разрабатывать приложение. Как это ни странно, приложение будет выглядеть очень просто, потому что все действия, которые мы делаем с COM-портом в linux, это действия с файлами с использованием тех же самых файловых операций. Нам потребуется stdio.h, unistd.h, чтобы получить доступ – функциям open/read/write, fcntl.h, чтобы иметь возможность использовать файловые флажки. Открываем файловый дескриптор, COM-порт, имя, и флаги из COM-порта. Проверим, что файловый дескриптор у нас открылся, то есть если порт меньше или равен 0, то есть какая-то ошибка, оповестим об этом пользователя и вернем управление. В противном случае, можно писать в этот файловый дескриптор. write принимает файловый дескриптор, указатель на буфер, размер. Дальше мы закрываем файловый дескриптор и возвращаем управление. Приложение готово.
Теперь давайте попробуем запустить то, что у нас вышло, вернее, скомпилировать и запустить [10:40]. При запуске приложения произошла ошибка, но она вызвана понятными причинами, потому что пользователь должен был быть включен группу dialout [11:03], или нам надо запускать приложение от суперпользователя. Сделаем это. И сразу видим, что в нашем окошке появилась запись «hello world». Можно повторить и увидеть, что все работает корректно.
Точно таким же образом можно осуществлять чтение из COM-порта, то есть использовать не функцию write, а функцию read.
Источник
Программирование МК AVR в ОС Ubuntu. Часть 2 (GUI)
В прошлый раз мы научились компилировать прошивку и зашивать в контроллер через avr-gcc.
Но что делать если нам необходимо прошить фьюзы? Да и прошивать контроллер с помощью консоли не сильно удобно.
Значит нам необходимо скачать GUI оболочку для avrdude.
1. Заходим по ссылочке на файлообменник: http://narod.ru/disk/27500236000/avr8-burn-o-mat-2.1.2-all.deb.html
2. Скачиваем программку.
3. Запускаем и устанавливаем.
Далее, запустим программу: Приложения->Программирование->AVR8 Burn-O-Mat
Дальше откроем Settings->AVRDUDE
В AVRDUDE location нажимаем кнопочку File и ищем файлик под названием avrdude (должен быть здесь /usr/bin/avrdude).
Далее в alternative AVRDUDE configuration file нажимаем кнопочку File и ищем файлик под названием avrdude.conf (должен быть здесь /etc/avrdude.conf).
В AVRDUDE Options выбераем необходимый программатор, а так же порт через который будем работать. Если у вас программатор собран на преобразователе USB-RS232 то вам необходимо выбрать /dev/ttyUSB0.
Если все выставлено то нажимаем Apply->OK.
В AVR type выберем необходимый нам чип и нажмем Fuses.
Здесь, я думаю и так все понятно, что с ними делать.
Если все выставлено, то пробуем прошить или просто считать прошивку.
Источник
Настройка среды и работа с программаторами для AVR микроконтроллеров в Linux
Приведены особенности настройки и использования USBAsp, COM и LPT программаторов при работе с программой avrdude в операционной системе Linux. Попробуем считать и записать прошивку микроконтроллера (МК) используя программатор USBAsp.
Для работы и экспериментов нам понадобится уже подключенный к AVR микроконтроллеру программатор, как это сделать мы уже подробно рассматривали в одной из статей.
Перейдем к настройке портов и программы avrdude для работы с различными программаторами под Linux.
Настройка прав доступа для программатора USBAsp
Что делать если программа avrdude в ОС Linux не видит программатор что подключен к USB порту? — подобные вопросы в сети возникают довольно часто. Программа avrdude сообщает о том что не может найти программатор:
Поэтому первое что нам нужно сделать так это дать права обычным пользователям в Linux на использование устройства USBAsp, что подключен к USB порту. По умолчанию к данным устройствам имеет доступ только суперпользователь (root).
Зная код производителя и код устройства для программатора USBAsp нужно написать правило в специальном скрипте для подсистемы «usb» в Linux в котором разрешить использование устройства с такими идентификаторами любым пользователем или же ограничить права только указанной группой пользователей.
Для начала сверим идентификаторы устройства и убедимся что у нас действительно программатор USBAsp. Подключаем программатор к USB порту ноутбука и смотрим лог последних событий системы за текущий день:
Или же используем команду в Debian Linux 8 и выше (где используется systemd):
К примеру, в конце вывода последней команды увидим вот что:
Здесь код производителя нашего программатора — 16c0, а код продукта — 05dc, все Ок.
Отключаем программатор от компьютера и создадим файл с правилом что разрешает доступ к программатору USBAsp всем пользователям на компьютере, выполним команду:
После запуска откроется текстовый редактор, вставьте в него вот этот код:
Выходим из редактора и сохраняем файл (CTL+X и Y).
Для того чтобы в Linux наш скрипт заработал можно перезагрузить ОС или выполнить перезапуск подсистемы «usb» командой:
Теперь можно работать с программатором USBAsp в программе avrdude из под обычного пользователя(не суперпользователя).
Настройка программатора Громова (COM-порт) в Linux
Первым делом нужно добавить программатор Громова с его идентификатором и настройками в конфигурацию программы avrdude. Чтобы не править основной конфигурационный файл мы создадим дополнительный пользовательский конфигурационный файл в домашней директории, выполним команду:
где USER — єто имя вашего пользователя под которым вы работаете.
Вставим в редактор следующие данные:
Выходим из редактора и сохраняем файл (CTL+X и Y).
Для корректной работы программатора Громова в ОС Linux нужно предварительно сконфигурировать последовательный порт (Serial Port, RS-232 Port), поскольку на данный момент при запуске программа avrdude сама не производит конфигурации порта.
Если при записи прошивки в МК avrdude выводит сообщение о проблеме с верификацией то очень вероятно что нужно произвести переконфигурацию COM-порта:
Для выполнения конфигурации воспользуемся программой stty, подробные параметры работы которой хорошо расписаны в MAN-страничке.
Для вывода на экран текущих настроек порта /dev/ttyS0 (первый COM-порт) выполним команду:
А теперь выполним конфигурацию порта командой:
Примечание: примите к вниманию что если у вас в компьютере несколько COM-портов то путь к файлу порта /dev/ttyS0 нужно изменить в соответствии с номером используемого порта, например /dev/ttyS2 — это третий COM-порт.
После выполнения команды конфигурации полезно посмотреть изменилась ли конфигурация порта и как, для этого нужно выполнить предыдущую команду.
Содержимое вывода команды должно быть примерно вот в таком виде:
Настройки, которые мы задали командой, действуют до перезагрузки ОС. Команду для конфигурации порта можно добавить в автозагрузку вашей операционной системы Linux или же запускать один раз перед работой с программой avrdude.
Настройка программатора используя LPT-порт в Linux
В настройках программы avrdude по умолчанию прописан программатор «dapa», его описание «Direct Parallel AVR Access Cable».
Программатор на основе LPT-порта никаких дополнительных настроек в Linux не потребует, можно приступать к работе, Plug and Play in Linux! 🙂
Тестирование и работа с программаторами
После выполнения приведенных выше подготовок все готово к работе, приступим к тестированию нашей связки программатор + микроконтроллер.
Ниже будут приведены команды отдельно для каждого типа программаторов:
- USBAsp;
- программатор Громова (COM-порт);
- параллельный программатор DAPA (LPT-порт).
Все примеры буду приводить для микроконтроллера ATmega8 (m8). Для программатора Громова в командах будет использован 1-й COM-порт /dev/ttyS0, а для программатора DAPA — первый LPT-порт /dev/parport0.
Подробно узнать о всех ключах запуска программы avrdude вы вы всегда можете вот ТУТ.
Первым делом давайте проверим все ли правильно связано и сможет ли программа avrdude «увидеть» микроконтроллер, никакой записи и изменений вносить в AVR чип мы не будем, только тест.
Проверка для программатора USBAsp:
Проверка для программатора Громова:
Проверка для программатора DAPA:
Если все подключено и настроено как нужно то то вывод программы будет выглядеть вот таким образом:
Рис. 1. Успешная проверка, у программы avrdude получилось связаться с AVR микроконтроллером.
Для получения более подробной информации о подключенном микроконтроллере можно добавить к команде ключ «-v», вот пример вывода для USBAsp:
Рис. 2. Проверка, вывод программы avrdude с опцией -v (verbose).
А теперь давайте считаем прошивку микроконтроллера что хранится во Flash-памяти и сохраним ее в файл.
Считывание Flash для программатора USBAsp:
Считывание Flash для программатора Громова:
Считывание Flash для программатора DAPA:
После выполнения команды во временной директории /tmp должен появиться файл m8chip_flash_dump.hex что будет содержать данные из флешь-памяти микроконтроллера.
Рис. 3. Считываем flash памяти микроконтроллера в файл при помощи avrdude.
В следующих примерах мы выполним запись прошивки во Flash-память AVR микроконтроллера, используя данные из файла в формате Intel HEX. Для этого создадим файл test_program.hex во временной папке /tmp и наполним его тестовыми данными. Создадим файл и откроем его для редактирования командой:
Скопируйте в редактор предоставленный ниже код и сохраните файл (CTRL+X и Y). Данная прошивка заставит мигать светодиод что подключен к 2-й ножке (PD0) микроконтроллера ATmeag8 (пример кода именно для этой модели):
Ниже представлены команды для записи прошивки с использованием разных программаторов.
Запись прошивки во Flash для программатора USBAsp:
Запись прошивки во Flash для программатора Громова:
Запись прошивки во Flash для программатора DAPA:
Сразу после выполнения команды по записи прошивки в микроконтроллер ATmega8 должен замигать светодиод. Вывод команды avrdude в процессе работы выглядит следующим образом:
Рис. 4. Процесс записи прошивки во Flash-память микроконтроллера.
Программа avrdude говорит что все ОК, записано во флешь-память и проверено 104 байта данных.
Рис. 5. На 2й ножке (PD0) микроконтроллера ATmega8 высокий уровень — 5В.
Заключение
В данной статье мы разобрались с настройкой AVR программаторов в операционной системе GNU Linux, привели простейшие команды для проверки, чтения и записи прошивки в микроконтроллер используя мощную программу avrdude.
В следующей статье мы напишем простую программу для микроконтроллера на языке программирования Ассемблер (Assembler), которая заставит поочередно мигать два разноцветных светодиода — олучится такая себе имитация полицейской мигалки.
Источник