- Микроконтроллер устройства своими руками
- Схема ИК-управления освещением на микроконтроллере ATmega8
- Аквариумный таймер для кормления рыб своими руками
- GSM-контроллер на микроконтроллере
- Кодовый замок на базе Bluetooth-модуля HC-05
- Универсальная схема подключения ЖК-дисплея HD44780
- Светодиодный волчок на микроконтроллере AVR ATtiny44
- Первый проект на микроконтроллере AVR Tiny
- Контроллер водяного насоса
- Программируемый таймер
- Подключение джойстика от 8-битных приставок к компьютеру
- Микроконтроллер своими руками
- На микроконтроллерах
Микроконтроллер устройства своими руками
Схема ИК-управления освещением на микроконтроллере ATmega8
Когда возникает необходимость включить свет, не вставая с дивана, может выручить пульт ИК-управления от телевизора. Который, как правило, всегда под рукой :).
На пульте дистанционного управления всегда найдутся кнопки, которые можно выделить для управления люстрой, торшером или другим освещением.
Аквариумный таймер для кормления рыб своими руками
Предлагаемая схема таймера для кормления рыб на микроконтроллере, может быть использована для любых других целей…
GSM-контроллер на микроконтроллере
Предлагаемая схема GSM-контроллера выполняет функции автоматического или ручного регулирования/оповещения. Схема реализована на популярном и доступном…
Кодовый замок на базе Bluetooth-модуля HC-05
Надоело таскать ключи в кармане, а без смартфона жизни нет. Раньше я публиковал разработку “кодовый…
Универсальная схема подключения ЖК-дисплея HD44780
Предложена простая схема, которая позволяет подключать любые ЖК-индикаторы на базе контроллера HD44780 с параллельной шиной…
Светодиодный волчок на микроконтроллере AVR ATtiny44
Существует множество конструкций и схем волчков со светодиодами. Обычно в них есть несколько светодиодов разного…
Первый проект на микроконтроллере AVR Tiny
После того как мы описали все элементы и компоненты проекта для микроконтроллеров AVR, предлагаем простой…
Контроллер водяного насоса
Совсем недавно увидел такую ситуацию: как насос “Гном” с поплавковым датчиком вовремя не откачал воду,…
Программируемый таймер
Программируемый таймер на микроконтроллере ATtiny45, схема которого представлена ниже, предназначен для коммутации нагрузки по заданным…
Подключение джойстика от 8-битных приставок к компьютеру
Все хорошо помнят то время, когда была очень популярна 8-битная приставка Dendy. Данное устройство на…
Источник
Микроконтроллер своими руками
Пытаясь освоить контроллеры и уже владея навыками программирования ПЛИС, мне пришла в голову дурная мысль. Пришла, постучала и вошла. Всем тем, к кому приходят дурные мысли, и кому интересно как с этим явлением справляются другие, посвящается.
Возникла идея нарисовать свой контроллер, не ограниченный по количеству периферии, ОЗУ и другим параметрам, кроме ёмкости ПЛИС. Скажем контроллер содержит 5 UARTов, а позарез нужен шестой, придётся изворачиваться. А зачем, если можно просто щёлкнуть мышкой и добавить необходимое? Или наоборот, задачка хорошо решается на пяти контроллерах с разрядностью 5, 32, 20, 32 и 20 с непредсказуемым количеством линий связи между ними. Жалко использовать пять 32 разрядников, ресурс всегда жалко, а совмещать две подзадачи на одно ядро – некрасиво, что ли.
Время отклика на прерывание в контроллерах достаточно велико. Да, контроллер прерываний мониторит входы (почему-то ограниченные по количеству) независимо от ядра. Но прежде чем начать выполнение кода программы по обработке прерывания, скажем, читать порт, требуется сохранить регистры общего назначения, а затем их ещё и восстановить. А это не один такт на пустое с точки зрения логики программы переписывание регистров в стек и возврат этих же значений обратно. Оно конечно вписывается в понятие реального времени, но ведь можно же делать это мгновенно: выполнялся код с низким приоритетом, на следующем же такте по причине резкой необходимости начинает выполнятся высокоприоритетное прерывание по таймеру, а через такт выполняется код по обработке внешнего потока данных, ибо там совсем всё быстро надо.
Конечно, все эти проблемы надуманы и решаются и легко и просто. Но дурная мысль не ищет таких решений, она просто бродит в переполненном пространстве сознания и подталкивает сделать нестандарт. А, если у молодого инженера отпуск, то прости жена и дети, но папа не «опять сидит за компьютером», а профессионально растёт. Тем более иногда хочется выполнять не кем-то придуманные задачки, а свои, полностью свои.
Рис. 1. Таймеры. Добавляй сколько хочешь. Обратите внимание на грамматическую ошибку. Стыдно, но не хочется Builder устанавливать для перекомпиляции.
Разрешите представить вам контроллер, архитектура которого, не то чтобы отличается от всех прочих, скорее она не принята на вооружение. Уже давно забыт список прочитанной перед началом работ литературы, использованы мысли многих людей из разных компьютерных эпох, простите меня мои забытые учителя. Зато вам не придётся от меня открещиваться. Да и денег это не пронесло, поэтому и делиться нечем.
Сразу скажу, что контроллер состоялся, прошит в Спартаны всех поколений и успешно трудится на просторах СНГ и одной стране Прибалтики. Сейчас бы многое было сделано по другому, но любые изменения мне уже ленивы и, что случилось, то случилось. А случилось вот что.
— Разрядность контроллера от 1 до 32, со знаком или без оного. (Не помню проверял ли я работу на малых разрядностях). Используется дополнительный код.
— Количество портов ввода/вывода ни чем не ограничена, разрядность ограничена разрядностью ядра.
— Количество таймеров так же не ограничено. На каждый таймер можно установить свой обработчик прерывания.
— Обработчик прерываний с бесконечным количеством входов, каждый вход имеет приоритет от 0 до 99 (ограничение по причине «и так большого числа»). Возможность запрещать все прерывания или низкоприоритетные только.
— Количество последовательных портов типа UART неограниченно, разрядность ограничена разрядностью ядра.
— Делитель частоты сделан плохо и неправильно, но исправно выдаёт любую частоту для любой периферии или просто наружу контроллера.
— Сопроцессор. О нём ниже.
То есть мы имеем контроллер, поддерживающий основные операции арифметики и прочего изменения битов в словах (плюс, минус, сдвиг, побитовая логика. ). Так же он обращается к внутренней памяти и хранит код программы так же внутри себя. Память используется блочная, именно она является платформозависимой и в настройках программы обязательно нужно указать какая микросхема будет носителем контроллера. Все операции по любому направлению действий выполняются за один такт, это может и не всегда хорошо, но упростило проектирование архитектуры. Исключением является целочисленный делитель, функции которого реализованы в сопроцессоре, деление выполняется медленно, но уверенно. Алгоритм деления был выбран самый простой – побитный.
Хотелось бы рассказать про код команд, но сам не помню из чего он состоит. Исходя из принципа «не использовать то, что не используется» даже длинна кода команды является величиной не константной, тем более его содержимое. Скажем, если в компилируемой программе встречается 14 команд, то каждая команда кодируется 4 битами, если используется 18 команд – выделяется пятый бит. Плюс к каждой команде добавляется бит длинны, если он равен 0, то команда одинарная, если 1 – двойная, или наоборот, это не важно. Двойная команда нужна для операций, содержащих адрес ОЗУ или ПЗУ. Добавим к этому то, что шины адреса так же имеют не константные длины, и получим полный бардак в коде команд, рассматривать его никаким дизассемблером смысла нет, как собственно и ассемблер в этом контроллере.
Форт – вот тот язык, который позволил мне реализовать эти странные идеи. Форт прост и низкоуровневый. Писать компилятор данного языка – одно удовольствие. Ну, конечно, все конструкции языка не поддерживаются, только основные по пересылке данных и их изменении.
Рис. 2. Руководство достаточно скромное. Нескромное так и не написано.
Рис. 3. Вторая часть руководства. Не знаю почему, но окно расширить нельзя. Есть ещё и третья часть, но уж совсем скучная.
И, естественно, мы имеем стековый контроллер. То есть Форт функционирует в своей естественно среде – в стеке, в аппаратном стеке, а не медленном программном. «Всё за такт!» — второй девиз проекта. Аппаратный стек позволил при переходе в функции или вызове прерывания сразу приступать к выполнению команд обработки данных, без необходимости сохранять контент прерванного процесса. «Новые» данные просто помещаются в стек сверху, «старые» уходят в глубь и прекрасно там сохраняются. Затем «новые» данные, поучаствовав в разных операциях, благополучно переходят в ОЗУ или другие места, а «старые» выталкиваются на вершину. При возврате в прерванный участок кода никто ничего не заметит. Адрес прерванного кода сохраняется в другом стеке, и максимальное количество прерванных процессов зависит только ото глубины Стека Возвратов. Это величина настраивается при компиляции, хоть бы и «очень большое число». Параметры в функции передаются так же через стек.
Stackcpu – именно так и называется контроллер, почему-то латиницей, хотя писать код можно и кириллицей. Что я и делаю, приведу пример функции «меняем_биты_в_слове»:
Где: «читаем_из_нужного_порта», «меняем_прочитанное_из_нужного_порта», «записываем_в_требуемую_ячейку_памяти» — функции, выполняющие определённые действия.
Ну не псих ли я красиво ли? Приведу ещё доказательства, программа управления светофором:
Ну что, псих красиво? Третий принцип проекта: «Литературный язык в управление электроникой!» Хотя, как показала практика, писать так программы довольно утомительно. Для знатоков Форт сообщу, что точку мой компилятор воспринимает как разделитель, и запятую тоже. Конечно, лучше использовать язык С, но компилятор С мне не по зубам, а использовать сторонние компиляторы архитектура не позволяет.
Рис. 4. Среда разработки с отчётом компилятора и линковщика.
Сколько ёмкости FPGA занимает контроллер? Да кто ж его знает. Всё зависит от разрядности числа, выбранной периферии, ещё чего-то, и от текста программы. В контроллере не будет умножителя, если он не встречается в программном коде, или не будет делителя, если его не использует программист. Под программистом я подразумеваю себя, так как других программистов данного контроллера не существует (принцип «не использовать тем, кто не использует»). По блочной памяти для ОЗУ данных и ПЗУ команд: минимум два блока, максимум вся блочная память кристалла.
Максимальная частота работы высчитывается только опытным путём, под конкретную архитектуру. Один из моих 24 разрядных контроллеров не работал на частоте 48 Mhz в Spartan2, на частоте 40Mhz заработал. В Spartan6 на сотне Mhz работал 32 разрядный. А может и на паре сотен заработает, ничего в нём такого сложного нет.
Рис. 5. Вот такой код увидит процессор. Обратите внимание, одна команда FORTH – это одна команда ядра процессора – один системный такт.
Первый PS: упомяну одну возможность сопроцессора – фильтр. Обычный БИХ фильтр. Но вот, что необычного в нём, так это то, что он использует плавающую точку. Не то что б в этом был какой-то смысл, просто прочитал какую-то книжку про форму представления чисел, и решил: ерунда интересна эта ваша плавающая точка, сделаем.
Рис. 6. Моделирование результатов работы фильтра. Высчитывается логика кода VHDL с точностью до битика.
Так же были планы по превращения проекта в систему на кристалле: добавление различных, писанных на VHDL блоков в периферию контроллера. И вроде не так уж и сложно, но запал иссяк. Дурные мысли меня покинули, и бродят где-то между программистами и электронщиками. И зовут их теперь Стартапами.
Так что, если к вам кто-то придёт и представится Стартапом, подумайте, а не скрывается ли под ним какой-нибудь Времяубиватель.
И ещё одно PS: С другой стороны, за время работы над проектом Stackcpu я неплохо подучил три два языка программирования:
1. FORTH, точнее некое его подмножество, необходимое для проверки работоспособности контроллера.
2. С++, на чистом С было бы тяжело написать среду разработки и компилятор. 3. VHDL, именно буквы этого языка и есть контроллер.
Источник
На микроконтроллерах
В некоторых случаях требуется «светофор местного значения», например, чтобы регулировать проезд автомобилей на автостоянку или на территорию гаражного кооператива, если въезд по различным причинам слишком узок для одновременного проезда двух машин. Здесь предлагается описание простого .
Здесь приводится описание цифровой шкалы для коротковолнового связного приемника, работающего в диапазонах 160м, 80м, 40м, 20м, 10м или любом из них. Шкала работает с двухстрочным ЖК-дисплеем. В его верхней строке показывает значение частоты в кГц,а в нижней длину волны в метрах. Внося .
Здесь описывается цифровой прибор на микроконтроллере, измеряющий скорость движения велосипеда. Индикатором служит ЖК-дисплей типа 1602А, он стандартный, на основе контроллера HD44780. Обозначение 1602А фактически значит, что он на две строки по 16 символов в строке. Используется только одна его .
Основой предлагаемого мультиметра является микросхема 16-битного двухканального дельта-сигма аналого-цифрового преобразователя (АЦП) AD7705. Широко распространенные мультиметры на основе АЦП двойного интегрирования ICL7106 [2] обеспечивают отображение результата преобразования числом, не превышающим 1999, что соответствует, без учета знака, 11-битному АЦП, за вычетом 48 единиц счёта.
Схема и описание самодельного реле времени на AVR микроконтроллере ATtiny2313 с индикатором фирмы Data Vision. Реле времени (таймеры), пожалуй, одна из самых массовых разработок конструкторов электронных техники. Автор предлагает вариант 4-х канального реле времени, разработанного на базе микроконтроллера семейства AVR и жидкокристаллического индикатора фирмы Data Vision. Принципиальная схема реле времени .
Этот макет светофорного управления движения на перекрестке можно использовать в различных играх по изучению правил дорожного движения. Он может быть сделан как в миниатюрном, настольном варианте для передвижения по нему игрушечных моделей машин и кукол-пешеходов, так и в варианте для детского .
Схема самодельного кодового замка, построенного на микроконтроллере PIC16F628A и транзисторах, имеет цифровое табло. Этот замок можно использовать для ограничения доступа в помещение, гараж, дом, сейф, шкаф. Его исполнительным устройством может служить механизм запирания двери автомобиля .
Предлагаемые часы показывают текущее время и дату, обладают функциями будильника. Их особенность — использование газоразрядных цифровых индикаторов ИН-12. Подобные индикаторы широко применялись в электронных часах и цифровых измерительных приборах в семидесятые годы прошлого века. Индикаторы .
Схема самодельного устройства, автоматически включающего и выключающего принудительную вентиляцию помещения. Работа устройства осуществляется в зависимости от относительной влажности воздуха в помещении и скорости её изменения. Оно не содержит дефицитных деталей и может быть помещено в стандартный .
Схема самодельных двоичных часов на микроконтроллере PIC16F628A и светодиодах. Эти необычные карманные часы могут стать оригинальным подарком. Индикатор времени в них построен всего на шести единичных светодиодах. Секрет в том, что число часов и число минут текущего времени отображаются ими .
Источник