Показаны сообщения с ярлыком мигалки. Показать все сообщения
Показаны сообщения с ярлыком мигалки. Показать все сообщения

четверг, 9 декабря 2021 г.

Мигалка на микроконтроллере stm32f103c8t6, языке си и библиотеке CMSIS

 Создание светодиодной мигалки на микроконтроллере является аналогом созданию "Hello World!" при написании первой программы выполняемой на компьютере при изучении какого нибудь нового языка программирования, библиотеки, фреймворка или чего то подобного. Т.к. это обычно самое простое устройство которое можно сделать а чтобы подключить дисплей к микроконтроллеру и вывести на нем "Hello World!" нужно уже неплохо разбираться в программировании данного микроконтроллера. Микроконтроллеры STM32 неплохо продуманны и весьма популярны поэтому уроков по их программированию в сети интернет очень много. Особенно много уроков по мигалкам т.к. это, по традиции, первое с чего следует начать. Тем не менее, это не повод отказаться от изучения данных микроконтроллеров и поделиться опытом с другими по тому что любой опыт может оказаться полезным. О том как установить и настроить среду разработки для STM32 а также о том как откомпилировать и загрузить программу в микроконтроллер есть отдельная статья -> https://electe.blogspot.com/2019/06/stm32.html. Однако не обязательно использовать именно такую среду разработки как в той статье т.к. со времени её создания появились более новые и такие же бесплатные как Coocox CoIDE среды, например STM32CubeIDE. Есть также платные среды вроде Keil, IAR и т.д. Также есть возможность адаптировать Arduino IDE для работы с STM32F103C8T6, использовать генератор кода для инициализации STM32CubeMX. Что даст более быстрый результат но меньшее понимание микроконтроллера и работы с ним. Помимо этого можно также выбрать более продуманный путь и не использовать IDE или написать свою IDE однако такой путь, в данном случае, будет весьма трудоемким и выбрав его есть риск "увязнуть" в подготовке и не начать программировать микроконтроллер никогда или не скоро. STM32CubeIDE и STM32CubeMX - это возможно лучшие варианты которые стоит использовать для постоянной работы с микроконтроллерами STM32. Однако Coocox CoIDE не изобилует большим количеством открытых окон (от которых рябит в глазах) после запуска и имеет системные требования подходящие для не крутых компьютеров а также про его установку уже есть статья. Также для лучшего изучения микроконтроллера желательно уметь настраивать его в коде по тому что это основной обычный способ настройки для большинства микроконтроллеров и в случае возникновения бага к нему непременно придется вернуться. Конечно это будет проблематично и возможно не оправданно для сложной периферии вроде USB но для простой мигалки и подобных вещей генератор кода не дает существенных преимуществ (если конечно вообще их дает). В качестве языка для создания первой программы на новом микроконтроллере конечно более предпочтителен Си т.к. на ассемблере простая мигалка уже будет не такой простой чтобы не вызвать затруднения отбивающие желание продолжать обучение. Ассемблер, само собой, очень важный язык к которому приходиться обращаться для оптимизации, устранения багов или реверс иженеринге (возможно есть и другие причины о которых можно написать в комментариях) но в большинстве случаев такой необходимости нет. В качестве библиотеки для первой программы выбрана CMSIS т.к. она делает минимальные начальные настройки и доступ к регистрам без сложных высокоуровневых "оберток отделяющих программиста от этих регистров". Чтобы подключить CMSIS при создании проекта в среде Coocox CoIDE нужно поставить галочку в чекбоксе с надписью "CMSIS_Boot" (или с аналогичной надписью) галочка с надписью "CMSIS_Core" при этом, установиться автоматически.


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


Чтобы писать программу для микроконтроллера нужен документ с описанием всех его регистров. Для stm32f103c8t6 есть reference manual -  https://www.st.com/resource/en/reference_manual/cd00171190-stm32f101xx-stm32f102xx-stm32f103xx-stm32f105xx-and-stm32f107xx-advanced-arm-based-32-bit-mcus-stmicroelectronics.pdf.

В микроконтроллерах STM32, в отличии от AVR, прежде чем использовать какое либо периферийное устройство, нужно включить его тактирование. В данном микроконтроллере для этого есть два регистра APB1 и APB2. Чтобы помигать светодиодом нужно его сначала правильно подключить к какому нибудь пину на порту ввода-вывода общего назначения. Т.к. в микроконтроллерах STM32 есть замечательная возможность настроить пин как выход с открытым стоком то стоит испытать данный вариант. Его преимуществом перед обычным пушпульным выходом можно также назвать то что он более безопасен в случае например короткого замыкания между пинами (хотя если второй пин будет пушпульным и выдавать лог.1 то это не поможет) или пином и землей. Подключить светодиод к такому выходу можно например способом показанным на рисунке:


Можно также подключить светодиод между пином и землей а резистор между пином и плюсом питания и так он будет загораться при лог.1 на выходе но такой способ более энергозатратный и менее безопасный в случае случайного конфигурирования пина как пушпульный выход. Из рисунка выше видно что светодиод подключен к пину 9 порта B следовательно надо настроить тактирование порта B. Данная настройка осуществляется через регистр APB2:


-Это картинка из reference manual (см. ссылку выше) с выделенным (красным прямоугольником со скругленными краями) битом конфигурации тактирования порта B.

Т.е. для того чтобы включить тактирование порта B нужно записать 1 в бит 3. По умолчанию в этом бите находиться 0 но так бывает не всегда поэтому за этим надо следить чтобы делать правильные настройки. Чтобы сделать это в коде, можно использовать операцию присвоения с логическим или |= так в тех битах в которых уже установлена единица она останется а те в которых её нет она запишется. Можно также использовать простое присвоение и учитывать все единицы и нули сразу в 32ух разрядных микроконтроллерах это это делать проблематично ввиду большого количества битов за которыми надо следить не игнорируя те которые для решения текущей задачи не важны. После присвоения с логическим или можно использовать простые и наглядные двоичные числа например так:


Но из за того что битов 32 числа получаются длинными. Для сокращения можно использовать оператор побитового сдвига влево например так:


Это, всё ещё, не последний способ записать единицу в нужный бит но именно такой способ используется чаще всего, когда нужно видеть какой по счету бит устанавливается, из за его наглядности. В  строке после комментария "включить тактирование порта B" RCC - это указатель на структуру а APB2ENR - это поле данной структуры. Теперь чтобы настроить пин 9 порта B на выход с открытым коллектором нужен регистр GPIOB_CRH. В reference manual он обозначен как GPIOx_CRH где x - это буква порта (в нашем случае B):


Есть также регистр GPIOB_CRL где буква L указывает на то что этот регистр относиться к пинам с 0 по 7. Регистр же GPIOB_CRH относиться к пинам с 8 по 15 поэтому мы настраиваем его. Из мануала видно какие биты надо установить в единицу чтобы пин был с выходом с максимальной частотой 2МГц и открытым стоком (эти биты указаны стрелочками на картинке выше). При этом следует учитывать что не все биты по умолчанию установлены в 0. Это можно использовать и например не делать установку единицы бит 6 но если например нужно сделать пушпульный выход то нужно не забыть затереть этот бит записав в него ноль. В коде настройка выглядит так:


Теперь осталось сделать собственно мигание светодиодом. Т.е. установку в 1 пина 9 порта B (при этом светодиод гаснет т.к. верхний транзистор кмоп полумоста не работает и всегда закрыт а нижнему закрытым быть положено). Потом задержку. Специальной функции для задержки в библиотеке CMSIS нет, поэтому задержку нужно делать самому, для этого можно использовать пустой цикл. После чего сброс до 0 пина 9 порта B (светодиод при этом светиться т.к. нижний транзистор кмоп полумоста открывается). Для управления пином, в режиме выхода, есть три регистра, первые два из них можно использовать для установки в 0 или 1 а последний нужен только для сброса до 0 поэтому он не интересен. Первый называется GPIOx_ODR где x-буква порта (в нашем случае B). В этом регистре номер бита соответствует номеру пина (что очень удобно) поэтому для управления пиами можно даже не смотреть в мануал:


В коде мигалка будет выглядеть так:

Для сброса до нуля используется присвоение с логическим и которое выглядит так 
&=
также сдвиг в лево но на этот раз все биты инвертируются оператором "волнистая черта"
~
Можно также сделать это простым присваиванием но на, первых порах, важно рассмотреть базовый вариант установки конкретного бита. 
Второй регистр для управления пинами порта B называется GPIOB_BSRR. С ним работу следует вести по другому. Биты от 0 по 15 нужны для установки в 1 а оставшиеся для сброса до 0. Для установки 1 на пине 9 нужно в 9й бит записать единицу а если нужно установить лог. 0 на пине 9 то нужно в пин по номером 9+16=25 записать 1. Управление пином через данный регистр происходит быстрее чем через предыдущий. Мигалка, с использованием данного регистра, в коде может выглядеть так:

Полный код мигалки приведен в текстовом поле:



Видео по теме данной мигалки:



воскресенье, 4 октября 2020 г.

Аппаратный ШИМ на ассемблере для ATtiny2313

Широтно импульсная модуляция (ШИМ) напряжения имеет множество применений. В электроприводах постоянного тока она используется для регулировки оборотов электродвигателя, в асинхронных электроприводах и инверторах такой модуляцией делаются синусоидальные напряжения, в источниках питания и DC-DC конвертерах для стабилизации и изменения напряжения, также этот тип модуляции может применяться для регулировки освещения электрическими лампами, температуры создаваемой электрическими нагревателями и использоваться во многих других случаях с электроприборами для которых подходит такой способ модуляции. В общем этот тип модуляции очень важен и поэтому во многих микроконтроллерах делают аппаратную поддержку ШИМа. ATtiny2313 - не исключение и в этом микроконтроллере есть 4 канала аппаратного ШИМа. Такой ШИМ можно получить с 4х специальных пинов:

Рисунок 1 - Пины аппаратного ШИМа микроконтроллера ATtiny2313

Для создания ШИМа используются таймеры счетчики которых в ATtiny2313 две штуки. На каждом из них есть два канала. Настроить аппаратный ШИМ на этом микроконтроллере не сложно. Сперва нужно настроить соответствующие выводы (см. рисунок 1) на выход (о том как это делать см. предыдущие статьи по ассемблеру). После чего есть два регистра TCCR0A и TCCR0B для 8ми битного таймера и два регистра TCCR1A и TCCR1B для 16ти битного таймера. Для настройки 8 ми битного таймера в режим FAST PWM (быстрый ШИМ) в нулевой и первый биты регистра TCCR0A записываются единицы. Для того чтобы ШИМ работал так:
В начале периода идет высокий уровень а по прошествии некоторого количества тактов он заменяется низким:


 И чтобы так было на обоих каналах. Нужно в 5й и 7ой биты регистра TCCR0A записать единицы.
в итоге должно получиться примерно так:

LDI R16, 0b10100011
OUT TCCR0A, R16

Также нужно запустить таймер чтобы ШИМ начался. (об этом см. статью про таймер https://electe.blogspot.com/2020/08/attiny2313.html). Запускать надо естественно без предделителя чтобы режим действительно был FAST. В итоге должно получиться что то вроде этого:
 
LDI R16, 0b00000001 
OUT TCCR0B, R16 

Чтобы устанавливать какое либо напряжение на нужном пине есть регистры OCR0A и OCR0В для 8 ми битного таймера и OCR1A и OCR1В для 16ти битного таймера. Записывать в них можно от 0 до 255 (т.к. регистр 8ми битный) а напряжения на соответствующих выводах (см. рисунок 1) будет меняться пропорционально записанному числу. Например установить половину напряжения питания на пине 14 ( он же PB2 или OC0A или PCINT2) можно командами:

LDI R16, 127
OUT OCR0A, R16

На основе аппаратных ШИМов можно сделать например не обычную светодиодную мигалку а например псевдоплавную. Код такой мигалки приведен в поле:

Светодиоды с резисторами необходимо подключит к выводам 9 и 14 микроконтроллера ATtiny2313. К данной статье прилагается видео:
В котором также рассказано о подпрограммах на ассемблере для микроконтроллеров AVR.

воскресенье, 9 августа 2020 г.

Прерывание по переполнению таймера на ассемблере для ATtiny2313

Таймеры/счетчики есть в большинстве современных микроконтроллеров. Они используются для множества разнообразных целей. Например для каких нибудь часов, широтно-импульсной модуляции (ШИМ), динамической индикации и ещё очень много для чего. В микроконтроллере ATtiny2313 их два. Один из них 8ми битный другой 16ти битный. Тот что 8ми битный может считать только до 255 т.к. для большего числа нужно большее количество бит. На основе 8ми битного счетчика можно делать что либо с малыми промежутками времени напр. ШИМ, динамическую индикацию, какие либо короткие импульсы напр. для каких нибудь протоколов связи по какому нибудь редкому интерфейсу или для чего нибудь ещё для чего нужны не долгие импульсы. На основе 16ти битного таймера счетчика можно делать длинные задержки (но короткие делать тоже можно). 16ти битный таймер/счетчик более универсальный поэтому его стоит изучить первым. На его основе можно сделать светодиодную мигалку

Рассмотрим ассемблерный код светодиодной мигалки на таймере:


Вначале подключаем специальный файл а также указываем директиву начала сегмента кода (об этом подробно написано в предыдущем уроке). Далее после директивы ORG с адресом с которого начинается выполнение программы ставим безусловный переход для того чтобы код изменения состояния светодиода (зажечь когда погашен или погасить когда зажжен) не выполнялся сразу после запуска микроконтроллера или после сброса. Далее инициализация стека (см. предыдущий урок). После инициализации стека идет инициализация таймера. Для настройки таймера есть некоторое количество регистров. В простейшем варианте (как сейчас) достаточно настроить два регистра TCCR1B - для запуска таймера и настройки его тактирования а также TIMSK - для разрешения прерывания. У разных микроконтроллеров регистры настраиваются по разному поэтому при переходе на другой микроконтроллер надо смотреть документацию и возможно устанавливать другие биты. В данном случае в регистре TCCR1B наиболее интересны первые 3 бита которыми устанавливается тактирование таймера. Если все три этих бита нули то раймер не тактируется и не работает. Если нулевой бит с единицей а остальные с нулем то таймер тактируется от того же генератора что и центрайльный процессор микроконтроллера и без предделителя. Если первый бит с единицей а остальные с нулями то тактирование также от генератора для центрального процессора но добавляется предделитель на 8. Более наглядно все опции представлены в таблице в документации:

Чтобы разрешить прерывание по переполнению 16ти битного таймера нужно в 7ой бит регистра TIMSK записать 1. Этот регистр в ATtiny2313 отличается от того же регистра в например ATmega8 т.е. TIMSK ATtiny2313 не TIMSK ATmega8 и настраивать их нужно по разному. 

Далее в коде пин со светодиодом настраивается на выход (об этом в предыдущих уроках). 

Командой SEI разрешаются все прерывания в том числе и то что было настроено для таймера.

Далее идет основной цикл в котором ничего интересного не происходит. Когда таймер досчитывает до максимального числа которое может поместиться во все его 16 бит, происходит переполнение этого таймера и прерывание по этому переполнению. Выполнение прогрвммы переноситься из основного цикла на ячейку флешь памяти с адресом обозначаемым как OVF1addr. А в этой ячейке организован безусловный переход на подпрограмму обработки этого прерывания. В этой подпрограмме меняется состояние светодиода (с погашенного на горящий или с горящего на погашенный). Команда RETI осуществляет выход из подпрограммы обработки прерывания. Выход происходит обратно в основной цикл где ничего интересного. Таймер опять считает до максимального значения и далее все повторяется.



понедельник, 27 июля 2020 г.

Работа с кнопкой на ассемблере для ATtiny2313

Для того чтобы опросить пин микроконтроллера AVR настроенный на ввод существует несколько команд. Команда SBIS делает пропуск следующей после неё команды если на опрашиваемом пине высокий уровень напряжения (+5В (логическая единица)) и не делает этот пропуск если на этом пине низкий уровень напряжения. Существует команда SBIC которая делает такой пропуск если на опрашиваемом пине низкий уровень и не делает его если высокий. Т.о. система микроконтроллера AVR позволяет опросить отдельный пин, какого либо порта, одной командой и сделать это за один такт. Как было показано ранее вывод логической единицы или нуля на пин настроенный на выход также можно одной командой за один такт. Есть команды для работы с портом целиком - это команда OUT для вывода и команда IN для ввода (т.е. опроса порта целиком). Чтобы проверить на практике ввод с кнопкой, можно использовать схему:
Рисунок 1 - Мигалка с кнопкой с подтягивающим резистором на ATtiny2313

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

здесь добавлена строка:
SBIS 0x10, 1 ; пропустить следующий команду если кнопка не нажата
0x10 - это адрес регистра для опроса порта D,
1 - это номер пина порта D к которому подключена кнопка.
Т.о. получается что светодиод может загораться только в случае если кнопка нажата т.к. только тогда команда SBIS будет позволять выполниться команде установки пина, к которому подключен светодиод, в единицу.
Можно упростить схему на рисунке 1 убрав резистор для подтягивания пина к плюсу питания когда кнопка не нажата.
Рисунок 2 - Мигалка с кнопкой на ATtiny2313

 Но чтобы схема работала также как раньше надо подключить внутренний подтягивающий резистор. Сделать это можно такой же командой какой мы устанавливали логическую единицу на пине настроенном на выход. Т.е. командой SBI но для пина к которому подключена кнопка.

Здесь добавлена строка:
SBI 0x12, 1 ; подача на пин 1 порта D высокого уровня
Прежде чем добавлять такую строку надо сначала убедиться что пин настроен на вход. Убедиться в этом можно посмотрев строки:

LDI R16, 0b00000001      ; поместим в регистр R16 число 1
OUT 0x11, R16            ; загрузим значение из регистра R16 в DDRD

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


КАРТА БЛОГА (содержание)

воскресенье, 19 июля 2020 г.

Мигалка на ассемблере и ATtiny2313

Для программирования микроконтроллеров существуют два основных языка - это язык Си и Ассемблер. Бывают и другие языки но Си и Ассемблер используются чаще других т.к. их можно использовать для создания программ оптимально использующих ресурсы микроконтроллера. Язык Си более прост в изучении чем Ассемблер, более прост для понимания человеком вообще (на нем можно писать более читабельный код) а также более просто переносим между разными микроконтроллерами и вообще разными устройствами. Ассемблер же не так прост в понимании и хуже переносим т.к. он имеет множество разных команд которые отличаются друг от друга при программировании разных микроконтроллеров и устройств и даже при программировании одного и того же устройства но при использовании разных компиляторов. Однако язык ассемблер дает больше возможностей управлять ресурсами микроконтроллера. Программы написанные на Ассемблере могут быть более оптимальными чем программы на Си. Также изучение Ассемблера позволяет лучше понять работу микроконтроллера и писать более оптимальные программы на языке Си. Поэтому данный низкоуровневый язык стоит изучить даже если необходимость в его изучении и применении на практике никогда не возникала. Данный язык сильно отличается для разных микроконтроллеров но всё таки некоторые общие принципы наверняка должны присутствовать в той или иной степени для разных устройств. Начать скорее всего будет лучше с какого нибудь простого микроконтроллера. Например, для старта, можно взять ATtiny2313 и написать для него мигалку а если это получиться то делать далее уже более сложные устройства и переходить на более сложные микроконтроллеры например какие нибудь из STM32. Чтобы писать саму программу можно использовать какой либо текстовый редактор. Обычно в ОС Windows присутствует текстовый редактор "блокнот". После написания программы в "блокноте"её можно сохранить в формате с расширением .asm потом откомпилировать в файл с расширением .hex каким нибудь компилятором ассемблера для микроконтроллеров avr напр. компилятором avra (который можно скачать по ссылке https://sourceforge.net/projects/avra/files/1.2.3/ (для windows нужно скачать avra-1.2.3-win32.zip)) (для установки достаточно разархивировать) и записать полученный файл с расширением .hex в микроконтроллер утилитой avrdude (устанавливается вместе с arduino IDE, WinAVR или отдельно) через программатор. Рассмотрим схему устройства которое будем программировать:
Рисунок 1 - Светодиодная мигалка на микроконтроллере ATtiny2313 с программатором

На рисунке выше приведена схема светодиодной мигалки на микроконтроллере ATtiny2313 с программатором. Микроконтроллер ATtiny2313 имеет встроенный тактовый RC генератор и встроенный внутренний резистор для подтяжки вывода reset к нужному для работы микроконтроллера уровню также ему не нужно много внешних конденсаторов и прочей дополнительной обвязки (этим данный микроконтроллер прост и хорош). В качестве программатора можно использовать Arduino с записанным в неё скетчем ISP программатора:
Рисунок 2 - Светодиодная мигалка на микроконтроллере ATtiny2313 с программатором на Arduino Uno

Если все необходимые элементы имеются то можно начинать писать программу. Давайте рассмотрим простую программу мигания светодиодом на Ассемблере:

Ассемблер, в отличии от Си, регистронезависимый язык поэтому команды можно писать и большими буквами и маленькими и вперемешку. Команды которые начинаются с точки называются директивами. Директивы - это команды не для микроконтроллера а для компилятора. Директива .CSEG означает начало сегмента кода, помимо сегмента кода существует также сегмент данных и сегмент EEPROM. Директива .ORG указывает адрес с которого начинается сегмент. В ассемблере можно делать комментарии т.е. строки которые игнорируются компилятором и нужны для помощи программисту, комментарии начинаются с точки с запятой и завершаются концом строки. Команда LDI нужна для помещения в регистр какой либо константы. Константу можно записать в десятичном, шестнадцатеричном или двоичном виде. Если она записана в двоичном виде то перед ней ставиться нолик и английская буква b т.е. например 0b00000001. Двоичные числа удобны для конфигурирования порта микроконтроллера т.к. по ним наглядно видно в каком бите есть ноль а в каком единица. Если константа пишется в десятичном виде то перед ней ставить ничего не надо а надо просто написать число. Если константа пишется в шестнадцатеричном виде то перед ней ставиться 0x. Чтобы настроить второй пин микроконтроллера на выход нужно в записать единицу в нулевой разряд регистра DDRD. DDRD - это просто название регистра для удобства, на самом деле важно знать что этот регистр имеет какой то адрес в памяти и для того чтобы записать в этот регистр какое либо число и т.о. поместить либо ноль либо единицу в нужный его разряд, нужно записать это число по соответствующему адресу для регистра DDRD в микроконтроллере ATtiny2313 этот 0x11. Для того чтобы настроить второй пин микроконтроллера ATtiny2313 на выход мы сначала командой LDI записываем в регистр R16 число 0b00000001 а потом командой OUT из регистра R16 мы это число помещаем в регистр DDRD по тому что записать сразу константу в DDRD нельзя. Далее идет основной цикл программы т.е. "бесконечный" цикл в котором выполняются основные постоянные действия. Чтобы организовать этот цикл на ассемблере используется оператор безусловного перехода RJMP. В самом низу кода мы видим строку RJMP Start а в самом верху основного цикла мы видим метку Start. Команда RJMP просто переводит выполнение программы на то место где стоит метка т.о. если метку поставить перед этой командой после которой идет название этой метки то можно получить бесконечный цикл. Командой SBI мы устанавливаем высокий уровень т.е. пять вольт на нужном пине микроконтроллера. Если мы используем пин который связан с нулевым битом порта D то после команды SBI мы пишем адрес порта D (для микроконтроллера ATtiny2313 это 0x12) ставим запятую и после этого пишем номер бита который мы хотим установить в логическую единицу чтобы на нужном пине стало пять вольт. Аналогично командой CBI мы делаем ноль вольт на нужном нам пине. Для создания задержки сначала в регистр r18 записывается число 250 (максимальное которое можно записать = 255, минимальное = 0) потом 250 записывается в регистр r19. После чего командой dec (декремент) происходит уменьшение на единицу числа находящегося в регистре r19. Далее имеется команда brne - это оператор условного перехода т.е. он переносит выполнение программы на место с меткой при выполнении условия. Если результатом операции предшествовавшей данной команде был ноль то перехода туда где стоит метка не происходит и выполнение программы продолжается, если был получился не ноль то происходит переход на строку с меткой в данном случае это L1. Т.о. получается цикл выход из которого происходит тогда когда число в регистре r19 становиться равным нулю. Далее происходит декремент числа в регистре r18 и так как сразу там ноль не получиться то переход происходит на строку с меткой L1 а там стоит декремент числа в регистре r18 но так как там уже ноль то декремент делает там 255 и всё повторяется заново т.о. получается вложенный цикл. Эти циклы выполняются какое то время и делают задержку для того чтобы можно было наблюдать мигание светодиода.
После того как программа написана (например в имеющемся в windows текстовом редакторе "блокнот" или любом другом подходящем текстовом редакторе (неважно каком (это дело вкуса (на результат не повлияет (если текстовый редактор подходит для данных целей и позволяет сохранять текст в формате .asm))))) её можно сохранить в формате .asm и откомпилировать в cmd (командной строке windows) командой:
путь_до_компилятора_avra путь_до_файла.asm
например:
F:\avra-1.2.3\bin\avra F:\avr\blink.asm
Если компиляция пройдет успешно то компилятор создаст файл с расширением .hex который можно загрузить в микроконтроллер например командой:
avrdude -c avrisp -P COM3 -b 19200 -p t2313 -U flash:w:blink.hex
(avrdude перед этим надо установить на компьютер)
Эта команда сработает если используется микроконтроллер ATtiny2313 (-p t2313), программатор avrisp (-c avrisp (он же arduino, он же stk500, он же "пять проводков" (avrdude не поймет "пять проводков" (остальное должна понять)))) который подключен к порту который называется COM3 (-P COM3) (если называется по другому то в команду надо вписать соответствующее название). blink.hex - это название откомпилированного файла который надо загрузить в микроконтроллер. При этом в данной программе не прописана установка фьюзов и считается что микроконтроллер либо новый с завод и на нем установлены фьюзы по молчанию либо фьюзы ранее были установлены как надо и менять их не требуется. Если hex файл успешно запишется то светодиод должен замигать!

КАРТА БЛОГА (содержание)

суббота, 28 декабря 2019 г.

Светодиодная RGB ёлочка

Наиболее простым проектом который можно реализовать на ардуине является мигание светодиодом. Однако если светодиод не один то проект уже становиться сложнее а если светодиодов больше чем пинов ардуины то появляется проблема которую можно решить применением микросхем - регистров например 74HC373D (или каких либо других). Через регистры можно ардуиной управлять большим количеством светодиодов. Используя например arduino mini и цветные светодиоды можно смастерить например новогоднюю RGB ёлочку например по схеме:
Рисунок 1 - Схема светодиодной RGB ёлочки
Для того чтобы было проще организовать управление светодиодами без необходимости прописывать каждый раз все состояния светодиодов вручную и при этом иметь компактный размер массива для того чтобы он мог уместиться во флеш памяти микроконтроллера ардуины, была написана браузерная программа которая генерирует скетчь на основе графического представления требуемой анимации в её интерфейсе. Данная программа приведена внизу данной страницы. Посмотреть проверку разноцветной светодиодной ёлочки можно на видео:
Теперь небольшая инструкция пользователя для данной программы:
1) нажатием на кнопки расположенные в соответствии со светодиодами ёлочки можно менять их цвета. Цветов имеется 7 штук у каждой кнопки. Цвет кнопки будет примерно соответствовать цвету светодиода.
2) нажатием цветных кнопок можно сформировать кадр
3) нажатием кнопок с цифрами можно менять кадры
4) после нажатия кнопки "создать скетчь" должен сгенерироваться скетчь в текстовом поле под данной кнопкой. Сгенерированный скетчь можно подкорректировать, например поменять задержки. 
5) после того как скетчь сгенерировался и появился в текстовом поле можно нажимать кнопку "сохранить скетчь". После нажатия этой кнопки скетчь сохраниться на компьютере, его можно будет откомпилировать и загрузить в ардуино через Arduino IDE которое должно открыться с данным скетчем после двойного клика левой кнопкой мыши по нему. Если после двойного клика левой кнопкой мыши по иконке данного скетча, появляется окно предлагающее создать папку для него то надо согласиться путем нажатия соответствующей кнопки в окне.
6) Если программа не заработает то возможно что следует поменять браузер (программа проверялась в браузере Google Chrome) или разрешить ему javascript в настройках (если он запрещён).




кадр анимации ёлочки
номер кадра

КАРТА БЛОГА (содержание)

суббота, 30 декабря 2017 г.

Мигающая гирлянда из обычной

Для того чтобы "превратить" обычную гирлянду с лампочками в мигающую можно использовать простое устройство состоящее из симисторного ключа и мультивибратора на таймере 555:
Рисунок 1 - Мигалка

Эта схема почти ни чем не отличается от той что приведена в статье http://electe.blogspot.ru/2015/12/blog-post.html за исключением того что немного изменена частотозадающая rc цепь, а именно увеличена её постоянная времени путём увеличения сопротивления подстроечного резистора R3. Также эту постоянную времени можно менять путём изменения ёмкости конденсатора C1. Рассчитать RC цепь или задержки ею создаваемые можно в программе на странице http://electe.blogspot.ru/2014/01/555.html.
Посмотреть результат работы мигалки можно на видео:

Некоторые детали для данной схемы
симистор BT139 http://got.by/25gr95, http://got.by/25gre7
оптрон moc3041 http://got.by/25grnj, http://got.by/25grr8
таймер 555 http://got.by/25grzl, http://got.by/25gs60

КАРТА БЛОГА (содержание)

суббота, 22 марта 2014 г.

Управляемый мультивибратор на элементах И-НЕ

В предыдущей статье рассматривался мультивибратор на элементах "НЕ" способный выдавать прямоугольные импульсы с крутыми фронтами и спадами. Прервать генерацию импульсов в мультивибраторе на элементах "НЕ" можно например убрав питание с микросхемы, это не самый лучший способ. Если вместо элементов "НЕ" использовать элементы "И-НЕ" то мультивибратор можно сделать управляемым через один из выводов какого либо элемента "И-НЕ" этого мультивибратора. Если управление мультивибратором не требуется то можно делать так ка на схеме:
Рисунок 1 - Мультивибратор на микросхеме CD4011

Между выводом 4 и землёй можно, кроме светодиода с резистором, подключать другие подходящие нагрузки. Изменять частоту импульсов можно изменением ёмкости C1 и сопротивления R1, скважность равна двум. Мультивибратор с запретом генерации можно сделать например так:

Рисунок 2 - Мультивибратор с запретом генерации

Если один из выводов одного из элементов "И-НЕ" распараллелить то при подаче на этот вывод логического нуля генерации не будет а при подаче логической единицы генерация будет. Мультивибратор с разрешением генерации можно сделать например так:
Рисунок 3 - Мультивибратор с разрешением генерации

Мультивибратор на элементах "И-НЕ" может выдавать импульсы с высокой частотой поэтому такие мультивибраторы можно использовать для генерации звуков (или даже радиосигналов):
Рисунок 4 - Мультивибратор с пьезодинамиком

Электромагнитный динамик вместо пьезодинамика в данную схему лучше не ставить т.к. у обмоток электромагнитных динамиков слишком низкие сопротивления для того чтобы микросхема смогла, без перегрева (и выхода из строя), пропустить достаточно большой ток. Работает данный мультивибратор аналогично тому как работает мультивибратор с элементами "НЕ":
Рисунок 5 - Принцип работы мультивибратора на логических элементах "НЕ"

Длительность импульса tи, период T и частота F рассчитываются также:

Где Uп-напряжение питания, U0- низкое напряжение на входе элемента "не" при котором на выходе этого элемента появляется высокое напряжение уровня логической единицы, U1- высокое напряжение на входе элемента "не" при котором на выходе этого элемента появляется низкое напряжение уровня логического нуля.

Сборка данных схем не должна вызывать больших трудностей.




Вместо делителя на резисторе и кнопке управляющий вход мультивибратора можно соединить с выходом микроконтроллера или другой логической микросхемы если они совместимы по логическим уровням и микросхемой на которой делается мультивибратор. На микросхеме CD4011 можно сделать два мультивибратора.
Для расчёта можно воспользоваться программой:

R1=
C1=
U0=В
U1=В
Uп=В

Длительность импульса tи=
Период T=
Частота f=
Другие мультивибраторы:
мультивибратор на транзисторах,
симметричный мультивибратор на операционном усилителе,
несимметричный мультивибратор на операционном усилителе,
мультивибратор на микросхеме-таймере NE555 (LM555),
мультивибратор на элементах "не",
мультивибратор на реле.
КАРТА БЛОГА (содержание)

воскресенье, 16 марта 2014 г.

Мультивибратор на элементах "не".

Мультивибратор можно сделать на логических элементах "не". Импульсы создаваемые таким мультивибратором будут иметь крутые фронты и спады. Такой мультивибратор может быть высокочастотным. Элементы "не" есть в микросхеме 4049. На этой микросхеме можно сделать светодиодную мигалку с мультивибратором на элементах "не":
Рисунок 1 - Светодиодная мигалка на микросхеме 4049

На этой микросхеме можно сделать три таких мигалки. Изменяя сопротивление резистора R1 и/или емкость конденсатора можно изменять и частоту. Длительность импульса tи будет равна длительности паузы. Длительность импульса tи, период T и частоту F колебаний можно примерно найти по формулам:
Где Uп-напряжение питания, U0- низкое напряжение на входе элемента "не" при котором на выходе этого элемента появляется высокое напряжение уровня логической единицы, U1- высокое напряжение на входе элемента "не" при котором на выходе этого элемента появляется низкое напряжение уровня логического нуля. Если представить элемент "не" в виде реле то упрощённо процесс работы данного мультивибратора можно представить так:
Рисунок 2 - Процесс работы мультивибратора на логических элементах "не"

Красный обозначает высокий потенциал, синий - низкий.
Если мультивибратор может быть высокочастотным то его можно использовать в генераторах звуков (или даже радиосигналов) :
Рисунок 3 - Генератор звука на микросхеме 4049

Сборка данных схем не должна вызывать больших трудностей.

Данный мультивибратор можно использовать как тактовый генератор для микроконтроллеров. Например если нужен тактовый генератор для восстановления работоспособности микроконтроллера avr после неправильной установки фьюзов.
Для расчёта можно воспользоваться программой:
R1=
C1=
U0=В
U1=В
Uп=В

Длительность импульса tи=
Период T=
Частота f=

Другие мультивибраторы:
мультивибратор на транзисторах,
симметричный мультивибратор на операционном усилителе,
несимметричный мультивибратор на операционном усилителе,
мультивибратор на микросхеме-таймере NE555 (LM555),
управляемый мультивибратор на элементах "и-не",
мультивибратор на реле.