Измерение напряжения attiny13: Миниатюрный вольтметр на микроконтроллере ATtiny13

Содержание

Миниатюрный вольтметр на микроконтроллере ATtiny13

Причиной, побудившей разработать этот прибор, стала необходимость создать компактный вольтметр из деталей, находившихся в определенный момент времени под рукой.

Принципиальная схема

Его я собрал из микроконтроллера ATtiny13-20SU и дешифратора К176ИД2 по схеме, изображённой на рис. 1. Прибор из меряет постоянное напряжение Uх положительной полярности от 0 до 99,9 В, отображая результат на трёхразрядном семиэлементном светодиодном индикаторе HG1 с общими катодами разрядов.

Рис. 1. Принципиальная схема вольтметра на микроконтроллере ATtiny13.

Если входное напряжение превышает 99,9 В, начинает мигать символ 0 во втором разряде индикатора. Остальные два разряда при этом погашены.

При измерении напряжения менее 1 В разряды единиц и десятков вольт погашены программно. Программа для микроконтроллера написана на языке ассемблера в среде разработки AVR Studio 4.19.

Рис. 2. Готовый вольтметр на микроконтроллере.

В связи с недостаточным числом линий ввода-вывода у использованного микроконтроллера его вход RESET сконфигурирован как вход АЦП ADC0, куда и подано через резистивный делитель R1R2 и фильтр R3C2 измеряемое напряжение.

Поэтому коды программы необходимо загружать в микроконтроллер в режиме параллельного или HVSP программирования. Схема подходящего программатора есть в [1], а управляющая им программа avrpp.exe и инструкции по её использованию — в архиве [2). Проверено, что программа работает под управлением 32-разрядной версии Windows 7.

Рис. 2. Схема параллельного программатора для AVR микроконтроллеров (elm-chan.org).

Однако для подключения программатора необходим компьютер с портом LPT, иначе в слот PCI нужно будет вставить контроллер такого порта.

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

Детали и печатная плата

Вольтметр смонтирован на печатной плате из фольгированного с одной стороны стеклотекстолита, чертёж которой показан на рис. 3. Основная часть деталей смонтирована на стороне печатных проводников, а подборный резистор R1, оксидный конденсатор C3 и светодиодный индикатор — на обратной стороне платы.

Рис. 3. Печатная плата для вольтметра на микроконтроллере.

Прежде чем монтировать микросхему DD2, нужно установить проволочную перемычку, одна из контактных площадок для которой будет закрыта корпусом дешифратора.

Печатная плата, прошивка, программа и драйвер  — Скачать.

M. Озолин, с. Красный Яр Томской обл. Радио-06-19.

Литература:

  1. AVR HVS Programmer. — elm-chan.org/works/avrx/report_e.html.
  2. AVRXTOOL32. — elm-chan.org.
  3. GIVEIO.SVS. — kernelchip.ru.

АмперВольтметр на attiny13 — Микроконтроллеры и Технологии

Дата публикации: .

Этот проект возник из любопытства – что мы можем сделать на таком маленьком микроконтроллере? Оказывается, много чего. В этом проекте микроконтроллер будет измерять напряжение, ток и температуру, пересчитывать их и выводить на ЖК дисплей формата 16×1.

Несмотря на необычные решения, и несколько недостатков, его также можно использовать как измеритель напряжения питания. Размеры печатной платы составляют 35 × 16 мм.

Дисплей использует 6 контактов, поэтому вывод RESET придется сконфигурировать как обычный порт ввода/вывода. Это следует делать ПОСЛЕ программирования. Измерение напряжения осуществляется с помощью резистивного делителя. Измерения в диапазоне от 0 до 99.9 В выполняются с точностью 0.1 В. Ток измеряется путем измерения падения напряжения на шунтирующем резисторе сопротивлением 0.1 Ом. Диапазон измерения составляет от 0 до 9.99 А, точность 0.01 А. Температура измеряется с помощью аналогового датчика LM35 в диапазоне от 0 до 99.9 °С с точностью 0.01 °С. В качестве о напряжения для АЦП используется внутренний источник опорного напряжения микроконтроллера ATtiny13, его напряжение составляет 1.1 В. Таким образом, для измерения тока нам не придется использовать операционный усилитель (и отрицательное напряжение питания для него), а вычисления становятся гораздо проще.

 

Такому простому устройству свойственны небольшие недостатки. Измерение происходит на тех же самых выводах, по которым передаются данные для ЖК-дисплея, а выводам дисплея требуется ток около 80 мкА, чтобы подтянуть их к земле. Резистор сопротивлением 100 Ом в резистивном делителе плохо справляется с этой функцией, и на нем остается около 7 мВ относительно земли. Эти 7 мВ просто вычитаются из результата измерений, из за чего возникает погрешность и результат измерений получается нелинейным. Эта погрешность наиболее сильно проявляется в диапазоне измеряемых напряжений от 0 до 5 В.

Помните, что для измерения больших токов и напряжений мощности шунтирующего и добавочного резисторов должны быть соответствующими. Устройство калибруется с помощью двух подстроечных потенциометров. Контраст ЖК дисплея не регулируется, он задан с помощью двух резисторов, получаемое напряжение равно приблизительно 1 В. Большинство ЖК дисплеев хорошо работают с этим напряжением, но при желании вы можете установить свое значение. Ток измеряется относительно шины земли. Земля источника питания соединяется с землей на плате. Шунтирующий резистор подключается между землей (на схеме GND) и входом -V. Если вы захотите запитать это устройство от источника измеряемого напряжения, просто подключите вход стабилизатора напряжения ко входу +V. Не забывайте, что максимальное напряжение, которое вы можете подать на вход стабилизатора 7805, составляет 30 В. Таким образом, если вы захотите измерять более высокие напряжения или измерять напряжение в диапазоне от 0 В, понадобится отдельный источник питания для устройства. В этом случае перережьте дорожку под потенциометром калибровки напряжения, измеряемое напряжение подключите к контакту +V, а затем подключите источник питания к контакту ZAS на плате.

Плата спроектирована так, чтобы разместить на ней стабилизатор 7805 в корпусе TO252, но на ней можно без проблем поставить микросхему 78L05 в корпусе TO92. Общий ток, потребляемый устройством, включая подсветку ЖК-дисплея, составляет около 30 мА, так что стабилизатора 78L05 вполне хватит.

Диапазон измеряемых напряжений : 0 — 99 Вольт, с дискретностью 0,1 Вольт

Диапазон измеряемого тока : 0 — 9,9 Ампер (С шунтом 0,1 Ом)

Диапазон измеряемых температур : 0 — 99° С, с дискретностью 0,1° С

Программирование: порт сброса (reset) микроконтроллера должен быть запрограммирован как обычный порт (fuse RSTDISBL). Внимание! При установке бита RSTDISBL=0, дальнейшее программирование микроконтроллера с помощью ISP будет невозможным. Восстановить заводскую конфигурацию микроконтроллера можно с помощью этого устройства. Остальные FUSE — биты по умолчанию.

В архив добавлен файл tiny13lcd_9_64-sample, это обновленная версия программы для микроконтроллера, производящая 64 измерения и отображающая их среднее значение.

Источник: elektroda.eu


Архив для статьи «АмперВольтметр на attiny13»
Описание:
Размер файла: 74.18 KB Количество загрузок: 5 949
Скачать

Схема. Вольтметр на микроконтроллере ATtiny2313

      Принцип работы вольтметра основан на методе преобразования измеряемого напряжения в частоту с помощью однократного интегрирования. Это позволяет, по сравнению с микроконтроллерами, имеющими встроенные десятиразрядные АЦП, получить большую разрешающую способность в широком интервале измеряемого напряжения. Подсчет частоты, переключение пределов и вывод результатов измерения на светодиодный индикатор осуществляет микроконтроллер. Он работает по программе, коды которой приведены в таблице.

:020000020000FC
:100000002FC0189518955AC11895E9C1ADC018951B
:100010001895189518951895189518951895189578

:06002000189518951895D3
:10006000F8944FED4DBF41E948B944274BBF4FEFDE
:1000700047BB4FEF48BB4FE341BB40E242BB4EEOC2
:1000800041BD9927442740936900409367004DBDC7
:100090004CBD40936A0042E049BF44E043BF40E0AA
:1000A00040936B0040E040936C0040E24093680056
:1000B00040EC4093700049EF4093710044EA409354
:1000C000720040EB4093730049E94093740042E9A9
:1000D0004093750042E84093760048EF40937700E4
:1000E00040E84093780040E94093790048E8409325
:1000F0007A0043E840937B0046EC40937C0041EA61
:1001000040937D0046E840937E004EE840937F0098
:10011000789440E84093610040EC4093620049E9E4
:100120004093630049EF409364004FEF40936900B0
:10013000409169004423E1F76BD102D00000FDCF6C
:1001400090FD089500916800002309F00895F89447
:100150001FB69160002708BF0AE809BF02E00EBD84
:1001600095981FBE78940895A8951FB60F931F9376
:100170002F933F934F935F93AF93BF93209168006A
:10018000222319F02A9520936800209169002223E8
:1001900019F02A952093690020916A0088942E33E3
:1001A00038F4239520936A002FEF209360000DC050
:1001B00088942A3738F4239520936A0022272093C5
:1001C000600003C0222720936A0004E011E0BB27EF
:1001D000A1E622B3207F212B22BB3D9140916700F5
:1001E000342B38BB54E04FEF4A9544230000000005
:1001F000D9F75A955523B9F7110F0A95002349F7F6
:100200002FEF28BB22B3207F22BBBF91AF915F911C
:100210004F913F912F911F910F911FBE18951FB6BF
:1002200088249924AA24BB240091650010916600BB
:10023000202F312F8894084E134020FOB394202FA4
:10024000312FF9CF8894022F132F0446104020F04D
:10025000A394202F312FF9CF8894022F132F0A4017
:10026000104020F09394202F312FF9CF8894022F43
:10027000132F802EBB27A1E6FF27E0E7E80D0081C2
:100280000D93E0E7E90D00810D93E0E7EA0D0081B1
:100290000D93E0E7EB0D00818894003C11F491FD93
:1002A0000FEF0C9392FB26F000270093670004C029
:1002B00000916000009367001FBE08951FB68F92E3
:1002C0009F92AF92BF920F93lF932F933F934F93Al
:1002D0005F93AF93BF93EF93FF9300270EBD0DBDC8
:1002E0000CBD02E009BF959A0CE00093680004B5CC
:1002F00015B591FB4EF12FE037E28894200B310BBE
:10030000F8F09B7F20916B0027FF0EC0402F512FEC
:100310002F778894420B504018F0042F152F09C0F6
:1003200088940027112705C08894020F2227121FE6
:1003 300038F0009365001093660071DF77D03EC0FF
:100340008894949A92603AC024ED33E08894200B0C
:10035000310B20F094989D7F9B7F30C02FE037E2D7
:100360008894200B310B08F19B7F949A9260209126
:100370006C0027FF0EC0402F512F2F778894420B1F
:10038000504018F0042F152F09C08894002711271A
:1003900005C08894020F2227121F38F000936500D1
:1003A000109366003CDF42D009C0889494600FE04F
:1003B00017E2009365001093660031DF9E7FFF9186
:1003C000EF91BF91AF915F914F913F912F911F910D
:1003D0000F91BF90AF909F908F901FBE18951FB642
:1003E0000F9300270EBD0DBD0CBD0093650000935B
:1003F000660002E009BF0CE000936800959A0A9538
:100400000EDF9E7F0CE0009368000F911FBE1895D1
:100410004F93AF93BF934FEFBB27AlE64D934D93FF
:100420004D934C93BF91AF914F91089591FB36F04E
:10043000009164000F770093640005C00091630091
:080440000F770093630008959B
:00000001FF

      Схема устройства показана на рис. 1 Весь интервал измеряемого напряжения 0…99,99 В разбит на два участка — 0…9,999 и 10,00…99,99 В, которые переключаются автоматически Входное сопротивление на первом участке составляет 470 кОм, на втором — около 100 кОм, абсолютная погрешность измерения на первом участке составляет ±3 мВ. Напряжение питания вольтметра — 15…20 В, потребляемый ток — 60 мА. Период повторения измерений — 100 мс, максимальное время одного цикла преобразования при входном напряжении 9,999 В — 10 мс. При превышении измеряемым напряжением 99,99 В на индикаторе отображается число «9999», мигающее с частотой 2 Гц.

      Измерительная часть устройства состоит из интегратора, собранного на элементах DA1, R3, R4, С2, VT1, делителя напряжения на элементах R2, R5, VT2, компаратора напряжения DA3 и работает следующим образом. В момент запуска преобразования с линии порта PD5 (вывод 9) микроконтроллера DD1 на затвор транзистора VT1 поступает низкий логический уровень и он закрывается. В тот же момент программа записывает число 0x02 в управляющий регистр TCCR1B микроконтроллера DD1, что разрешает работу счетчика TCNT1 от импульсов с тактовой частотой контроллера, деленной на восемь, что составляет 1 МГц. Элементы DA1, R3, R4 образуют источник стабильного тока, от которого заряжается конденсатор С2. Компаратор DA3 сравнивает линейно нарастающее напряжение на этом конденсаторе с измеряемым (входным), поступающим на его неинвертирующий вход. Стабилитрон VD1 ограничивает напряжение на этом входе компаратора, защищая его от перегрузки.

      Как только нарастающее напряжение превысит измеряемое, на выходе компаратора DA3 установится низкий логический уровень. Спад сигнала на входе ISP (вывод 11) контроллера DD1 приведет к записи в регистр ICR1 содержимого счетного регистра TCNT1, запрос на прерывание по событию «захват» и вызов подпрограммы обработки прерывания. Если измеренное значение напряжения превысит 9,999 В, подачей высокого уровня на затвор транзистора VT2 с линии порта PD4 микроконтроллера DD1 будет включен резистивный делитель напряжения R2R5 Для исключения непрерывного переключения участков измерения на их границе программой предусмотрена зона гистерезиса шириной в 199 мВ.

    На точность измерения напряжения влияют, главным образом, такие факторы, как нелинейность стабилизатора тока на стабилизаторе DA1, задержка переключения и напряжение смещения нуля компаратора DA3, сопротивление сток—исток открытого транзистора VT1, ТКЕ конденсатора С2. На втором участке на погрешность влияет точность сопротивлений резисторов R2 и R5. Меньшее влияние оказывают температурный и временной дрейфы частоты кварцевого резонатора ZQ1. Все они заметно ухудшают точность измерения в интервале от 0 до 100 мВ. Нестабильности кварцевого резонатора ZQ1, стабилизатора DA1 и ТКЕ конденсатора С2 носят случайный характер поэтому программной компенсации не поддаются. Но погрешности, вносимые компаратором и полевым транзистором VT1, систематические, поэтому их можно скомпенсировать программным путем Для этого после каждого цикла измерения программа прибавляет к полученному значению константу, вычисляемую в процессе налаживания.

      В работе прибора возможна ситуация, при которой прерывание по «захвату» может не наступить. Например, если вход вольтметра соединен с общим проводом или измеряемое напряжение равно нулю, а смещение нуля компаратора DA3 таково, что на его выходе постоянно присутствует низкий логический уровень, то спада сигнала на входе ISP микроконтроллера DD1 не будет и возникнет прерывание по переполнению таймера TCNT1 вместо прерывания по событию «захват». В такой ситуации подпрограмма обработки прерывания по переполнению таймера TCNT1 присвоит измеренному значению нулевое значение.

      Конденсатор С7 установлен для подавления выброса напряжения при переключении компаратора DA3, что приводит к ложному возникновению прерывания по событию «захват» В этот момент счетный регистр TCNT1 пуст и на индикатор выводится значение «0,000». Однако подобный эффект наблюдался у компараторов только одной фирмы-производителя, и, скорее всего, установка конденсатора С7 не потребуется.
      Большинство деталей, за исключением индикаторов HG1, HG2, смонтированы на основной печатной плате из односторонне фольгированного стеклотекстолита толщиной 1,5 мм, чертеж которой показан на рис. 2, а вид смонтированной платы — на рис. 3 Светодиодные индикаторы монтируют на дополнительной монтажной плате и соединяют с основной изолированными проводами.

      Применены постоянные резисторы С2-23, Р1 -4, подстроечный — проволочный многооборотный СП5-2. Резисторы R2, R5 необходимо подобрать с допуском не более 0,5 %, причем резистор R2 можно составить из двух, соединенных последовательно Кроме того, сопротивления резисторов R2 и R5 могут немного отличаться от указанных на схеме, главное, чтобы выполнялось соотношение R2 R5=9 Оксидные конденсаторы — импортные конденсатор С2 — металлопленочный на напряжение 100 В, также импортный, от его ТКЕ зависит температурная стабильность вольтметра, поэтому применение керамических конденсаторов недопустимо. Отличные результаты дает применение конденсаторов серий К73-16, К73-17, однако они имеют большие габариты, что потребует доработки печатной платы. Конденсаторы С9, С10 — КД-2, С1, С4, С6—С8 — керамические для поверхностного монтажа типоразмера 0805.

      Микроконтроллер DD1 ATtiny2313-20РI можно заменить на AT90S2313 без каких-либо изменений в программе. При питании вольтметра напряжением, большим 15В. стабилизатор КР142ЕН5А необходимо заменить на L7805CV, который допускает работу при входном напряжении до 35 В. Кварцевый резонатор ZQ1 — РК374 или аналогичный импортный, его частота может лежать в диапазоне 7,5…8,5 МГц, точное значение 8 МГц не принципиально. Индикаторы HG1, HG2 — сдвоенные красного свечения с общим анодом, если применить аналогичные Е20362 зеленого свечения, необходимо уменьшить сопротивление резисторов R6—R13 до 100 Ом. Полевые транзисторы VT1, VT2 — любые n-канальные переключательные с изолированным затвором, рассчитанные на управляющие сигналы с ТТЛ уровнями и с сопротивлением канала открытого транзистора не более нескольких Ом. Транзисторы КТ3102А можно заменить на любые из этой серии либо заменить на транзисторы серии КТ503, подобрав экземпляры с коэффициентом передачи тока базы не менее 100. Стабилитрон VD1 — любой малогабаритный с напряжением стабилизации 12… 13 В и током утечки не более 10 мкА.

      Налаживание вольтметра заключается в установке резистором R3 тока зарядки конденсатора С2. Напряжение питания вольтметра может быть в интервале 15…20 В и не стабилизированным, что не влияет на точность измерения во время налаживания и последующей эксплуатации. На вход от внешнего источника подают стабилизированное напряжение в интервале 9…9,8 В, контролируемое образцовым вольтметром В качестве такого вольтметра желательно использовать модели которые могут измерять напряжение до 10 В с точностью в 1 мВ. Резистором R3 уравнивают показания налаживаемого и образцового вольтметров. Затем напряжение на входе уменьшают, добиваясь индикации минимального измеряемого напряжения. Здесь возможны два варианта: при нулевом напряжении на входе налаживаемый вольтметр будет показывать 4…50 мВ или же он покажет «0,000» раньше, чем напряжение на входе уменьшится до нуля. По этим результатам вычисляют константу. И в первом и во втором случаях она равна разности показаний. Но в первом случае ее необходимо вычитать из показаний вольтметра, а во втором — прибавлять к ним.

      Под константу в программе выделен 1 байт Старший разряд отводится под знак, поэтому максимальное число, на которое можно изменить показания вольтметра, равно 127. Если константу необходимо вычесть, в старший разряд байта записывают 1, если прибавить — 0. Предположим, вольтметр вместо нуля показывает 0,017 В. В двоичном коде число 17 выглядит как 00010001. Поскольку это число необходимо вычитать из показаний, в старший разряд запишем 1 и получим поправку 10010001 или 91 в шестнадцатеричной форме счисления. Эту константу следует записать в файл ATtiny2313.asm, а именно в строке 221 заменить значение 0x00 на 0x91

      Для компенсации показаний вольтметра при работе с делителем, когда измеряемое напряжение лежит в интервале 10,00…99,99 В, исходную константу, в нашем примере 17, необходимо разделить на 10 и округлить до целого значения (до 2), т. е. до 00000010. Добавив знак в старший разряд, получим 10000010, т. е 82 в шестнадцатеричной форме исчисления. Эту константу записывают в файле ATtiny2313.asm, заменив в строке 223 число 0x00 на 0x82 После внесения изменений в файл ATtiny2313.asm его необходимо заново откомпилировать и получившимся файлом ATtiny2313.hex перепрограммировать микроконтроллер В завершение настройки, подавая напряжение от внешнего источника в интервале 9…9,8 В, повторной подстройкой резистором R3 добиваются показаний вольтметра, идентичных эталонному вольтметру.
      При программировании микроконтроллера устанавливают его конфигурацию: SPMEN=1, DWEN=1, EESAVE=1, SPIEN=0, WDTON=1, BODLEVEL0…2=111, RSTDISBL=1, CKDIV8=1, CKOUT=1, SUT0,1 = 11. CKSEL0…3=1111, где 0 означает, что разряд запрограммирован, а 1 — нет.

Прилагаемые файлы:   vmeter3.zip

С. БЕЛЯЕВ, г. Тамбов
«Радио» №2 2010г.

Похожие статьи:
USB программатор микроконтроллеров AVR — AVR910
Частотомер на микроконтроллере
Миниатюрный вольтметр на микроконтроллере
Лабораторный блок питания на микроконтроллере
Преобразователь USB-COM-LPT на микроконтроллере
Бегущие огни на микроконтроллере АТ89С4051
Часы с термометром и барометром на микроконтроллере ATmega8
Автомат световых эффектов на микроконтроллере
Универсальный таймер на PIC-контроллере
Музыкальный звонок на микроконтроллере

Post Views: 4 549

Измерение напряжения питания микроконтроллера | RadioLaba.ru

            #include <P16F676.INC>

            LIST        p=16F676  

            __CONFIG    b’11111110000100′   ;Конфигурация микроконтроллера

                                              

            

Sec           equ         20h               ;регистры хранения временных данных для

Sec1          equ         21h               ;подпрограмм паузы

Sec2          equ         22h               ;

varLL         equ         24h               ;вспомогательные регистры подпрограммы

varLH         equ         25h               ;деления чисел

tmpLL         equ         26h               ;

rezLL         equ         2Dh               ;

rezLH         equ         2Eh               ;

shet          equ         23h               ;вспомогательные регистры подпрограммы

bcd1          equ         27h               ;преобразования двоичного числа в

bcd2          equ         28h               ;десятичное по разрядам

bcd3          equ         29h               ;

sotni         equ         2Ah               ;

desiat        equ         2Bh               ;

edin          equ         2Ch               ;

 

adr_ind       equ         30h               ;вспомогательные регистры для передачи

dat_ind       equ         31h               ;данных на цифровой индикатор

scetbit       equ         32h               ;

 

#DEFINE       acp_on      PORTA,2           ;линия включения источника опорного напряжения

#DEFINE       datai       PORTC,2           ;линия входа данных драйвера MAX7219

#DEFINE       cs          PORTC,1           ;линия выбора драйвера MAX7219

#DEFINE       clk         PORTC,0           ;линия тактирования драйвера MAX7219

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

              org         0000h             ;начать выполнение программы с адреса 0000h

              goto        Start             ;переход на метку Start

          

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Основная программа

                                              

Start         movlw       b’00000000′       ;Настройка выходных защелок порта A

              movwf       PORTA             ;

              movlw       b’00000010′       ;Настройка выходных защелок порта С

              movwf       PORTC             ;

              

              movlw       b’00000111′       ;выключение компараторов

              movwf       CMCON             ;

 

              bsf         STATUS,RP0        ;выбрать 1-й банк    

              movlw       b’11111011′       ;настройка линий ввода\вывода порта

              movwf       TRISA             ;

              movlw       b’11111000′       ;настройка линий ввода\вывода порта

              movwf       TRISC             ;

              movlw       b’01010000′       ;настройка времени преобразования АЦП (Fosc/16 = 4 мкс)

              movwf       ADCON1            ;

              movlw       b’00000001′       ;Настройка аналоговых/цифровых входов

              movwf       ANSEL             ;RA0 — аналоговый вход

              bcf         STATUS,RP0        ;выбрать 0-й банк  

 

              movlw       b’00000000′       ;Настройка модуля АЦП, канал AN0, левое выравнивание,

              movwf       ADCON0            ;источник опорного напряжения АЦП от линии питания

 

              call        init_lcd          ;вызов подпрограммы инициализации цифрового индикатора

 

Start_1       call        battery           ;вызов подпрограммы измерения и расчета величины напряжения

              call        vivod             ;вызов пожпрограммы вывода значения напряжения на индикаторы

              call        pause             ;вызов подпрограммы паузы 2 секунды

              goto        Start_1           ;переход на метку Start_1

 

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

vivod         movlw       0x08              ;очистка 8-го индикатора

              movwf       adr_ind           ;

              movlw       0x0F              ;

              movwf       dat_ind           ;

              call        send              ;

              movlw       0x07              ;очистка 7-го индикатора

              movwf       adr_ind           ;

              movlw       0x0F              ;

              movwf       dat_ind           ;

              call        send              ;

              movlw       0x06              ;очистка 6-го индикатора

              movwf       adr_ind           ;

              movlw       0x0F              ;

              movwf       dat_ind           ;

              call        send              ;

              movlw       0x05              ;очистка 5-го индикатора

              movwf       adr_ind           ;

              movlw       0x0F              ;

              movwf       dat_ind           ;

              call        send              ;

              movlw       0x04              ;очистка 4-го индикатора

              movwf       adr_ind           ;

              movlw       0x0F              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x03              ;вывод значения регистра sotni на 3-й индикатор

              movwf       adr_ind           ;целая часть величины напряжения

              movf        sotni,W           ;

              movwf       dat_ind           ;

              bsf         dat_ind,7         ;установка десятичного знака

              call        send              ;

              movlw       0x02              ;вывод значения регистра desiat на 2-й индикатор

              movwf       adr_ind           ;дробная часть величины напряжения, первая цифра

              movf        desiat,W          ;после запятой

              movwf       dat_ind           ;

              call        send              ;

              movlw       0x01              ;вывод значения регистра edin на 1-й индикатор

              movwf       adr_ind           ;дробная часть величины напряжения, вторая цифра

              movf        edin,W            ;после запятой

              movwf       dat_ind           ;

              call        send              ;

              return

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

battery       bsf         acp_on            ;включение источника опорного напряжения (TL431)

              bsf         ADCON0,ADON       ;включение модуля АЦП

              call        pause             ;вызов подпрограммы паузы 2 секунды

              bsf         ADCON0,GO_DONE    ;установка бита GO_DONE, запуск преобразования АЦП

      

batt_1        btfsc       ADCON0,GO_DONE    ;опрос бита GO_DONE

              goto        batt_1            ;бит GO_DONE не равен 0, преобразование не

                                            ;закончено, переход на метку batt_1

              movf        ADRESH,W          ;преобразование закончено, копирование значения

              movwf       tmpLL             ;в регистр tmpLL

 

              bcf         acp_on            ;выключение источника опорного напряжения (TL431)

              bcf         ADCON0,ADON       ;выключение модуля АЦП

 

              movlw       .7                ;запись числа 62475 в регистры varLH, varLL для

              movwf       varLL             ;последующего деления

              movlw       .248              ;

              movwf       varLH             ;

              call        del               ;вызов подпрограммы деления числа 62475 на результат преобразования АЦП

              call        bin2bcd           ;вызов подпрограммы преобразования двоичного числа в десятичное по разрядам

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма деления двухбайтного числа на однобайтное (varLH, varLL):(tmpLL)

;Результат деления в регистре rezLH, rezLL, деление целочисленное без дробной части

;на ноль делить нельзя, произойдет выход из подпрограммы без изменений

 

del           clrf         rezLL            ;очистка регистров rezLL, rezLH (эквивалентно записи нуля)

              clrf         rezLH            ;

              movlw        .0               ;проверка равенства нулю числа лежащего в регистре tmpLL

              xorwf        tmpLL,W          ;(на ноль делить нельзя)

              btfsc        STATUS,Z         ;

              return                        ;число в регистре tmpLL равно нулю: выход из подпрограммы

                                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

d1            movf         tmpLL,W          ;число в tmpLL не равно нулю: вычитаем число лежащее в регистре

              subwf        varLL,F          ;tmpLL из числа в регистрах varLH, varLL: это операция вычитания

              btfsc        STATUS,C         ;однобайтного числа из двухбайтного

              goto         d2               ;при отрицательном результате происходит выход из подпрограммы

              movlw        .1               ;при положительном результате инкрементируем счетчик вычитаний

              subwf        varLH,F          ;переходя на метку d2

              btfss        STATUS,C         ;

              return                        ;

                                            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

d2            incfsz       rezLL,F          ;инкремент rezLL с проверкой на переполнение      

              goto         d1               ;нет переполнения rezLL: переход на метку d1

              incf         rezLH,F          ;переполнение rezLL: инкремент регистра rezLH (регистры rezLL, rezLH  

                                            ;выступают в качестве счетчика вычитания и содержат результат деления)

              goto         d1               ;переход на метку d1 для повторного вычитания, операция деления

                                            ;представляет собой многократное вычитание

                                          

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;                            

 

bin2bcd       movlw       .16               ;Подпрограмма преобразования двоичного числа

              movwf       shet              ;в десятичное

              clrf        bcd1              ;Двухбайтное число предварительно загружается

              clrf        bcd2              ;в регисты rezLH, rezLL

              clrf        bcd3              ;Результат преобразования:

              goto        bin2bcd_1         ;единицы в младшем полубайте bcd3

                                            ;десятки в старшем полубайте bcd3

adjdec        movlw       0x33              ;сотни в младшем полубайте bcd2

              addwf       bcd1,F            ;тысячи в старшем полубайте bcd2

              addwf       bcd2,F            ;десятки тысяч в младшем полубайте bcd1

              addwf       bcd3,F            ;

                                            ;

              movlw       0x03              ;

              btfss       bcd1,3            ;

              subwf       bcd1,F            ;

              btfss       bcd2,3            ;

              subwf       bcd2,F            ;

              btfss       bcd3,3            ;

              subwf       bcd3,F            ;

                                            ;

              movlw       0x30              ;

              btfss       bcd1,7            ;

              subwf       bcd1,F            ;

              btfss       bcd2,7            ;

              subwf       bcd2,F            ;

              btfss       bcd3,7            ;

              subwf       bcd3,F            ;

                                            ;

bin2bcd_1     rlf         rezLL,F           ;

              rlf         rezLH,F           ;

              rlf         bcd3,F            ;

              rlf         bcd2,F            ;

              rlf         bcd1,F            ;

              decfsz      shet,F            ;

              goto        adjdec            ;

                                            ;

              movf        bcd3,W            ;копирование значения единиц из младшего

              andlw       b’00001111′       ;полубайта bcd3 в регистр edin

              movwf       edin              ;

              

              swapf       bcd3,W            ;копирование значения десятков из старшего

              andlw       b’00001111′       ;полубайта bcd3 в регистр desiat

              movwf       desiat            ;

 

              movf        bcd2,W            ;копирование значения сотен из младшего

              andlw       b’00001111′       ;полубайта bcd2 в регистр sotni

              movwf       sotni             ;

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма инициализации драйвера(MAX7219) цифрового табло

 

init_lcd      call        pauslcd           ;вызов подпрограммы паузы 2 мс

              movlw       0x0F              ;выключить тестовый режим

              movwf       adr_ind           ;

              movlw       0x00              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x0C              ;включение индикатора

              movwf       adr_ind           ;

              movlw       0x01              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x0A              ;интенсивность 15/32

              movwf       adr_ind           ;

              movlw       0x07              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x09              ;использовать BCD Code B для всех индикаторов

              movwf       adr_ind           ;

              movlw       0xFF              ;

              movwf       dat_ind           ;

              call        send              ;

 

              movlw       0x0B              ;использовать 8 индикаторов

              movwf       adr_ind           ;

              movlw       0x07              ;

              movwf       dat_ind           ;

              call        send              ;

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Подпрограмма отправки 2-х байт на драйвер (MAX7219) цифрового табло по пртоколу SPI

 

send          bcf         cs                ;Сбросить линию выбора драйвера CS

              movlw      .8                 ;Отправка содержимого адресного байта adr_ind

              movwf      scetbit            ;

povtor        bcf        clk                ;

              btfsc      adr_ind,7          ;

              bsf        datai              ;

              btfss      adr_ind,7          ;

              bcf        datai              ;

              bsf        clk                ;

              rlf        adr_ind,F          ;

              decfsz     scetbit,F          ;

              goto       povtor             ;

            

              movlw      .8                 ;Отправка содержимого байта данных dat_ind

              movwf      scetbit            ;

povtr1        bcf        clk                ;

              btfsc      dat_ind,7          ;

              bsf        datai              ;

              btfss      dat_ind,7          ;

              bcf        datai              ;

              bsf        clk                ;

              rlf        dat_ind,F          ;

              decfsz     scetbit,F          ;

              goto       povtr1             ;

              bcf        clk                ;

              bsf        cs                 ;установить в 1 линию выбора драйвера CS                

              return                        ;выход из подпрограммы

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

 

 

pauslcd       movlw       .4                ;подпрограмма пауза 2 мс

              movwf       Sec1              ;

p_l2          movlw       .166              ;

              movwf       Sec               ;

p_l1          decfsz      Sec,F             ;

              goto        p_l1              ;

              decfsz      Sec1,F            ;

              goto        p_l2              ;

              return                        ;выход из подпрограммы

 

pause         movlw       .11               ;

              movwf       Sec2              ;

p_3           movlw       .255              ;подпрограмма пауза 2 сек

              movwf       Sec1              ;

p_1           movlw       .255              ;

              movwf       Sec               ;

p_2           decfsz      Sec,F             ;

              goto        p_2               ;

              decfsz      Sec1,F            ;

              goto        p_1               ;

              decfsz      Sec2,F            ;

              goto        p_3               ;

              return                        ;выход из подпрограммы

                          

              end                           ;конец всей программы

                                            ;

Вольтметр(амперметр)на микроконтроллере Attiny2313 / Микроконтроллеры / Блоги по электронике

Предлагаю вашему вниманию конструкцию цифрового вольтметра, который также может быть переделан в амперметр. Схема была взята из журнала Радио №2 за 2010 год. Схема представлена на рисунке

Вольтметр предназначен для измерения напряжения до 0-99,99 в, этот интервал разбит на два участка – 0-9,999в и 10-99,99 в. Переключение с одного диапазона на другой –автоматическое. Входное сопротивление на первом участке – 470 кОм, на втором – около 100 кОм, абсолютная погрешность измерения на первом участке составляет ±3мв, напряжение питания – 15-20 в, потребляемый ток – 60мА(зависит от примененного семисегментного индикатора). Период повторения измерения – 100мс, максимальное время одного цикла преобразования при входном напряжении 9,999 в – 10мс. При превышении измеряемым напряжением 99,99 в на индикаторе отображается число «9999», которое мигает с частотой 2Гц. Полярность входного напряжения — положительная.
Принцип работы вольтметра основан на методе преобразования измеряемого напряжения в частоту с помощью однократного интегрирования. Это позволяет по сравнению с микроконтроллерами, имеющими встроенные десятиразрядные АЦП, получить большую разрешающую способность в широком интервале измеряемого напряжения. Подсчет частоты, переключение пределов и вывод результатов измерения на светодиодный индикатор осуществляет микроконтроллер. Подробное описание работы можно прочитать в статье, в прилагаемом файле, так же исходный код и файл прошивки
depositfiles.com/files/9p9spo2oo
Теперь про доработку этого вольтметра. Резистор делителя напряжения R2 я сделал составным – резистор ПТМН – 0,5Вт 100кОм, ±0,25% и последовательно с ним многооборотный подстроечный СП5-2 на 22 кОм, резистор R5 поставил подстроечный СП3-39А на 15 кОм. Это было сделано для точного подбора сопротивления делителя напряжения при настройке вольтметра.
Вольтметр собран на печатной плате. Плата была перерисована из статьи в программе sprint layout, файл печатки прилагается ниже
depositfiles.com/files/rsbo4oebv
а вот печатка для SMD компонентов
depositfiles.com/files/zi6xq8x7f
Микроконтроллер прошивался при помощи программатора STK 200/300, в программе CodeVisionAVR.
Фьюзы для CodeVisionAVR

Фьюзы для Pony Prog

Питается вольтметр от трансформаторного блока питания с стабилизатором напряжения на микросхеме 7815, собранном по типовой схеме. Блок питания собран на печатной плате, так же на плате находится составной резистор R2 и R5. Файл печатной платы ниже.
depositfiles.com/files/nsaa4kzkj
Фото основной платы вольтметра


Фото блока питания


И теперь все в сборе

Настройка вольтметра заключается в установке резистором R3 тока зарядки конденсатора C2 и подбор сопротивления делителя напряжения. Предварительно делитель подстроечными резисторами настраивается – резистор R2 на сопротивление 117 кОм, резистор R5 на сопротивление 13 кОм. На вход прибора подают стабилизированное напряжение в интервале 9…9.8 в, контролируя образцовым вольтметром. Резистором R3 уравнивают показания налаживаемого и образцового вольтметров. Увеличивают напряжение до тех пор, пока вольтметр не переключится на второй диапазон измерений. Если показания вольтметра «зависли» при этом, то резисторами R2 и R5 добиваются переключения вольтметра на второй диапазон, после этого нужно повторить регулировку резистором R3. Подают на вольтметр максимально возможное напряжение до 100 в и резисторами R2 и R5 корректируют показания. Далее подают на вход от 5 до 10 в и при необходимости корректируют показания резистором R3. Проверяется показания вольтметра во всем диапазоне.
Фото показаний вольтметра на первом диапазоне и образцового прибора Щ301-1.

Фото показаний вольтметра на втором диапазоне и образцового прибора Щ301-1.

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

Показания могут лежать в диапазоне от 0,00 до 99,99А.
Децимальная точка зафиксирована, старший разряд при показаниях, меньших 10А не горит.
Делитель изъят, вместо С4 стоит танталовый конденсатор К53-4 6,8мкФ — для усреднения. В сток транзистора VT1 добавил резистор 1ом, ёмкость-то большая, хоть немного ограничивает пиковый ток разряда.
Для имеющегося шунта необходимо пересчитать ёмкость С2: Сх=(Uпоказ./Uшунт)*С2, где Сх, мкФ — искомая ёмкость конденсатора, Uпоказ., мВ — требуемое максимальное показание амперметра, Uшунт, мВ — напряжение на шунте, соответствующее максимальному измеряемому току, С2 — 2,2мкФ. Пусть на шунте падает 300мВ. Для 10А получается: (1000/300)*2,2 = 7,33 мкФ. Ёмкость лучше округлить в большую сторону, до 8,2мкФ. Номинал резистора R4 придется подобрать, он будет меньше, чем в исходной схеме. Немного измененная прошивка прилагается ниже (так же и исход)
depositfiles.com/files/r753yeofl
Ну вот и все! Оценивайте, комментируйте, критикуйте!

ИЗМЕРИТЕЛЬ НАПРЯЖЕНИЯ, ТОКА И ТЕМПЕРАТУРЫ

   Что можно сделать на основе небольшого микроконтроллера Attiny13? Много чего. Например измеритель напряжения, тока, температуры, с выводом результатов на дисплей типа HD44780. Так давайте и соберём это универсальное устройство, которое можно успешно использовать в качестве модуля в блоках питания, зарядках, УМЗЧ и в тех местах, где не требуется очень высокая точность. Размер платы всего 35 х 16 мм.

Схема измерителя U, I, T на Attiny13

  • Диапазон измерения напряжения 0-99V с разрешением 0.1 V.
  • Диапазон измерения тока 0-9.99А с разрешением 10 мА.
  • Диапазон измерения температуры 0-99C с разрешением 0.1C.
  • Потребление тока самого измерителя 35 мА.

   Прежде всего надо знать, в каком диапазоне напряжения прибор будет работать. Чтобы это установить, необходимо рассчитать делитель напряжения. Например, для получения измерения 10 В, делитель должен составлять 1/10 (мы умножаем x 10 потому что напряжение будет в 10 раз больше от базового 1 В), для 30 В будет 1/30 и так далее. Затем необходимо настроить программу, для данного диапазона. Эти 30 В умножаем по 640, а результат разделим на 1023. Полученное число приблизительно записывается в начале программы, постоянной напряжения и надо скомпилировать программу (для диапазона 100 В, 8,2к).

   Измерение тока также мы можем настроить подобным образом, дать другой делитель, другой диапазон, и перечислить, но не буду этого описывать. Здесь нет аналоговой калибровки температуры, потому что она показалась совершенно лишней.

   Температуру корректируем экспериментально в программе, за это отвечает константа const temp. Резистор 1К между массой и выходом датчика устанавливает напряжение, снизить его можно даже до 100 Ом.

Как работает схема

   К точкам V и V+ на плате приложено напряжение, которое мы хотим измерить, к точке GND присоединяемся входом массы блока питания, а к точке В — выход массы (измерение происходит на массе). Между точками GND и V — присоединяется шунт. Питание измерителя осуществляется от точки V и V+ через стабилизатор 7805. На плате есть место на стабилизатор в корпусе TO252, но с успехом можно использовать и более крупный стабилизатор 78L05 в корпусе TO92. Максимальное напряжение, которое можно указать для точки V и V+, для обычной 7805 будет до 35В, для 78L05 будет, конечно, меньше, но не больше 30. Для того, чтобы измерять большие напряжения, чип необходимо пополнить отдельно — на стороне печати, следует прервать путь под потенциометром регулировки напряжения, а питание подать до точки А. Система работает с дисплеем 16х1 с контроллером HD44780 или 16х2.

Видео работы измерителя

   При прошивке микроконтроллера необходимо задать pin reset как обычный pin (включить fusebit RSTDISBL). Перед выполнением этой операции убедитесь, что все хорошо установили, что после выключения сбрасывается, и нет доступа к процессору обычным программатором! Исходники, а также вся остальная документация и файлы, размещены в общем архиве.

Originally posted 2018-10-18 06:43:49. Republished by Blog Post Promoter

Миниатюрный генератор импульсов на ATtiny13

Данная схема может генерировать различные последовательности импульсов с регулируемой частотой. Основа схемы – микроконтроллер ATtiny13. Этот компактный микроконтроллер AVR имеет пять внешних контактов ввода / вывода.

Цифровой мультиметр AN8009

Большой ЖК-дисплей с подсветкой, 9999 отсчетов, измерение TrueRMS…

В данной схеме три из них (PB0, PB1 и PB2) используются в качестве выходных контактов, а два вывода (PB3 и PB4) используются как входы аналого-цифрового преобразователя.

Переключатели Select1… Select3 и делитель напряжения на резисторах R5, R6, R7, R8, Rl3 и R14 используются для установки напряжения на входе АЦП (PB4), который позволяет выбрать один из семи режимов генерации сигналов, заложенных в программном обеспечении микроконтроллера.


Частота следования импульсов изменяется напряжением на входе АЦА (PB3), которое можно регулировать с помощью потенциометра R11. Регулировка позволяет покрыть диапазон частоты от 290 Гц до приблизительно 8 кГц. Ниже на временных диаграммах показаны последовательности импульсов, генерируемые в режимах от 0 до 6:

  • Режимы 1 и 2: неперекрывающиеся импульсы с регулируемой частотой (нормальный или инвертированный режим)
  • Режимы 2 и 3: полностью перекрывающиеся импульсы с регулируемой частотой (нормальный или инвертированный режим)
  • Режимы 4 и 5: частично перекрывающиеся импульсы с регулируемой частотой (нормальный или инвертированный режим)
  • Режим 6: трехразрядный двоичный счетчик с регулируемой частотой
  • Режим 7 — это особый режим, в котором сигналы ШИМ с частотой 2300 Гц выводятся на выводы PB0 и PB1. Сигнал на выводе PB1 — сигнал ШИМ, который периодически нарастает от 0 до 100% (0–255) и снова спадает с частотой повторения приблизительно 0,5 Гц. Сигналом на выводе PB0 можно управлять с помощью потенциометра R11.

Микроконтроллер ATtinyl3 работает от внутреннего RC-генератора на частоте 4,8 МГц. При программировании фьюзы должны быть настроены следующим образом:

Скачать прошивку (649 bytes, скачано: 113)

HILDA — электрическая дрель

Многофункциональный электрический инструмент способн…

Более 100 проектов на ATtiny13 | Лукаш Подкалицки

ATtiny13 — мой любимый крошечный uC. Поэтому я решил спроектировать и собрать более 100 проектов на основе этого чипа. Почему мне нравится ATtiny13?

  • Расширенная архитектура RISC (до 1MIPS / 1 МГц, простой в освоении Ассемблер — всего 120 инструкций)
  • совместим по выводам с серией ATtiny * 5, поэтому, если 1 Кбайт флэш-памяти и / или 64 байта ОЗУ окажутся слишком ограниченными, их легко заменить до 8 Кбайт без изменения макета
  • диапазон рабочего напряжения (1.От 8 В до 5,5 В) и промышленный диапазон температур (от -40 ° C до + 85 ° C)
  • базовых периферийных функций, таких как таймер, 4-канальный АЦП, сторожевой таймер или аналоговый компаратор
  • Компилятор AVR-GCC и многие другие бесплатные инструменты разработчика с открытым исходным кодом
  • очень-очень низкая цена за такую ​​вычислительную мощность!

Вот руководство по ATtiny13, плата разработки ATtiny13, небольшие руководства о том, как скомпилировать и записать код в ATtiny13 (ANSI C) и как установить ассемблер AVR (AVRA) в Linux.

Проектов

[001] ATtiny13 — мигает с функцией задержки.
[002] ATtiny13 — мигает светодиод с функцией задержки (программная ШИМ)
[003] ATtiny13 — случайным образом мигает светодиод с ГПСЧ на основе LFSR
[004] ATtiny13 — мигает с таймером OVF ( Overflow)
[005] ATtiny13 — мигает со сторожевым таймером
[006] ATtiny13 — мигает с таймером COMPA
[007] ATtiny13 — тональный генератор
[008] ATtiny13 — программный UART (регистратор отладки)
[009] ATtiny13 — псевдослучайный номеров (облегченная библиотека)
[010] ATtiny13 — управление светодиодной RGB-подсветкой (необычные световые эффекты)
[011] ATtiny13 — ИК-пульт для управления светодиодами (протокол NEC)
[012] ATtiny13 — ИК-пульт для управления светодиодной RGB-подсветкой (протокол NEC)
[013] ATtiny13 — ИК-приемник / протоанализатор NEC
[014] ATtiny13 — Лучшая температура в помещении на DS18B20
[015] ATtiny13 — двухтональный сигнал тревоги
[016] ATtiny13 — цифровой вольтметр постоянного тока с MAX7219
[017] ATtiny13 — цифровой Амперметр постоянного тока с MAX7219
[018] ATtiny13 — танцевальные огни с FFT
[019] ATtiny13 — простой таймер на TM1637
[020] ATtiny13 — драйвер ШИМ светодиода питания
[021] ATtiny13 — простой текстовый интерфейс командной строки (интерфейс командной строки) через UART
[022] ATtiny13 — код Морзе (мигающий свет)
[023 ] ATtiny13 — индикатор уровня заряда батареи
[024] ATtiny13 — простой логический датчик
[026] ATtiny13 — дискотека с использованием БПФ
[028] ATtiny13 — бегущие цифры на TM1637
[029] ATtiny13 — регистратор температуры с использованием LM35 и программного обеспечения UART
[ 030] ATtiny13 — считывание температуры и влажности из DHT11
[031] ATtiny13 — аппаратный ШИМ
[032] ATtiny13 — бегущие точки и цифры на 7-сегментном светодиодном ламповом дисплее
[033] ATtiny13 — Светодиодная лента WS2812 — мигающий
[034] ATtiny13 — радуга на одиночном светодиоде WS2812
[035] ATtiny13 — радуга на нескольких светодиодах WS2812
[036] ATtiny13 — круговой нарезчик светодиодов WS2812
[037] ATtiny13 — PI (импульсный индукционный) металлоискатель
[040] ATtiny13 — случайное мерцание пикселей на матричном светодиодном дисплее 8 × 8
[043] ATtiny13 — мигание с функцией задержки (версия на ассемблере)
[044] ATtiny13 — мигание с таймером OVF (версия на ассемблере)
[045] ATtiny13 — мигание с таймером COMPA (версия на ассемблере)
[047] ATtiny13 — управление шаговым двигателем 28BYJ-48
[ 048] ATtiny13 — случайное мигание светодиода с ГПСЧ на основе BBS
[050] ATtiny13 — переключатель хлопка хлопка
[052] ATtiny13 — 8-битный моно усилитель класса D

План реализации составляет ~ 50%.Некоторые проекты находятся в стадии разработки, а некоторые готовы к публикации. Я буду обновлять эту страницу!

Список TODO

У вас есть идея для следующего проекта на ATtiny13? Отправьте тему проекта в комментарии или напишите мне! ([email protected])

  • одиночный светодиодный кристалл (шарлиплексирование)
  • двойные светодиодные кристаллы (шарлиплексирование)
  • тройной светодиодный кубик (шарлиплексирование)
  • Робот-следящий за линией
  • Робот для обхода препятствий
  • Детектор ЭМП
  • усовершенствованный 4-канальный переключатель тарелки
  • Пульт дистанционного управления Canon (разъем 2.5 мм)
  • Пульт ДУ Canon (инфракрасный RC6)
  • простой пульт дистанционного управления и 4-канальный приемник (инфракрасный порт: RC5 или NEC)
  • электронных игральных костей с использованием светодиодов WS2811
  • Счетчик импульсов
  • — счетчик импульсов TTL, 7-сегментный светодиодный модуль и кнопка сброса
  • Генератор импульсов
  • — простой генератор импульсов TTL
  • Матричная клавиатура
  • — однопроводная, АЦП
  • Ведомое устройство OneWire
  • контроллер умной настольной лампы
  • светильники дискотеки (модернизированная версия)
  • Металлоискатель ПИ
  • Выключатель хлопок-хлопок.

Общественные проекты

Учебники

Библиотеки

  1. attiny13-software-uart-library — Программная библиотека UART ATtiny13.
  2. attiny-random-library — 16-битная библиотека PRNG (генератор псевдослучайных чисел) ATtiny13 / 25/45/85, основанная на алгоритме Галуа LFSR.
  3. attiny-max7219-led-tube-display-library — 7-сегментный светодиодный ламповый дисплей для ATtiny13 / 25/45/85 (MAX7219 / MAX7221).
  4. attiny-max7219-matrix-8-led-display-library — Библиотека драйвера матричного светодиодного дисплея ATtiny13 / 25/45/85 8 × 8 (MAX7219 / MAX7221).
  5. attiny-74hc595-library — Библиотека регистров сдвига ATtiny13 / 25/45/85 74hc595.
  6. attiny-tm1638-library — это библиотека tinyAVR (ATtiny13, ATtiny25, ATtiny45, ATtiny85 и другие) для модулей светодиодных контроллеров на базе микросхемы TM1638.
  7. attiny-tm1637-library — TinyAVR — ATtiny13, ATtiny25, ATtiny45, ATtiny85 — библиотека для 7-сегментных дисплейных модулей на базе TM1637.
  8. attiny-ds18b20-library — это библиотека tinyAVR (ATtiny13, ATtiny25, ATtiny45, ATtiny85 и др.) Для датчика температуры DS18B20.
  9. attiny-onewire-library — это библиотека tinyAVR (ATtiny13, ATtiny25, ATtiny45, ATtiny85 и т. Д.) Для доступа к устройствам с использованием протокола OneWire (1-Wire).

ATtiny85 Электронная нагрузка — EasyEDA

TinyLoad — это простой электронный манекен постоянного тока. ATtiny измеряет напряжение, ток и температуру радиатора, рассчитывает мощность, энергию и емкость аккумулятора, управляет вентилятором и отображает все необходимые данные на OLED-экране.Кнопка используется для переключения между отображением мощности / сопротивления и отображения энергии / емкости.

Электронная схема управления нагрузкой, которая по существу состоит из потенциометра, операционного усилителя, полевого МОП-транзистора и шунтирующего резистора, обеспечивает протекание одинакового тока независимо от приложенного напряжения.

Для этого в цепи нагрузки расположен шунт 100 миллиом, состоящий из трех параллельно включенных резисторов по 300 миллиом для надлежащего отвода тепла, через который измеряется ток.Операционный усилитель LMV358 rail-to-rail сравнивает это значение с целевым значением, которое задается с помощью 10-виткового потенциометра 10 кОм и резистора 100 кОм, и, соответственно, управляет затвором полевого МОП-транзистора IRL540N с логическим уровнем, который, в свою очередь, регулирует ток через его внутреннее сопротивление, установленное таким образом. Ток, измеренный на шунте, также усиливается вторым операционным усилителем и измеряется АЦП ATtiny. Напряжение измеряется с помощью делителя напряжения. Температура полевого МОП-транзистора измеряется термистором 10k 3950B NTC.При необходимости вентилятор включается через полевой МОП-транзистор.

Измерения

Для наиболее точного измерения с максимальным разрешением измерения используются как напряжение питания 5 В, так и два внутренних опорных напряжения в соединении с АЦП ATtiny. Сначала измеряются напряжение питания и опорное напряжение 2,56 В с использованием опорного напряжения 1,1 В и вычисляются соответствующие калибровочные коэффициенты. Для каждого ожидающего измерения сначала проверяется, какой из трех источников напряжения (5 В, 2.56 В или 1,1 В) наиболее подходит. Затем он используется для измерения через АЦП. Для всех измерений АЦП ATtiny устанавливается в спящий режим, чтобы избежать шума, который генерируется MCU (устройство шумоподавления АЦП). Для дальнейшего увеличения разрешающей способности измерения последовательно выполняются 64 измерения (передискретизация), и измеренные значения суммируются. Усреднение выполняется только в конце дальнейших вычислений, чтобы не потерять разрешающую способность измерения. Точность измерения существенно зависит от точности внутреннего 1.Ссылка 1V. При необходимости его можно откалибровать вручную.

Точность определения энергии и емкости

Внутренний генератор ATtiny используется для определения энергии и электрического заряда (емкости). Точность внутреннего генератора составляет +/- 10% с заводской калибровкой. Его можно улучшить до +/- 2% или лучше с помощью ручной калибровки.

Реализация I²C OLED

Реализация протокола I²C основана на грубом методе передачи битов. Он был специально разработан для ограниченных ресурсов ATtiny10 и ATtiny13, но он также работает с некоторыми другими AVR (включая ATtiny25 / 45/85).Функции OLED адаптированы для модуля SSD1306 OLED, но их можно легко изменить для использования с другими модулями. В целях экономии ресурсов реализованы только основные функции, необходимые для этого приложения. Для получения подробной информации о принципе работы реализации I²C OLED посетите TinyOLEDdemo.

Компиляция и загрузка

При использовании Arduino IDE

  • Убедитесь, что вы установили ATtinyCore.
  • Перейдите в Инструменты -> Плата -> ATtinyCore и выберите ATtiny25 / 45/85 (без загрузчика) .
  • Перейдите к Tools и выберите следующие параметры платы:
    • Чип: ATtiny45 или 85 (в зависимости от вашего чипа)
    • Тактовая частота: 8 МГц (внутренняя)
    • Миллис / Микрос: отключено
    • B.O.D. Уровень: B.O.D. включен (2,7 В)
    • Остальное оставьте по умолчанию
  • Подключите программатор к компьютеру и к разъему ICSP на плате.
  • Перейдите в Инструменты -> Программист и выберите своего ISP-программатора (например,г. USBasp).
  • Перейдите к Инструменты -> Записать загрузчик , чтобы сжечь предохранители.
  • Откройте эскиз TinyLoad и нажмите Загрузить .

При использовании предварительно скомпилированного шестнадцатеричного файла

При использовании make-файла (Linux / Mac)

  • Убедитесь, что вы установили avr-gcc toolchain и avrdude.
  • Подключите программатор к компьютеру и к разъему ICSP устройства.
  • Откройте make-файл и замените чип, если вы не используете ATtiny85, и программатор, если вы не используете usbasp.
  • Откройте терминал.
  • Перейдите в папку с make-файлом и скетчем Arduino.
  • Выполните «make install» для компиляции, сожгите предохранители и загрузите прошивку.

Использование

  1. Поверните потенциометр против часовой стрелки до упора.
  2. Подключите устройство через разъем Micro-USB к источнику питания 5 В.
  3. Подключите тестовый источник питания к клемме блока. Обратите внимание на правильную полярность!
  4. Поверните потенциометр по часовой стрелке, чтобы выбрать желаемый ток нагрузки.

Калибровка

АЦП и внутренние опорные напряжения ATtiny делают все возможное, чтобы сделать tinyLoad довольно точным инструментом, но для этого может потребоваться небольшая калибровка. Как откалибровать:

  • Установите ULCAL и ILCAL на «1» в скетче, скомпилируйте и загрузите.
  • Выберите стабильное входное напряжение около 5 В и поворачивайте потенциометр, пока на дисплее не отобразится ток около 0,7 А. Измерьте напряжение и ток с помощью надежного мультиметра или хорошего лабораторного источника питания.
  • Рассчитайте калибровочные коэффициенты следующим образом:
    • ULCAL = напряжение, измеренное мультиметром / напряжение, отображаемое на OLED.
    • ILCAL = ток, измеренный мультиметром / ток, отображаемый на OLED.
  • Установите значение ULCAL и ILCAL в скетче, скомпилируйте и снова загрузите.

Меры предосторожности

  • Используйте хороший радиатор с вентилятором на 5 В для полевого МОП-транзистора!
  • Будьте осторожны с нагрузками большой мощности! Это устройство не зря называется tinyLoad!
  • Всегда поворачивайте POTI до упора против часовой стрелки перед подключением нагрузки!
  • Из-за входного напряжения смещения операционного усилителя минимальный ток нагрузки составляет 17 мА.Вы можете использовать операционный усилитель лучшего качества, например OPA2330 или OPA2333, если хотите.
  • Максимальный ток нагрузки составляет 4,5 А, однако для малых напряжений он может быть меньше.
  • Не превышайте максимальное напряжение 26В!
  1. ATtiny25 / 45/85 Лист данных
  2. LMV358 Лист данных
  3. IRL540N Лист данных

Эта работа находится под лицензией Creative Commons Attribution-ShareAlike 3.0 Unported License. (http: // creativecommons.org / licenses / by-sa / 3.0 /)

»Измерение VCC через запрещенную зону» JeeLabs

Все ATmega (и ATtiny в этом отношении) имеют 10-битный АЦП, который можно использовать для измерения аналоговых напряжений. Эти АЦП логометрические , что означает, что они измеряют относительно аналогового опорного напряжения (обычно VCC).

На 5В Arduino это означает, что вы можете измерять 0..5В как 0..1023, или примерно 5 мВ на шаг.

На JeeNode 3,3 В измерения от 0 до 3.3 В, или примерно 3,3 мВ на шаг.

Нет смысла подключать VCC к аналоговому входу и пытаться измерить его таким образом, потому что независимо от того, что вы делаете, показание АЦП будет 1023.

Итак, можем ли мы выяснить, при каком напряжении мы работаем? Это было бы очень полезно при разряженных батареях.

Что ж, в каждом ATmega / ATtiny есть «эталон запрещенной зоны», который по сути является эталоном напряжения 1,1 В. Если мы прочитаем это значение относительно для нашего VCC, тогда небольшая математика поможет:

  • Предположим, мы считываем значение АЦП «x», которое представляет 1.1В
  • с 5 В в качестве VCC, это значение будет около 1100/5000 * 1023 = 225
  • , тогда как при 3,3 В в качестве VCC мы ожидаем значение 1100/3300 * 1023 = 341
  • .
  • в целом, 1100 / VCC * 1023 = x
  • решая для VCC, получаем VCC = 1100 / x * 1023

Итак, все, что нам нужно сделать, это измерить эталонное напряжение запрещенной зоны 1,1 В, и мы сможем определить, что было за VCC!

К сожалению, Arduino analogRead () не поддерживает это, поэтому я создал этот демонстрационный набросок запрещенной зоны:

Пример вывода при запуске на JeeNode SMD в этом случае:

В коде vccRead () есть задержка, которая помогает стабилизировать измерение.Вот что происходит с vccRead (10) — то есть задержка 10 мкс вместо 250 мкс по умолчанию:

Как видите, совсем другие значения…

А вот результат для RBBB со старым чипом ATmega168, работающим при 5 В:

Я не знаю, ниже ли точность ширины запрещенной зоны 168, но, как вы можете видеть, эти цифры примерно на 10% ниже (напряжение питания, измеренное на моем мультиметре VC170, составило 5,12 В). IOW, точность запрещенной зоны невелика — как указано в таблице данных, где указано 1.0 .. 1,2 В при 25 ° C, когда VCC составляет 2,7 В. Также обратите внимание, что эталон запрещенной зоны требует 70 мкс для запуска, поэтому его нельзя сразу использовать при выходе из состояния пониженного энергопотребления.

Тем не менее, это может быть отличным способом предсказать состояние низкого заряда батареи до того, как ATmega или ATtiny начнет выдыхаться.

Программное обеспечение для прожектора с ATtiny13

Программное обеспечение для прожектора с ATtiny13 Путь: Дом => AVR-EN => Приложения => Spotlight ATtiny13 => Ассемблер Diese Seite на немецком языке:
Приложения AVR

Интенсивность и управление батареей с помощью ATtiny13
Исходный код ассемблера для прожектора

Исходный исходный код в формате asm находится здесь.
 
;
; *********************************
; * Прожектор с ATtiny13 *
; * (C) 2018 avr-asm-tutorial.net *
; *********************************
;
.nolist
.include "tn13adef.inc"; Определить устройство ATtiny13A
.список
;
; **********************************
; Д Е Б У Г З И Н Г С В И Т К Ч
; **********************************
;
; Это отлаживает управление светодиодом напряжения.
.equ debug_vtg = 0; 1 = напряжение отладки включено
  .if debug_vtg == 1; Установка параметров отладки
    .equ debug_voltage = 30000; Напряжение в мВ
    .endif
;
; Это устанавливает рабочее напряжение 15 Вольт.
.equ debug_15V = 0; 1 = Отладка рабочего напряжения 15 В
  .if debug_15V == 1; Установка параметров отладки
    .equ cVtgGnHigh = 18000; Максимальное напряжение в мВ, светодиод горит зеленым
    .equ cVtgNom = 15000; Нормальное напряжение в мВ, светодиод горит зеленым
    .equ cVtgGnMin = 13000; Минимальное напряжение в мВ, светодиод горит зеленым
    .equ cVtgRdMin = 11000; Напряжение в мВ, когда светодиоды полностью красные
    .endif
;
; **********************************
; АППАРАТНОЕ ОБЕСПЕЧЕНИЕ
; **********************************
;
; Устройство: ATtiny13A, Корпус: 8-контактный PDIP_SOIC
; ___________
; 1 / | 8
; СБРОС o-- | RES VCC | --o + 5V
; 2 | | 7
; Poti o-- | PB3 PB2 | --o LED красный анод
; 3 | | 6
; Напряжение o-- | PB4 PB1 | --o LED gn анод и PWM
; 4 | | 5
; 0 В o-- | GND PB0 | --o Драйвер постоянного тока ШИМ
; | ____________ |
;

; **********************************
; П О Р Т С А Н Д П И Н С
; **********************************
;
.equ pOutO = PORTB; Определите выходной порт
.equ pDirD = DDRB; Определите направление порта
.equ bPwmO = PORTB0; Определите выходной контакт PWM
.equ bGnAO = PORTB1; Определите выходной контакт анода зеленого светодиода
.equ bRdAO = PORTB2; Определите выходной контакт анода красного светодиода
.equ bAnyD = (1 << DDB0) | (1 << DDB1) | (1 << DDB2); Прямой вывод контактов
;
; **********************************
; А Д Й У С Т А Б Л Е К О Н С Т
; **********************************
;
.equ clock = 1200000; Определить тактовую частоту
;
; Константы измерения напряжения
.equ cR1 = 10; Нижний резистор в кОм
.equ cR2 = 82; Верхний резистор в кОм
.equ cVtgMax = (5000 * (cR1 + cR2) + cR1 / 2) / cR1; Максимальное измеряемое напряжение в мВ
.if debug_15V == 0; Не отладка, нормальная работа
  .equ cVtgGnHigh = 37000; Максимальное напряжение в мВ, светодиод горит зеленым
  .equ cVtgNom = 35000; Нормальное напряжение в мВ, светодиод горит зеленым
  .equ cVtgGnMin = 29600; Минимальное напряжение в мВ, светодиод горит зеленым
  .equ cVtgRdMin = 26000; Напряжение в мВ, когда все светодиоды выключены
  .endif
; Установите минимальное напряжение светодиодных циклов
; Светодиод зеленый: при cVtgGnMin 25 из 256 циклов ШИМ включены
; Светодиод красный: при cVtgRdMax 25 из 256 циклов ШИМ включены
.equ cLedMin = 25; Минимальная яркость светодиода
;
; Настройка мультипликатора для зеленого и красного светодиода PWM
.equ cFactorGn = 256; Попробуйте с множителем 256 на зеленом
.equ cFactorRd = 256; Попробуйте с множителем 256 на красном
;
; Проверить коэффициенты умножения
.if (cFactorGn! = 256) && (cFactorGn! = 512)
  .error "cFactorGn может быть только 256 или 512!"
  .endif
.if (cFactorRd! = 256) && (cFactorRd! = 512)
  .error "cFactorRd может быть только 256 или 512!"
  .endif
;
; **********************************
; F I X & D E R I V.К О Н С Т
; **********************************
;
; Таймер TC0
.equ cTc0Presc = 64; Предделитель для TC0
.equ cPwmFrq = часы / cTc0Presc / 256; Частота ШИМ
;
; Расчет напряжения
.equ cAdcCnt = 64; Количество отсчетов измерений
.equ cAdcMult = (1023 * cR1 * cAdcCnt + (cR1 + cR2) / 2) / (cR1 + cR2); Мультипликатор mV to Adc
.equ cAdcGnHigh = (cVtgGnHigh * cAdcMult + 2500) / 5000; Максимальная сумма Green Adc
.equ cAdcGnMin = (cVtgGnMin * cAdcMult + 2500) / 5000; Минимальная сумма Green Adc
.equ cAdcRdHigh = cAdcGnMin-1; Светодиод загорится красным, равным или ниже этой суммы Adc.
.equ cAdcRdMin = (cVtgRdMin * cAdcMult + 2500) / 5000; Сумма ADC, когда красный светодиод полностью горит
.equ cAdcMulGn = (cFactorGn * (255-cLedMin) + (cAdcGnHigh-cAdcGnMin) / 2) / (cAdcGnHigh-cAdcGnMin); Мультипликатор для зеленого
.equ cAdcMulRd = (cFactorRd * (255-cLedMin) + (cAdcRdHigh-cAdcRdMin) / 2) / (cAdcRdHigh-cAdcRdMin); Мультипликатор красный
;
; Проверьте диапазон коэффициентов умножения
.set MultiFactor = 0; Нет ошибок
.if cAdcMulGn> = 256; Зеленый фактор вне допустимого диапазона
  .error "Зеленый коэффициент умножения вне допустимого диапазона!"
  .set MultiFactor = 1; Установить условие ошибки
  .еще
  .if cAdcMulGn> = 256; Красный фактор вне допустимого диапазона
    .error "Красный коэффициент умножения вне допустимого диапазона!"
    .set MultiFactor = 2; Установить условие ошибки
    .endif
  .endif
.if MultiFactor == 0; Нет ошибок
  ; Проверить эффект округления мультипликаторов
  .if cFactorGn == 256; Проверьте, есть ли cFactorGn на 256
    .equ cAdcMulGnTst = (512 * (255-cLedMin) + (cAdcGnHigh-cAdcGnMin) / 2) / (cAdcGnHigh-cAdcGnMin); Мультипликатор для зеленого
    .if cAdcMulGnTst <256; Проверить диапазон коэффициента 512
      .if (cAdcMulGnTst! = (2 * cAdcMulGn)); Проверить, не точнее ли 512
        .сообщение "Зеленый светодиод: было бы лучше использовать 512 для cFactorGn!"
        .endif
      .endif
    .endif
  .if cFactorRd == 256; Проверьте, есть ли cFactorGn на 256
    .equ cAdcMulRdTst = (512 * (255-cLedMin) + (cAdcRdHigh-cAdcRdMin) / 2) / (cAdcRdHigh-cAdcRdMin); Мультипликатор красный
    .if cAdcMulRdTst <256
      .if cAdcMulRdTst! = (2 * cAdcMulRd); Проверить, есть ли еще 512 точнее
        .message "Красный светодиод: было бы лучше использовать 512 для cFactorRd!"
        .endif
      .endif
    .endif
  .endif
;
; Имитация отладки только отображения напряжения
  .если debug_vtg == 1; Параметры отладки
    .equ debug_adcvtg = (debug_voltage * cR1 + (cR1 + cR2) / 2) / (cR1 + cR2); Напряжение в мВ
    .if debug_adcvtg> 5000
      .error "Напряжение на входе АЦП слишком высокое! См. smbol debug_adcvtg!"
      .endif
    .equ debug_adcsum = (напряжение_отладки * cAdcMult + 2500) / 5000; Преобразовать в сумму АЦП
    .endif
;
; **********************************
; Т И М И Н Г
; **********************************
;
; TC0 - это 8-битный ШИМ
; часы = 2,400,000 Гц
; Предварительный делитель TC0 = 8
; Тактовая частота TC0 = 300000 Гц
; Такты ШИМ = 256
; Частота цикла ШИМ = 1,171.9 Гц
; Длительность импульса ШИМ = 853,3 мкс
;
; АЦП измерения напряжений на
; а) напряжение потенциометра (интенсивность)
; б) контакт входа напряжения
; инициируются сравнением TC0,
; в конце периода включения светодиодов.
; На каждом канале а) и б) восемь измерений
; суммируются, а значения Сравнить A и B
; рассчитываются и устанавливаются.
; OCR0A соответствует = 1171,9 Гц
; Количество каналов = 2
; Суммарно измерений = 64
; Частота обновления = 9.155 Гц
; Цикл обновления = 109,2 мс
;
; Продолжительность измерений АЦП
; Сравнение совпадений TC0 запускает преобразование AD
; поэтому время преобразования должно быть
; короче длительности триггера
; часы = 2,400,000 Гц
; Предварительный делитель тактовой частоты АЦП = 16
; Тактовая частота АЦП на преобразование = 13
; Длительность конверсии = 86,7 мкс
; % от времени цикла ШИМ = 10,2%
;
; **********************************
; Р Е Г И С Т Е Р С
; **********************************
;
; бесплатно: от R0 до R5
.def rMul0 = R6; Результат умножения, байт 0
.def rMul1 = R7; dto., байт 1
.def rMul2 = R8; dto., байт 2
.def rAdc0 = R9; Мультипликатор, байт 0
.def rAdc1 = R10; dto., байт 1
.def rAdc2 = R11; dto., байт 2
.def rAdcRL = R12; Последний результат АЦП, младший значащий бит
.def rAdcRH = R13; dto., MSB
.def rAdcL = R14; Сумма результата АЦП, младший значащий бит
.def rAdcH = R15; dto., MSB
.def rmp = R16; Многоцелевой регистр
.def rAdc = R17; Счетчик АЦП
; бесплатно: от 18 до 29 рандов
; используются: R31: R30 = Z для различных целей
;
; **********************************
; S R A M
; **********************************
;
; (SRAM не используется)
;
; **********************************
; C O D E
; **********************************
;
.cseg
.org 000000
;
; **********************************
; R E S E T & I N T - V E C T O R S
; **********************************
  rjmp Main; Сбросить вектор
  рети; INT0, не используется
  рети; PCI0, не используется
  рети; OVF0, не используется
  рети; ERDY, не используется
  рети; ACI, не используется
  рети; OC0A, не используется
  рети; OC0B, не используется
  рети; WDT, не используется
  rjmp AdcIsr; ADCC
;
; **********************************
; И Н Т - С Е Р В И Ц Е Р О У Т.
; **********************************
;
; Процедура обслуживания прерывания полного преобразования АЦП
AdcIsr:
  задавать ; Установить флаг T
  Рети
;
; **********************************
; М А И Н П Р О Г Р А М И Н И Т
; **********************************
;
Основной:
  ldi rmp, низкая (RAMEND)
  выходное звуковое давление, об / мин; Указатель стека инициализации LSB
  ; Увеличьте тактовую частоту до 2.4 МГц
  ldi rmp, 1 << CLKPCE; Включить изменение тактовой частоты
  из CLKPR, об / мин
  ldi rmp, 1 << CLKPS1; Разделите тактовую частоту 9,6 МГц RC на 4
  из CLKPR, об / мин
  ; Порты инициализации
  ldi rmp, bAnyD; Направление вывода для цифровых выводов
  out pDirD, rmp; в направлении порта
  ldi rmp, 0; Все выходы низкие
  out pOutO, об / мин; в регистре портов
  ; Инициировать АЦП
  ldi rmp, (1 << ADC0D) | (1 << ADC2D) | (1 << ADC3D); Отключить цифровые входные контакты
  out DIDR0, rmp; в отключенном порту
  ldi rmp, (1 << MUX1); Начните с канала потенциометра
  выход ADMUX, rmp; к мультиплексору АЦП
  clr rAdcL; Чистая сумма, младший бит
  clr rAdcH; dto., MSB
  ldi rAdc, cAdcCnt; Начать 8 измерений
  ldi rmp, (1 << ADTS1) | (1 << ADTS0); Запустить АЦП на TC0 Сравнить Match A
  out ADCSRB, rmp; в порту управления АЦП B
  ldi rmp, (1 << ADEN) | (1 << ADSC) | (1 << ADATE) | (1 << ADIE) | (1 << ADPS2); Presc = 16, ADATE, Int
  выход ADCSRA, rmp; в порту управления АЦП
  ; Запустить TC0 как стартер ШИМ и АЦП
  ldi rmp, 0; Отключить выходы ШИМ
  out OCR0A, rmp; в сравнении A, световая матрица
  out OCR0B, rmp; и для сравнения B, светодиод контроля напряжения
  ldi rmp, (1 << COM0A1) | (1 << COM0B1) | (1 << WGM01) | (1 << WGM00); Быстрая ШИМ, четкая при совпадении
  out TCCR0A, rmp; к порту управления TC0 A
  ldi rmp, 1 << CS01; Предделитель = 8
  выход TCCR0B, об / мин; к порту управления TC0 B
  ; Напряжение отладки
  .если debug_vtg == 1; Параметры отладки
    ldi rmp, низкий (debug_adcsum); Установить сумму АЦП, младший значащий бит
    mov rAdcRL, rmp
    ldi rmp, высокий (debug_adcsum); dto., MSB
    mov rAdcRH, rmp
    rjmp AdcDbg
    .endif
  ; Включение спящего режима
  ldi rmp, 1 << SE; Включен спящий режим, спящий режим в режиме ожидания
  выход MCUCR, об / мин
  sei; Разрешить прерывания для АЦП
;
; **********************************
; П Р О Г Р А М Л О П
; **********************************
;
Петля:
  спать ; Идти спать
  нет; Манекен для пробуждения
  brtc Loop; Если флаг T не установлен
  clt; Очистить флаг
  ; Прочтите результат АЦП
  в rmp, ADCL; Прочитать результат, младший бит
  добавить rAdcL, rmp; Добавить младший бит
  в об / мин, ADCH; dto., MSB
  adc rAdcH, rmp; dto., MSB
  dec rAdc; Подсчет измерений
  brne Loop; Вернуться к циклу
  ldi rAdc, cAdcCnt; Перезапустить 64 измерения
  mov rAdcRL, rAdcL; Копировать результат LSB
  mov rAdcRH, rAdcH; Копировать результат MSB
  clr rAdcL; Сумма перезапуска, младший бит
  clr rAdcH; dto., MSB
  sbic ADMUX, MUX0; Читать текущий канал
  rjmp AdcVtg; Напряжение было измерено
  ; Потенциометр измерен 64 раза
  ; Результатом MSB является значение PWM для светодиодов.
  ldi rmp, (1 << MUX1) | (1 << MUX0); Канал ADC3
  выход ADMUX, rmp; в ADMUX
  из OCR0A, rAdcRH; Запишите результат MSB для сравнения A
  rjmp Loop; Вернуться к циклу
AdcVtg:
  ; Напряжение было измерено
  ; Установите канал MUX на ADC2
  ldi rmp, (1 << MUX1); Канал ADC2
  выход ADMUX, rmp; в ADMUX
AdcDbg:
  mov rAdc0, rAdcRL; Копировать результат измерения, младший бит
  mov rAdc1, rAdcRH; dto., MSB
  ldi rmp, Low (cAdcGnHigh); Макс. Сумма ADC
  cp rAdc0, rmp; Сравните с максимумом зеленого, LSB
  ldi rmp, High (cAdcGnHigh)
  cpc rAdc1, rmp; dto., MSB
  ldi rmp, 255; Полностью зеленый
  brcc AdcSetPwmGn; Установите ШИМ зеленый
  ldi rmp, Low (cAdcGnMin); Вычтите зеленый минимум, LSB
  sub rAdc0, rmp
  ldi rmp, High (cAdcGnMin); dto., MSB
  sbc rAdc1, об / мин
  brcs AdcLow; Напряжение меньше мин.
  ldi rmp, cAdcMulGn; Мультипликатор нагрузки
  rcall Умножить; Умножьте разницу
  .if cFactorGn == 512
    lsr rMul2; Разделить на 2
    ror rMul1
    ror rMul0
    .endif
  ldi rmp, cLedMin; Минимальная ширина импульса
  добавить rmp, rMul1; Добавить к результату MSB
AdcSetPwmGn:
  out OCR0B, rmp; Записать результат в OCR-B
  cbi pOutO, bRdAO; Прозрачный красный анод
  rjmp Loop
AdcLow:
  mov rAdc0, rAdcRL; Копировать результат измерения, младший бит
  mov rAdc1, rAdcRH; dto., MSB
  ldi rmp, Low (cAdcRdMin); Вычесть минимум красного, LSB
  sub rAdc0, rmp
  ldi rmp, High (cAdcRdMin); dto., MSB
  sbc rAdc1, об / мин
  ldi rmp, 0x00
  brcs AdcSet; Напряжение ниже минимального, полностью красный
  ldi rmp, cAdcMulRd; Установить красный мультипликатор
  rcall Умножить
  .если cFactorRd == 512
    lsr rMul2; Разделить на 2
    ror rMul1
    ror rMul0
    .endif
  mov rmp, rMul1; Установить результат мультипликатора
AdcSet:
  out OCR0B, rmp; Напишите rmp для сравнения B
  sbi pOutO, bRdAO; Установите красный анод
  rjmp loop
;
; Умножьте rAdc1: rAdc0 на rmp.
; Результат в rMul2: rMul1: rMul0
; Результат в rMul1
Умножить:
  clr rAdc2; Очистить старший байт
  clr rMul0; Очистить результат, байт 0
  clr rMul1; dto., байт 1
  clr rMul2; dto., байт 2
Умножить1:
  lsr rmp; Множитель сдвига вправо
  brcc Multiply2; Ни один, пропустите добавление
  добавить rMul0, rAdc0; Добавить мультипликатор, байт 0
  adc rMul1, rAdc1; dto., байт 1
  adc rMul2, rAdc2; dto., байт 2
Умножить2:
  lsl rAdc0; Множитель сдвига влево
  rol rAdc1; dto., байт 1
  rol rAdc2; dto., байт 2
  tst rmp; Множитель = 0?
  brne Multiply1
  ldi rmp, 0x80
  добавить rMul0, rmp
  ldi rmp, cLedMin; Добавить минимум
  adc rMul1, об / мин
  ldi rmp, 0
  adc rMul2, об / мин
  tst rMul2
  breq Multiply3
  ldi rmp, 0xFF
  mov rMul1, rmp
Умножить3:
  Ret
;
; Конец исходного кода
 
 

Хвала, сообщения об ошибках, ругань и спам через страница комментариев мне.

© 2018 г., http: // www.avr-asm-tutorial.net

Недорогая система мониторинга электроэнергии с открытым исходным кодом

% PDF-1.7 % 1 0 объект > эндобдж 11 0 объект > эндобдж 2 0 obj > ручей application / pdfdoi: 10.1016 / j.ohx.2018.e00044

  • Недорогая система мониторинга электроэнергии с открытым исходным кодом
  • Шейн Оберлуа
  • HardwareX, (2018) e00044.doi: 10.1016 / j.ohx.2018.e00044
  • Авторы
  • Elsevier2018-10-09T20: 32: 28 + 05: 302018-10-09T18: 02: 28 + 03: 002018-10-23T14: 53: 05 + 03: 00 Мониторинг TrueSystem; Регистратор данных; Контроль мощности; Открытая фурнитура; Цепное фрезерование; Фотоэлектрические; Системный мониторинг; Мощность; Текущий; Напряжение; Строительный мониторинг; Энергия здания; Зеленое здание; Строительные системы; Энергомонитор для дома; Возобновляемая энергия; Энергия; Электротехника; Engineeringuuid: ebeb2df9-4e7a-4a73-8a22-c05ef2e32eb3uuid: 160c35e3-35de-4dfc-b5fe-85bf43760ba9
  • http: // ns.adobe.com/pdf/1.3/pdfAdobe PDF Schema
  • KeywordsexternalTextKeywords
  • http://ns.adobe.com/xap/1.0/xmpXMP Базовая схема
  • CreatorToolexternalText Имя первого известного инструмента, использованного для создания ресурса
  • .
  • MetadataDateexternalDate Дата и время последнего изменения метаданных для этого ресурса.
  • .
  • CreateDateexternalDate Дата и время первоначального создания ресурса.
  • .
  • ModifyDateexternalDate Дата и время последнего изменения ресурса.
  • .
  • http: // ns.adobe.com/xap/1.0/mm/xmpMMXMP Схема управления носителями
  • DocumentIDexternalURI Общий идентификатор для всех версий и представлений документа
  • .
  • InstanceIDexternalURIA Идентификатор для конкретного воплощения документа, обновляется каждый раз при сохранении файла.
  • .
  • http://ns.adobe.com/xap/1.0/rights/xmpRights Схемы управления правами XMP
  • MarkedexternalBoolean Указывает, что это ресурс с управляемыми правами
  • http: // изн.org / dc / elements / 1.1 / dc Схема ядра Дублина
  • formatexternalText - формат файла, используемый при сохранении ресурса. Инструменты и приложения должны установить для этого свойства формат сохранения данных
  • identifiereexternalText Уникальный идентификатор ресурса
  • titleexternalLang Alt Заголовок документа или имя, данное ресурсу
  • titleexternalLang Alt Заголовок документа или имя, данное ресурсу
  • creatorexternalText Авторы ресурса
  • descriptionexternalLang Alt Текстовое описание содержания ресурса
  • descriptionexternalLang Alt Текстовое описание содержания ресурса
  • publisherexternalProperNamePublishers
  • 2B конечный поток эндобдж 3 0 obj > эндобдж 4 0 obj > эндобдж 5 0 obj > эндобдж 6 0 obj > эндобдж 7 0 объект > эндобдж 8 0 объект > эндобдж 9 0 объект > эндобдж 10 0 obj >> >> эндобдж 12 0 объект > эндобдж 13 0 объект > / Шрифт> / Свойства> / Затенение> / XObject> >> / Повернуть 0 / StructParents 1 / Тип / Страница >> эндобдж 14 0 объект >> эндобдж 15 0 объект > ручей xwTTϽwz0tzRWQf

    Микроконтроллер ATtiny13: назначение выводов, техническое описание, программирование [Видео]

    ATtiny13 - это маломощный 8-разрядный микроконтроллер CMOS на базе расширенной архитектуры RISC AVR.

    Это вводная статья о 8-битном микроконтроллере ATtiny13 , после прочтения вы узнаете о распиновке ATtiny13, функциях, его альтернативах, различиях между ATtiny13a, а также о том, как его программировать, и т. Д. Следите за обновлениями, ребята!

    В этом обучающем видео подробно показано, как программировать ATtiny13 с Arduino.


    Каталог


    ATtiny13 Описание

    ATtiny13 - это маломощный 8-разрядный КМОП-микроконтроллер, основанный на архитектуре RISC, улучшенной AVR.Он имеет 8 контактов, 6 из которых могут использоваться как контакты ввода / вывода. Выполняя мощные инструкции за один тактовый цикл, ATtiny13 достигает пропускной способности, приближающейся к 1 MIPS на МГц, что позволяет разработчику системы оптимизировать энергопотребление в зависимости от скорости обработки.

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

    Работает в широком диапазоне напряжений, от 1 до 1.От 8 В до 5,5 В. В результате его можно использовать в операциях логического уровня при 1,8, 3,3 или 5,0 В. С другой стороны, входное напряжение 1,8 В для ATtiny13V поддерживает работу в диапазоне 0–4 МГц. Для частот до 10 МГц минимальное напряжение для ATtiny13 составляет 2,7 В, а для частот до 20 МГц минимальное напряжение составляет 4,5–5,5 В.


    ATtiny13 Распиновка

    ATtiny13 микроконтроллер AVR ATtiny13 Распиновка микроконтроллера AVR

    Номер контакта Имя контакта Описание
    1 (PCINT5 / RESET / ADC0 / dW) PB5 Контакт порта B, бит 5 или входной канал 0 АЦП, или ввод / вывод debugWIRE, или вывод изменения контакта, прерывание 0, источник 3 или вывод сброса, в основном используемый для программирования
    2 (PCINT3 / CLKI / ADC3) PB3 Двунаправленный контакт ввода / вывода порта B, бит 3 или входной канал 3 АЦП, или вход внешнего тактового сигнала, или прерывание изменения контакта 0, источник 3
    3 (PCINT4 / ADC2) PB4 Двунаправленный вывод ввода-вывода порта B, бит 4 или входной канал 2 АЦП, или прерывание изменения вывода 0, источник 4
    4 ЗЕМЛЯ Контакт заземления MCU
    5 PB0 (MOȘI / AIN0 / OC0A / PCINT0) Двунаправленный вывод ввода / вывода порта B Бит 0 или SPI MOSI, используемый для программирования или аналогового компаратора + или прерывания изменения вывода 0, источника 0 или таймера / счетчика0, сравнения Match A Out
    6 PB1 (MISO / AIN1 / OC0B / INT0 / PCINT1) Двунаправленный вывод ввода-вывода порта B Бит 1 или вход аналогового компаратора - или вход внешнего входа 0 или таймер / счетчик 1, выход сравнения B или изменение контакта Прерывание 0, источник 1 или SPI MISO, используемый для программирования
    7 PB2 (SCK / ADC1 / T0 / PCINT2) Двунаправленный вывод ввода / вывода порта B, бит 2 или входной канал 1 АЦП, или таймер / счетчик 0, тактовый источник, или последовательный тактовый вход, или изменение контакта Прерывание 0, источник 2 или вход внешнего тактового сигнала, используемый для программирования
    8 VCC Положительный вывод MCU (+ 5 В)

    Характеристики ATtiny13

    • Высокопроизводительный 8-разрядный микроконтроллер AVR® с низким энергопотреблением
    • Расширенная архитектура RISC

    - 120 мощных инструкций - большинство операций за один тактовый цикл

    - 32 x 8 рабочих регистров общего назначения

    - Полностью статическая работа

    - пропускная способность до 20 MIPS при 20 МГц

    • Энергонезависимые сегменты памяти повышенной надежности

    - 1 Кбайт внутрисистемной самопрограммируемой флэш-памяти программ

    - 64 байта EEPROM

    - 64 байта внутренней SRAM

    - Циклы записи / стирания: 10 000 Flash / 100 000 EEPROM

    - Срок хранения данных: 20 лет при 85 ° C / 100 лет при 25 ° C (см. Стр. 6)

    - Программируемый замок для самопрограммируемой защиты данных Flash и EEPROM

    - Один 8-битный таймер / счетчик с предделителем и двумя каналами ШИМ

    - 4-канальный 10-разрядный АЦП с внутренним опорным напряжением

    - Программируемый сторожевой таймер с отдельным встроенным генератором

    - Встроенный аналоговый компаратор

    • Специальные возможности микроконтроллера

    - встроенная система отладки debugWIRE

    - внутрисистемное программирование через порт SPI

    - Внешние и внутренние источники прерываний

    - Режимы холостого хода с низким энергопотреблением, шумоподавление АЦП и пониженное энергопотребление

    - Улучшенная схема сброса при включении питания

    - Программируемая цепь обнаружения пониженного напряжения

    - Внутренний калиброванный осциллятор

    - 8-контактный PDIP / SOIC: шесть программируемых линий ввода / вывода

    - 20-контактный MLF: шесть программируемых линий ввода / вывода

    - 1.8 - 5,5 В для ATtiny13V

    - 2,7 - 5,5 В для ATtiny13

    - ATtiny13V: 0 - 4 МГц при 1,8 - 5,5 В, 0 - 10 МГц при 2,7 - 5,5 В

    - ATtiny13: 0–10 МГц при 2,7–5,5 В, 0–20 МГц при 4,5–5,5 В

    • Промышленный диапазон температур
    • Низкое энергопотребление

    - Активный режим:

    - Режим пониженного энергопотребления:

    <0,1 мкА при 1,8 В


    ATtiny13 Параметр

    Производитель: Microchip Technology
    серия: AVR® ATtiny
    Упаковка: Трубка
    Состояние детали: Активный
    Core Процессор: АРН
    Размер сердечника: 8-бит
    Скорость: 10 МГц
    Возможности подключения:
    Периферийные устройства: Обнаружение короткого замыкания / сброс POR PWM WDT
    Количество входов / выходов: 6
    Размер памяти программы: 1 КБ (512 x 16)
    Тип памяти программы: ВСПЫШКА
    Размер EEPROM: 64 х 8
    Размер RAM: 64 х 8
    Напряжение - питание (Vcc / Vdd): 1.8 В ~ 5,5 В
    Преобразователи данных: А / Д 4x10b
    Тип осциллятора: Внутренний
    Рабочая температура: -40 ° C ~ 85 ° C (TA)
    Тип установки: Сквозное отверстие
    Упаковка / ящик: 8-DIP (0,300 дюйма, 7,62 мм)
    Пакет устройств поставщика: 8-ПДИП
    Базовый номер детали: ATTINY13

    Блок-схема ATtiny13


    ATtiny13 Альтернатива

    • ATtiny2313A (Точная альтернатива с новым выпуском)
    • ATtiny417
    • ATtiny28L
    • ATtiny48
    • ATmega88PA
    • ATmega8A
    • ATmega8515
    • ATmega8535
    • ATmega645A
    • ATmega6490

    ATtiny13 против ATtiny13a

    ATtiny13a

    AVR класса A являются незначительными улучшениями по сравнению с предыдущей версией; эти улучшения варьируются от чипа к чипу, например.г. разница между ATtiny2313 и ATtiny2313A отличается от разницы между ATmega128 и ATmega128A.

    Чтобы быть более конкретным, ATtiny13 является исходной версией и использует другой технологический процесс, чем ATtiny13A. Детали с суффиксом A производятся с использованием процесса с низким энергопотреблением, который продается как «picoPower», и главное отличие состоит в том, что они обычно потребляют меньше энергии при том же напряжении и частоте.

    Что касается различий с точки зрения совместимости кода, я не вижу причин, по которым ATtiny13A не будет кодовой и двоично совместимой с программами, написанными для ATtiny13.Однако обратное не совсем верно: хотя наборы команд и большинство периферийных устройств идентичны, ATtiny13A имеет дополнительные регистры PRR (регистр снижения мощности) и BODCR (регистр управления детектором пониженного напряжения).


    Программирование ATtiny13

    Микроконтроллеры AVR можно программировать с использованием различных программных опций, доступных на рынке. Некоторые продолжают программировать микроконтроллеры AVR на языке ассемблера. Информация, представленная ниже, относится к наиболее продвинутому и широко используемому программному обеспечению и компилятору, разработанным Atmel (теперь Microchip).

    Для программирования микроконтроллера AVR нам понадобится IDE (интегрированная среда разработки), в которой и происходит программирование. Компилятор - это то место, где наша программа преобразуется в файлы HEX, читаемые MCU.

    IDE: Atmel Studio 7

    Компилятор: AVR и ARM Toolchains

    Компания

    Microchip предоставила обе эти программы бесплатно. Их можно получить прямо с их официального сайта. Я также включил ссылку для вашего удобства.Установите их на свой компьютер после того, как они будут загружены.

    Нам понадобится устройство под названием ATAtmel-ICE для дампа или загрузки нашего кода в AVR. Программатор / отладчик ATAAtmel - ICE - это простой внутрисхемный отладчик, управляемый ПК, на котором работает Atmel Studio на платформе Windows. Программатор / отладчик ATAAtmel-ICE - важный инструмент в наборе инструментов инженера-разработчика. Схема программирования ATtiny13 изображена на диаграмме ниже.

    Пользователи могут также использовать устройство программирования USB ASP AVR в дополнение к этому официальному программатору для недорогих программных решений.Кроме того, нам потребуется другое оборудование, такое как плата Perf или макет, паяльная станция, микросхемы AVR, кварцевые генераторы, конденсаторы и так далее.


    ATtiny13 Упаковка


    ATtiny13 Производитель

    Microchip Technology Inc. - ведущий поставщик микроконтроллеров и аналоговых полупроводников, обеспечивающий разработку продуктов с низким уровнем риска, более низкую общую стоимость системы и более быстрое время вывода на рынок тысяч разнообразных приложений клиентов по всему миру.Компания Microchip со штаб-квартирой в Чандлере, штат Аризона, предлагает отличную техническую поддержку наряду с надежной доставкой и качеством.


    Техническое описание компонентов

    ATTINY13-20SSUR от Microchip Technology | Микроконтроллеры

    31.00.01 8 8 Тип 9037 I
    EU RoHS Соответствует
    ECCN (США) EAR99
    Состояние детали Активный
    Фамилия ATtiny
    Архитектура набора команд RISC
    Ядро устройства AVR 9018 Архитектура AVR 9018 Архитектура AVR 9018
    Максимальная частота ЦП (МГц) 20
    Максимальная тактовая частота (МГц) 20
    Ширина шины данных (бит) 8
    Флэш-память
    Размер программной памяти 1 КБ
    Размер ОЗУ 64B
    Программируемость
    Количество Входы / выходы 6
    No.таймеров 1
    ШИМ 2
    Количество АЦП Одиночный
    Каналы АЦП
    бит 10
    USART 0
    UART 0
    USB 0
    0
    I2S 0
    CAN 0
    Ethernet 0
    1
    Минимальное рабочее напряжение питания (В) 2.7
    Типичное рабочее напряжение питания (В) 3,3 | 5
    Максимальное рабочее напряжение питания (В) 5,5
    Минимальная рабочая температура (° C) -40
    Максимальная рабочая температура (° C) 85
    Температурный класс поставщика Промышленный
    Упаковка 9037 9037 9037 Лента и барабан 9037 8
    Стандартное название пакета SOP
    Пакет поставщика SOIC
    Монтаж
    Высота установки Поверхностный монтаж 5 (макс.

    Оставить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *