Привет!

Это резервный блог для GetChip.net - "Готовые решения для твоих электронных проектов".
Заходите, найдете что-то интересное для себя.

050-Как собрать электронное устройство с блога GetChip.net? Пошаговая инструкция.

050-Как собрать электронное устройство с блога GetChip.net? Пошаговая инструкция.:
Я осознаю, что формат блога не очень способствует упорядочению материала, и так как я не собираюсь менять формат ресурса, то, чтобы как-то скомпенсировать этот недостаток решил делать что-то вроде «реперных точек-статей».

Эта статья призвана объединить разбросанную по блогу информацию о том, как самостоятельно собрать электронное устройство. Итак если Вы нашли в блоге GetChip.net интересное устройство и хотите его повторить то,
ДЛЯ СБОРКИ УСТРОЙСТВА ВАМ ПОНАДОБИТСЯ:
Заставка сплана1 Ознакомится с электрической принципиальной схемой устройства.
Схемы блога выполнены в программе SPlan (расширение spl, spl7). Для просмотра схем, нужно установить SPlan.
sPlan_rus 7.0.0.4 - Программа для черчения электронных схем

Немного про программу SPlan >

Заставка сплинта2 Далее нужна печатная плата, на которой будет собранно устройство.
Рисунки печатных плат в блоге выполнены в программе SprintLayout (расширение lay). Для просмотра (и распечатки для ЛУТ) рисунков печатных плат нужно установить SprintLayout.

Spint Layout 5 - Программа для разводки печатных плат

Совсем чуть-чуть про SprintLayout >
Если Вы не знаете что такое ЛУТ и как его делать, то читайте серию статей по самостоятельному изготовлению печатных плат.

031-ЛУТ-как сделать двустороннюю печатную плату. Материалы.

032-ЛУТ-как сделать двустороннюю печатную плату. Печать.

033-ЛУТ-как сделать двустороннюю печатную плату. Травление.

034-Лужение печатной платы сплавом Розе.
Как вариант, если устройство не очень сложное, можно обойтись готовой, купленной макетной платой. Читаем про макетные платы.

Отладка электронного устройства на макетной плате.
Техника пайки
3 Следующий этап – пайка электронных компонентов.
Так как SMD компоненты более удобны (ну по крайней мере для меня) и компактны, я стараюсь их максимально использовать в устройствах. Если Вы никогда не использовали SMD компоненты, то это довольно легко.
042-Пайка SMD компонентов.

Титл для программаторов4 Программатор.
Блог ориентирован на устройства на базе AVR микроконтроллеров Atmel, а значит любое устройство (микроконтроллер) необходимо запрограммировать (прошить). Прошить микроконтроллер можно через различные порта ввода-вывода. Для каждого порта нужен свой программатор. Выбирайте, какой Вам больше подходит:
Простой программатор для LPT порта >

Надежный программатор для COM порта >

Быстрый программатор для USB порта (в разработке) >

Титл для программ5 Программа для прошивки.
Шнур изготовлен, нужна программа, при помощи которой, HEX-прошивка через программирующий кабель запишется в микроконтроллер. Самая простая и универсальная программа для LPT и COM программаторов, UniProf (она, конечно, не лишена недостатков, но достоинств больше).
UniProf 130709 - Универсальный программатор для AVR
Описание программы UniProf >

Как прошить микроконтроллер через различные порта (подробно) >
Вот так, поэтапно, и создаются электронные устройства.

Эта статья призвана объединить разбросанную по блогу информацию о том, как самостоятельно собрать электронное устройство.

Если Вы нашли в блоге GetChip.net интересное устройство и хотите его повторить то,
для сборки устройства Вам понадобится:

1 Ознакомится с электрической принципиальной схемой устройства.
Схемы блога выполнены в программе SPlan (расширение spl, spl7). Для просмотра схем, нужно установить SPlan.
===== SPlan
Описание программы SPlan

2 Далее нужна печатная плата, на которой будет собранно устройство.
Рисунки печатных плат в блоге выполнены в программе SprintLayout (расширение lay). Для просмотра (и распечатки для ЛУТ) рисунков печатных плат нужно установить SprintLayout.
===== SprintLayout
Описание программы SprintLayout

Если Вы не знаете что такое ЛУТ и как его делать, то читайте серию статей по самостоятельному изготовлению печатных плат.
ЛУТ1
ЛУТ2
ЛУТ3

Как вариант, если устройство не очень сложное, можно обойтись готовой, купленной макетной платой.
Читаем про макетные платы.

3 Следующий этап – пайка электронных компонентов.

Так как SMD компоненты более удобны и компактны, я стараюсь их максимально использовать в устройствах. Если Вы никогда не использовали SMD компоненты, то почитать об этом можно здесь.

4 Программатор.

Блог ориентирован на устройства на базе AVR микроконтроллеров Atmel, а значит, любое устройство (микроконтроллер) необходимо запрограммировать (прошить). Прошить микроконтроллер можно через различные порта ввода-вывода. Для каждого порта нужен свой программатор. Выбирайте, какой Вам больше подходит:
Простой программатор для LPT порта
Надежный программатор для COM порта
Быстрый программатор для USB порта (в разработке)

5 Программа для прошивки.

Шнур изготовлен, нужна программа, при помощи которой,
HEX-прошивка через программирующий кабель запишется в микроконтроллер. Самая простая и универсальная программа для LPT и COM программаторов, UniProf.
===== UniProf
Описание программы UniProf
Как прошить микроконтроллер программой UniProf
Так как я еще не определился с USB программатором, программы пока нет.

049-Драйвер линейки 7-сегментных индикаторов на ATtiny13 (бегущая строка).

049-Драйвер линейки 7-сегментных индикаторов на ATtiny13 (бегущая строка).:
титл
Уффф… Наконец-то добрался до паяльника! Сейчас сделаем что-нибуть интересненькое.
Раньше мы сказали «А», собрав устройство ввода – клавиатуру, теперь мы просто обязаны сказать «Б» и сделать устройство вывода, чем мы сегодня и займемся. В качестве устройства «Б» у нас будет выступать 7-сегментный индикатор. Но не просто один индикатор, а целая линейка семисегментных индикаторов, причем неограниченной длинны и с кучей эффектов отображения! Интересно? Ну, тогда, начнем!
Семисегментные индикаторы довольно неоднозначные устройства для отображения. По причине того, что они предназначены для отображения цифр (хотя, конечно, можно отобразить и буквы, но довольно условно и не все), круг их применения не очень широк. Но есть случаи, когда требуется яркое и четкое отображения цифр, которые, к тому же, должны быть видны издалека, и тут равных семисегментникам нет.
Часто, когда идет речь о семисегментных индикаторах, подразумевается включение их в схему с динамической индикацией, при этом, по очереди засвечивается только один символ, и при частоте выше 50Гц, создается иллюзия, что светятся все символы одновременно. Эта схема настолько распространена, что 3-4х циферные индикаторы имеют выводы только под динамическую индикацию. У такого способа включения, конечно, есть свои плюсы, но когда речь идет о количестве цифр больше чем четыре (а тем более, если не известно, сколько их вообще будет) – начинаются проблемы с этой самой динамической индикацией – падает яркость свечения становиться заметно мерцание. Очевидно, что для линейки семисегментных индикаторов неограниченной длинны, такой способ включения абсолютно не подходит. Как же быть в таком случае? Поступим нестандартно – включим наши индикаторы на статическое (постоянное) свечение. Чтобы такое подключение стало возможным, нам понадобятся одноциферные семисегментные индикаторы – вот, например, такие:
Одноциферный семисегментник
Кроме того, для засветки нужных сегментов индикатора, нам нужен драйвер светодиодов. Чтобы не увеличивать стоимость нашей линейки (микросхема-драйвер довольно дорогая) будем применять дешевые и распространенные сдвиговые регистры 74HC164. Это немного ухудшит яркость свечения, но значительно удешевит все устройство. Для управления линейкой будем использовать микроконтроллер ATtiny13 – больший не нужен. Сдвиговые регистры управляются всего двумя линиями (Data, Clock) и включаются последовательно, а значит, нет разницы для схемы управления регистрами, сколько их там стоит в линейке три или сто двадцать три. Значит, можно сделать нашу линейку безразмерной, то есть к линейке можно в любое время подключить дополнительные индикаторы или убрать ненужные. Схема устройства выглядит следующим образом:
Схама драйвера линейки
Как видно из схемы, семисегментные индикаторы с регистром 74HC164 установливаются на отдельные платы с разъемами по обе стороны для того, чтобы можно было собрать несколько индикаторов в линейку. Плата управления (драйвер линейки) на ATtiny13 управляет всеми индикаторами вне зависимости от их количества. Более того, в прошивке предусмотрена возможность для того, чтобы в линейку можно было включать вперемешку индикаторы с общим анодом и общим катодом. Символы отображаются справа налево. Этот вариант отображения удобен для случая, когда неизвестно, сколько индикаторов включено в линейке – последние введенные символы всегда находятся в первых индикаторах. Кроме сигнала данных (Data) и сигнала тактирования данных (Clock), драйвером формируется сигнал “/OE” (Output Enable) для того чтобы избежать мерцания сегментов при сдвиге символов по регистру. В момент сдвига данных по регистру драйвер выставляет на линии /ОЕ высокий уровень, схема управления индикаторами по этому уровню сигнала должна запретить вывод данных на индикатор. В данном схемном решении этот сигнал не задействован по причине отсутствия в сдвиговых регистрах 74HC164 ножки переводящей выходы в высокоомное состояние, но можно этим сигналом отключать общий вывод индикатора (через транзистор) или использовать другую микросхему, имеющую соответствующий вход.
Алгоритм работы устройства.

Я долго размышлял над тем, как сделать управление линейкой простым и не обременительным для микроконтроллера Вашего проекта. Главная цель, которую я преследовал, максимально переложить функции управления на драйвер линейки, но в тоже время не потерять возможности гибкого управления со стороны Вашего проекта. В результате был разработан следующий алгоритм работы:
Драйвер линейки взаимодействует с Вашим проектом по UART (Скорость 9600, 8 бит данных, 1 стоп бит, бита четности нет). Драйвер работает как на прием, так и на передачу (хотя последнее не столь важно и можно данную возможность не использовать, тем самым свести управление драйвером всего к одной линии).

В драйвер могут передаваться цифры, буквы латиницы, управляющие символы. Передача осуществляется в ASCII коде (пример: цифры -“123”, буквы-“Аbc”, управляющие символы-“>”). Другие символы игнорируются.
Драйвер, по UART, отправляет символы окончания эффектов. Их всего два – “V” и “D”. Это нужно для того, чтобы знать когда окончился эффект и можно отправить следующую команду эффекта для формирования сложных составных эффектов.
Переданные, для отображения, цифры и буквы латиницы записываются в буфер (размер буфера может быть 16, 32, 64 знака и выбирается по нуждам проекта). Переполнения буфера нет, он циклический (новые символы пишутся поверх самых старых). Управляющие символы в буфер не записываются – они активируют свои функции немедленно в момент приема по UART (например: при посылке строк “abcd>” и “ab>cd” результат будет идентичен). На линейку индикаторов символы попадают из буфера, при этом способ их отображения зависит от активированных эффектов. Такой вариант наименее ресурсоемок для контроллера Вашего проекта, так как введенная в буфер строка символов отображается с различными эффектами посредством лишь ресурсов драйвера.
По умолчанию драйвер отображает полученные символы на линейке без каких либо эффектов. Если по UART передавать цифры или букв латиницы (например, “1”, “4”, “A“, ”S” ”d” …) они сразу будут отображаться на линейке справа налево, причем следующий символ будет сдвигать влево предыдущий.

Далее идет описание всех символов которые можно отправить в драйвер.

Отображаемые символы.

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

Управляющие символы.

Для выбора режима работы линейки или активации спецэффектов нужно передать по УАРТ специальные символы. Как я писал раньше, управляющие символы начинают работать немедленно, после приема по UART, и в буфер они не попадают. Соответственно их можно пересылать прямо в строке сообщения.

Пример: “_Аbc>”, где “Аbc”-отображаемое сообщение, а “_” и “>”-управляющие символы.

Вот перечень символов управляющих режимом работы индикаторов:
“)” – разрешение автоматического отображения буфера (по умолчанию активировано).

При включенном автоматическом обновлении буфер, с определенным периодом, перерисовывается на линейке. Каждый принятый по UART и записанный в буфер символ сразу же отобразится на линейке.
“(“ – запрет автоматического отображения буфера.

Все принятые по UART символы продолжают записываться в буфер драйвера, но на линейке не происходит ни каких изменений (“светится” последнее сообщение). Запрет автоматического обновления линейки может понадобиться в том случае, если нужно вывести сразу всю строчку целиком, а не посимвольно, или для того, чтобы подготовить следующее сообщение, не изменяя предыдущее.

Пример: переданная по UART строка “(2314” ни как не отобразится на линейке, но в буфере запишется. Если дальше включить автоматическое отображение – “)”, то на линейке мы увидим наше слово “2314”. Для того, чтобы выводить строку сообщения целиком, а не по факту передачи символов по UART, нужно послать следующую комбинацию “(2314)”. Это актуально если символы 2, 3, 1, 4 передаются по UART не сразу, а в течении определенного времени.
“!” – принудительный вывод буфера на линейку.

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

Пример: запретили автоматическое отображение “(“, передали символы “2314”, принудительно их отображаем “!”.
“_” (знак подчеркивания) – очистка буфера.

После приема этого символа буфер немедленно очистится. Если запрещено автоматическое отображение буфера, на линейке не произойдет никаких изменений, так как очищается только буфер. Для очистки линейки, в этом случае, нужно запустить автоматическое отображение буфера или послать символ принудительного вывода буфера “!”.
”[“ – включение режима инверсии символов.

В режиме инверсии, выводимые на линейку символы, инвертируются (побитно). Такой режим нужен, если Вы умудрились соединить в одну линейку вперемешку индикаторы с общим анодом и общим катодом. При подаче инверсного сигнала на индикатор противоположного подключения последний отобразит символ корректно. Даже если вся линейка индикаторов не соответствует прошивке в начале сеанса достаточно послать символ ”[“ и дальше все будет работать корректно.
“]” – выключение режима инверсии символов (по умолчанию активировано).

Пример: Если прошивка для индикаторов с общим анодом, а индикаторы включены так: ОА—ОК–ОА. Передаем строку «3[4]5» получим на линейке 345. Если передать так – «345» то получим «3-черте-что-5».

Далее символы для организации спецэффектов:

Пакет управляющих символов для исчезновения-проявления содержимого линейки.
“*“ – посимвольное «исчезновения» содержимого линейки.

Символы на линейке последовательно гасят свои сегменты, пока совсем не «исчезнут» (содержимое буфера остается нетронутым). По окончании эффекта в UART выдается символ “D” и запрещается автоматическое отображение буфера.


“^“ – посимвольное «проявление» содержимого линейки.

Символы на линейке последовательно зажигают свои сегменты до полного «проявления» (содержимое буфера остается нетронутым). По окончании эффекта в UART выдается символ “D” автоматическое отображение буфера разрешено.



Для полноты эффекта линейка индикаторов должна быть пуста, запрещено автоматическое отображение буфера и в буфере должно находиться проявляемое слово (сделать это можно следующей строчкой “)_!проявляемое слово”). Данный эффект хорош после исчезновения предыдущего слова по “*”.

Пакет управляющих символов для горизонтального скроллинга (бегущей строки).

Пакет позволяет организовать бегущую строку из содержимого буфера. От Вас требуется лишь поместить строку в буфер и управляющим символом задать направление движения, все остальное будет делать драйвер.
“>“ – Автоматический скроллинг содержимого линейки вправо (бегущая строка).

Содержимое буфера не изменяется. Эффект бесконечен (движение по кругу), ни какие символы по UART не возвращаются. Остановить можно символом “|“.


“<“ – Автоматический скроллинг содержимого линейки влево (бегущая строка).

Содержимое буфера не изменяется. Эффект бесконечен (движение по кругу), ни какие символы по UART не возвращаются. Остановить можно символом “|“.


“|“ – Остановка скроллинга.

Позиция отображения возвращается в нормальное состояние.

Пакет управляющих символов для вертикального сдвига.

Этот пакет эффектов позволяет организовать несколько интересных эффектов, например, имитация движения по пунктам меню; периодическое отображение какой-либо служебной информации (например, времени, выдвигая часы снизу и потом туда их убирая) и т.д.
“\“ – Вертикальный сдвиг-появление символов линейки вверх (появление вверх – с пустого места до полных символов). По окончании эффекта в UART выдается символ “V”, автоматическое отображение буфера разрешено.


“/“ – Вертикальный сдвиг-исчезновение символов линейки вверх (исчезновение вверх – с полных символов до пустого места). По окончании эффекта в UART выдается символ “V” и запрещается автоматическое отображение буфера.


“:“ – Вертикальный сдвиг-появление символов линейки вниз (появление вниз – с пустого места до полных символов). По окончании эффекта в UART выдается символ “V”, автоматическое отображение буфера разрешено.


“;“ – Вертикальный сдвиг-исчезновение символов линейки вниз (исчезновение вниз – с полных символов до пустого места). По окончании эффекта в UART выдается символ “V” и запрещается автоматическое отображение буфера.


Вот пример реализации движения по меню посредством эффектов пакета:


А это пример информационного сообщения:


Пакет управляющих символов для изменения скорости эффектов.

Следующие символы изменяют скорость прохождения эффектов.
“-“ – активируется нормальная скорость.


“+“ – активируется повышенная скорость.


Дополнительные пояснения по управления эффектами.
- Все эффекты работают независимо друг от друга. Это значит, что Вы можете запустить сразу несколько эффектов одновременно! Строка вида «_Start>*;» очистит буфер, запишет в него слово «START», запустит бегущую строку вправо, во время пробега она будет исчезать посегментно и в придачу опускатся вниз. При помощи различных комбинаций можно получить совершенно новые эффекты. Экспериментируйте!
- При подаче взаимно исключающих команд, например ”<” и “>” – сработает последняя – “>”.
- Во время действия спецэффектов можно заполнять буфер новыми словами. Они сразу же начнут участвовать в эффекте.
- Очевидно, что если количество индикаторов меньше чем величина буфера, то будут отображаться только последние введенные символы, влезшие в количество индикаторов. В противоположном случае, если буфер меньше количества индикаторов, то буфер на индикаторах будет повторяться циклически.

Прошивки для индикаторов с общим анодом (OA)

049-UART-to-7Seg-16-OA v1.0 - Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 16 символов. Индикаторы с общим анодом.

049-UART-to-7Seg-32-OA v1.0 - Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 32 символов. Индикаторы с общим анодом. 

Прошивки для индикаторов с общим катодом (OK)

049-UART-to-7Seg-16-OK v1.0 - Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 16 символов. Индикаторы с общим катодом.

049-UART-to-7Seg-32-OK v1.0 - Прошивка для ATtiny13 драйвера линейки 7-сегментных индикаторов. Буфер - 32 символов. Индикаторы с общим катодом.
Фьюзы для всех прошивок одинаковы

049-Fuse - Фьзы для прошивок драйвера линейки
Размер буфера следует выбирать, по возможности, наименьшим. Меньший буфер меньше шумит сегментами индикаторов при сдвигах и обновлениях линейки (это касается только схем без гашения индикаторов сигналом /ОЕ).
Прошивка для OA будет работать с OK-индикаторами, если в начале сеанса работы послать управляющий символ инвертирования “[“, и наоборот.


Файлы к статье:

049-7Seg-shem - Схема драйвера линейки индикаторов

ATTiny13.pdf - Даташит для ATTiny13/13V

RL-S10-SERIES - Даташит на дюймовый 7-сегментный индикатор

74HC164 - Даташит на сдвиговый регистр

049-AB-UART-to-7Seg v1 - Исходник на Algorithm Builder драйвера линейки 7-сегментных индикаторов


Смотрим также:

Демонстрацию устройства в следующей статье.

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

047-Драйвер матричной клавиатуры 3х4 на ATtiny13 с UART выходом.

047-Драйвер матричной клавиатуры 3х4 на ATtiny13 с UART выходом.:
титлВ предыдущей статье мы реализовали программный UART в ATtiny13. Чтобы показать целесообразность применения программного UART в ATtiny13 пришло время заюзать этот интерфейс в реальном устройстве.

Выбор реального устройства пал на устройства ввода – keypad. Кто не в курсе – это набор (матрица) клавиш, часто 3х4 (а-ля телефон). Такие кейпады продаются в радиомагазинах.

Вот купил один:
Заводской кейпад
Также заиметь такой кейпад можно способом расковыривания ненужной оргтехники (телефоны, калькуляторы – все пойдет в ход!) или, брутально, отпилить ножовкой по металлу кусок от ненужной «клавы» для PC.
Старые клавиатуры


Для классического варианта обслуживания матрицы клавиш нужно 3+4=7 линий (ножек микроконтроллера), но у ATtiny13 есть только 5 (не считая сброса), кроме того, одна ножка нам нужна для передачи сообщений по UART – итого 4. Не сходится. Но ничего, мы подключим keypad к ATtiny13 нестандартно! Используя АЦП микроконтроллера, мы обойдемся всего тремя ножками. Вот так:
Схема драйвера клавиатуры
На схеме не указан разъем для программирования, но я надеюсь Вы знаете куда его приткнуть. Пунктиром показаны не обязательные элементы, они могут понадобится в случае больших помех на линиях АЦП и не надежного срабатывания клавиш (конденсаторы подобрать экспериментально, но не более 0.01мкФ).
Идея такого подключения матрицы клавиш заключается в том, что на линиях строк, при помощи резисторного делителя напряжения, создаются разные потенциалы. При нажатии на клавишу соответствующий потенциал прикладывается к определенной линии столбца, где он оценивается соответствующим АЦП. По результатам оценки потенциала можно однозначно сделать вывод, о том какая клавиша нажата.
Раз мы обошлись всего тремя ножками для обслуживания keypad’а оставшеюся ножку используем для световой и звуковой сигнализации – клавиатура у нас будет «пикать» и красиво светить светодиодиком :) .
В устройстве (прошивке) реализовано:

- устранение дребезга контактов;

– автоповтор при удержании клавиши;

– озвучивание нажатой клавиши;

– Shift-режим – расширение возможностей кейпада;

– индикация включения Shift-режима.
Работает устройство следующим образом:

При нажатии на клавишу, через UART, передается соответствующий символ (пример: нажали клавишу 1 – по UART передался символ «1″). При длительном удержании клавиши включается автоповтор – по UART непрерывно передаются символы нажатой клавиши.

При нажатии на любую из клавиш подается звуковой сигнал – «пиканье».

При нажатии клавиши «*» включается Shift-режим – загорится светодиод. В Shift-режиме при нажатии на клавиши по UART будут передаваться символы латиницы (пример: нажали клавишу 1 –по UART передался символ «A»; 2 – «B»; 3 – «C» и т.д.). Это сделано для того, чтобы расширить функциональность кейпада. Например, при помощи кейпада в нормальном режиме вводятся данные, а в Shift-режиме он используется для навигации по меню (по аналогии с Num Lock ПиСишной клавиатуры). Клавиши «*», «0″ и «#» передают по UART одни и те-же символы в обоих режимах (реализация общих для режимов клавиш, например: если клавишу «#» Ваш проект будет воспринимать как «Enter» , то этот «Enter» будет работать в любом режиме). Повторное нажатие «*» выключит Shift-режим.
Настройки передатчика UART:

- Скорость - 9600;

– Количество бит данных – 8;

- Стоп-бит – 1;

– Бит четности – нет.

(Baud Rate: 9600, 8 Data, 1 Stop, No Parity).
А вот и сама прошивка для ATtiny13:

047-T13-Key-to-UART.hex v1.0 [501 bytes] - Драйвер матричной клавиатуры на ATtiny13 c UART

047-T13-fusebits.png [1.68 KB] - Фьюзы для ATtiny13
Выводы:

Реализовав драйвер клавиатуры на ATtiny13 мы освободили: 6 ножек микроконтроллера Вашего проекта; как минимум, один таймер; память и процессорное время на обработку матрицы. Теперь для того, чтобы подключить клавиатуру к вашему проекту достаточно одной ножки микроконтроллера и минимальной обработки принятых символов.
047-ABProg-Key-to-UART.zip [8.61 KB] - Исходник драйвера клавиатуры на Algorithm Builder

Смотрим демонстрацию устройства:

048-Демонстрация: 047-Драйвер матричной клавиатуры 3х4 на ATtiny13 с UART выходом.
P.S.

Программа драйвера клавиатуры вышла размером в 140 слов – это всего 30% доступной памяти – жалко! Если есть какие пожелания, в плане чего добавить, пишите, будем добавлять!




046-Программный UART для ATtiny13.

046-Программный UART для ATtiny13.:
В заглавной статье по интерфейсам fkvfaydar обратил внимание на то, что неплохо было бы заиметь интерфейс UART в ATtiny13. Полностью согласен с fkvfaydar, более того, я считаю, что реализация программного UART для микроконтроллера ATtiny13 будет показательной в плане философии блога – удобные, недорогие устройства для Ваших проектов. Что может быть дешевле и проще ATtiny13? А значит, быть статье!
Программый UART в ATtiny13
ATtiny13 маленький и недорогой микроконтроллер, имеющий у себя на «борту» АЦП, что очень удобно для обслуживания датчиков и выносной периферии. Но у ATtiny13 есть один большой недостаток – отсутствие, каких либо, аппаратных интерфейсов для связи. Это сводит на нет все его достоинства. Будем это исправлять! Организуем программный интерфейс для ATtiny13!
UART, наверное, лучший интерфейс для программной реализации.

Причин несколько:

– интерфейс простой и по причине маленького размера памяти программ микроконтроллера это актуально;

– для работы интерфейса нужны только 2 линии, приемника – RxD и передатчика – TxD. А если нужен только прием или только передача будет задействована только одна ножка микроконтроллера (рабочих ножек у ATtiny13 всего 5, если не считать Reset), а значит 4 ножки остаются нам на наши нужды;

– ну и немаловажным есть то, что UART очень распространен и в микроконтроллере Вашего проекта он точно найдется.
На какие ресурсы ATtiny13 мы можем рассчитывать при реализации UART?

А рассчитывать нам особо не на что:

– размер памяти программ 512 слов (большая часть должна остаться для основной программы);

– один восьмибитный таймер (основная программа должна иметь возможность им пользоваться);

– прерывания по изменению уровня на ножках.

Вот, собственно, и все.
Что мы хотим получить от программной реализации интерфейса UART?

- код, по возможности, меньшего размера и с наименьшим потреблением ресурсов;

– по возможности, независимые прием и передачу;

– кроме того, должна оставаться возможность полноценного функционирования основной программы.
Нужно понимать, что программная реализация, хоть и простого, но все-таки интерфейса, потребует определенных «жертв». Для облегчения жизни микроконтроллеру откажемся от возможности задавать различные режимы работы UART. Это даже не «жертва» – это здравый смысл! Интерфейс будет работать в одном режиме (Скорость UART – 9600, количество бит данных – 8, бит четности – нет, стоп-бит – 1). Проверка на правильность передачи байта (бит четности), конечно, штука нужная, но для неответственных приложений (а у нас именно такие) необязательная. Убираем. Скорость работы UART (Baud Rate) может быть любой (частота задающего генератора контроллера это позволяет).
Вариантов реализации мною рассматривалось несколько, но самым удачным оказался вариант работы на прерываниях. Как прием, так и передача осуществляется в процедурах обработки прерываний по сравнениям счетчика Timer0 – TIM0_COMPA и TIM0_COMPB. Кроме того, для определения начала посылки используется прерывание по изменению уровня сигнала на ножке – PCINT0. Достоинством такого способа есть то, что работа интерфейса не мешает ходу основной программы и можно использовать, параллельно с UART, таймер (конечно не совсем полноценно – но хоть так).
Теория реализации интерфейса.

Обе процедуры обработки прерывания по сравнению таймера TIM0_COMPA и TIM0_COMPB вызываются непрерывно с частотой 9600 Гц (частота работы UART).

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

PCINT0 используется для обнаружения переднего фронта старт-бита принимаемого кадра. В прерывании PCINT0 происходит коррекция фазы вызова прерывания TIM0_COMPB таким образом, чтобы прерывания возникали в центрах битов принимаемого кадра, где однозначно можно определить значение принимаемого бита.

Описывать работу прерываний и программы в целом не буду (боюсь Вас занудить) – смотрите листинги программ (там комментариев больше чем самой программы :) ).
Интерфейс реализован в двух вариантах:

046-T13-C-ProgUART.zip [42.7 KB] - Программная реализация UART для ATtiny13 на CodeVisionAVR

046-T13-AB-РrogUART.zip [11.86 KB] - Реализация программного UART для ATtiny13 на Algorithm Builder


Управление работой, как приемника, так и передатчика осуществляется через две переменные.

Передатчик:

Tx_Byte – передаваемый байт. В эту переменную записываем байт который хотим передать;

Tx_Count – счетчик переданных бит. Для запуска передачи байта из Tx_Byte нужно обнулить Tx_Count. Дальше передача идет автоматически в прерываниях. Если Tx_Count равен 10 значит передача окончена, можно передавать следующий байт.

Приемник:

Rx_Byte –принятый байт;

Rx_Count – счетчик принятых бит. Если счетчик равен 10 значит прием окончен, можно забрать принятый байт из Rx_Byte. В Rx_Count ничего записывать не нужно, прием начинается автоматически по факту прихода на ножку RxD старт-бита.
Чтобы не морочиться с переменными, для работы с интерфейсом, в обоих вариантах реализации (Algorithm Builder и CodeVisionAVR), определены по две процедуры:

PutByte () – отправка байта по линии TxD. Если процедура вызвана во время передачи предыдущего байта, процедура будет ожидать окончания передачи и лишь потом инициирует новую передачу.

GetByte () – чтение, принятого по линии RxD, байта. Если процедура вызвана во время приема байта, процедура будет ожидать окончания приема и потом вернет принятый байт. Если принятый байт уже был прочитан, а новый еще не начал приниматься – процедура вернет значение – 157 (это сделано для того, чтобы в программе было видно, что новых байт по RxD не поступало). Если байт принялся с ошибкой (неправильный формат кадра), процедура вернет значение – 158.

В случае надобности процедуры TxByte и RxByte Вы всегда можете подкорректировать под себя.
В работе программного UART есть небольшой нюанс, который нужно учитывать при реализации его в каждом конкретном микроконтроллере. Этот нюанс – внутренний задающий генератор (RC – цепочка). Дело в том, что, в отличии от кварцевого генератора, частота его не очень стабильна и зависит от температуры, напряжения питания и других факторов. И может такое случиться, что в вашем микроконтроллере частота внутреннего генератора выйдет за пределы, допустимых для UART, 10% . Уход частоты от допустимой будет сопровождаться большим количеством ошибок при приеме-передаче (посылаем «Hello World», а принимаем «lsksadkfh»). Хотя такой большой уход и редкость, но нужно знать как решить эту проблему.

1 Официальный способ. У микроконтроллеров есть, так называемые калибровочные байты, которые и призваны подстраивать частоту внутреннего задающего генератора. Калибровочные байты доступны при программировании (правда, не все программы для программирования позволяют с ними работать). Чем больше значение в нем записано, тем меньше частота задающего генератора. Если Вы выбрали этот способ коррекции – почитайте сначала даташит.

2 Простой способ. Вместо того, чтобы корректировать частоту задающего генератора, можно подкорректировать частоту вызова прерываний таймера в самой программе. Для этого нужно поменять значение константы Baud Rate, которая используется для вычисления периода срабатывания прерываний. Менять значения нужно в пределах ±5-7% от стандартного (9600).

1
2
3
#define Baund_Rate  9600
// Частота работы UART (если прием-передача с ошибками -
// поменяйте на значение больше/меньше на 5%)

Ниже привожу прошивки для теста работоспособности UART.
046-T13-test-9600.hex [440 bytes] - Тестовая прошивка для UART ATtiny13 9600

046-T13-test-10000.hex [444 bytes] - Тестовая прошивка для UART ATtiny13 10000

046-T13-test-9100.hex [442 bytes] - Тестовая прошивка для UART ATtiny13 9100

046-T13-FuseBits.png [2.38 KB] - Установки фьюзов для прошивки UART ATtiny13
Прошивка реализует простой алгоритм: принятые по RxD символы сразу же передаются по TxD назад (передача происходит параллельно с приемом), при этом все буквы латиницы нижнего регистра передаются в верхнем регистре (принялось «Hello World», отправилось «HELLO WORLD»). Прошивки даны в трех вариантах настройки скорости UART – 9600, 10 000 (+5%) и 9100 (-5%). Попробуйте какая работает лучше.
Подведем итоги.

Я считаю, что программный интерфейс UART получился удачным. Мы имеем приемник и передатчик которые могут работать параллельно, независимо друг от друга (полнодуплексная связь). Размер кода небольшой: приемник – 45 слов; передатчик – 20 слов (со всеми необходимыми инициализациями периферии это чуть больше 5 части памяти микроконтроллера). Прием и передача осуществляется в прерываниях, в фоновом режиме, незаметно для основной программы. Для реализации UART задействован единственный у ATtiny13 таймер, но основная программа не потеряла возможности его использовать для своих нужд. Реализация программного UART в микроконтроллере ATtiny13 позволит легко и дешево подключать различные удаленные периферийные устройства (в том числе и аналоговые) к Вашему проекту.
P.S. Наверное по причине нетвердых знаний в программировании на С, процедуры обработки прерываний в CodeVisionAVR не получились адекватными, в плане размера кода. Поэтому я сделал их ассемблерными. В них сложно разобраться (для Сишников), но зато код небольшой.

Если у кого-то получиться сделать адекватные процедуры обработки прерываний на С – присылайте! Другим будет легче разобраться.