Как стать автором
Обновить

Комментарии 39

А почему код скриншотами?
Код — скриншотами, для компактности отображения, ведь это не весь код, а только основные, относящиеся к делу касты.
Из-за чего-то (а может это мои кривые руки) при создании статьи, не заработал кат, куда я хотел сделать вставки чтобы не перегружать текст. После чего решил сделать как в прошлых статьях (в которых видимо по этой же причине сделал так).
Здесь, мне видится отображение более лаконичным, ввиду единого стиля студии и протеуса.
Считайте это моей фичей :)
Желающие «копипастить» получили исходник целиком.
А как вы его [Digispark] прошиваете в Atmel Studio? Я тоже собираю штуку на attiny, но я прошиваю его через Arduino Mega 2560, в которую прошил ArduinoISP. Ну, короче, в качестве программатора использую мегу. Но это муторно и работает только в Arduino IDE. В Atmel Studio ничего прошить не могу.
НЛО прилетело и опубликовало эту надпись здесь
отдельным программатором?
У него есть бутлоадер, и прошивается через юзб из ардуино иде.
В Arduino IDE просто через usb и бутлоадер?

А в Atmel Studio через отдельный программатор? А можно в Atmel Studio без программатора? Вроде люди как-то делают через это или avrdude.
я могу ошибаться но и там и там используется avrdude.
В ссылке которую Вы привели, используется Atmel-ICE, это такой навороченный программатор-отладчик от Атмел, который умеет в шить все типы их контроллеров и предоставляет возможность работы через такие интерфейсы: JTAG, SWD, PDI, TPI, aWire, SPI, debugWIRE.
Что означает, что им можно шить Attiny младших версий (5,9 и т.д), которые шьются только через TPI (Статья про эти девайсы). А так же самые навороченные UC3 и XMega, которые шьются через интерфейс PDI. Но при этом цена девайса удручает.
Digispark я не прошиваю, прошивает мой друг, из патченой среды ардуино.
Я использую более суровые методы :)

Вроде такого, перешитого в про-версию, и припаянным ICSP разъемом (только разъем сделал как в стандартном программаторе — 10-ти пиновый, который полностью закрыл отверстие заглушки).
С одной стороны, Digispark интересная штука.

Но с другой, она показывает как люди получают на подобных проектах сверхприбыли. Он стоит $8.95 (680 руб.). При том, что самая дорогая вещь там attiny стоимостью 30-50, ну, 100 рублей, если покупать с накруткой в России. Ну, ещё копеешный стабилизатор напряжения, несколько резисторов, плата. Это никак не 680 рублей. Вот, китайцы продают их по адекватной цене ~100 руб.

Добавляем светодиодик, немного хлама и получаем уже $16.95 (1300 руб)! Наверное это выгодней, чем торговать оружием или наркотиками.

Это даже особенность не Digispark, а вообще в этой области это норма.
Или добавляем несколько кнопок и резисторов и получаем $24.95. 1900 рублей, Карл, практически из воздуха. Я пишу это не потому что мне нравится считать чужие деньги. А потому что у нас вечная проблема с «нефтяной иглой», «низкой производительностью труда» и т.п. Нужно делать такие же штуки и продавать буржуям за доллары. Например, матрешку, которая читает твиты или статусы вконтакте и мигает светодиодиками.
Все что вы указали, с одной материнской платы можно получить бесплатно, на целый год проектов ;)
Вообще то у Digispark — Open Hardware. Купить его можно на aliexpress за бакс с копейками, а покупая у разработчика ты просто его поддерживаешь и получаешь оригинал. Лично мне понравилась такая идея.
Поясните про назначение RC цепочки для RS
Здесь все просто:
Взгляните на видео с демонстрацией. Там видно, что когда проскакивает сигнал защелки (канал B осциллографа), иногда на линии данных (канал С осциллографа) проскакивает последний бит (девятый). Так вот, если его видно на осциллограмме, значит это ноль, в противном случае — единица. Этот бит съедается дисплеем в момент чтения линии данных — параллельно с данными из сдвигового регистра. Это чтение происходит в тот самый момент, когда дисплей получает сигнал «E», или Latch — сдвигового регистра. То есть схема такая:
Дисплей читает «E» (сигнал enable read), в этот момент он считывает данные и сигнал RS, а я ему подсовываю на эту линию нужный сигнал параллельно с выдачей защелки.
Надеюсь понятно объяснил. Взгляните на ассемблерный код функции вывода (уменьшенный скрин кликабелен), там есть проверка _RS, после которой переход на выдачу защелки, либо на выдачу защелки и опускание линии. Так вот это оно.
Ошибочка вышла, конечно данные на канале «D». Канал «C» — RC-цепочка.
Кстати говоря, спасибо за Ваш интерес, специально для Вас открою тайну, о которой я забыл написать в статье :)

Эта функция использует одну аппаратную фичу атмела, которой нет у пиков, поэтому присмотритесь к ней внимательно ;)
Подсказка: присмотритесь как происходит вывод в порт.
Жду Ваши комментарии :)
Хех, несколько лет назад тоже баловался подключением этого дисплея через сдвиговый регистр (на таком же как у вас). Не думал, что из этого можно целую статью сделать :)
Когда-то давно я портировал Arduino-библиотеку LCD на чистый C, попутно сделав её кросс-платформенной:
https://github.com/RoboCraft/HD44780

Ввод-вывод в ней абстрагирован в драйверы через такую структуру:

struct HD44780_GPIO_Interface_Struct;
typedef struct HD44780_GPIO_Interface_Struct HD44780_GPIO_Interface;

struct HD44780_GPIO_Interface_Struct
{
  HD44780_Result (*configure)(HD44780_GPIO_Interface *interface, HD44780_Pin pin, HD44780_PinMode mode);
  HD44780_Result (*write)(HD44780_GPIO_Interface *interface, HD44780_Pin pin, HD44780_PinState value);
  HD44780_Result (*read)(HD44780_GPIO_Interface *interface, HD44780_Pin pin, HD44780_PinState *value);
};

Этакий C++ интерфейс для бедных: заполняем структуру указателями на функции управления пинами и отдаём библиотеке, а она уже работает с пинами через эти указатели. В папке drivers/ лежат реализации для STM32, в examples/ есть примеры использования. Они могут показаться громоздкими, но это издержки C и плата за гибкость: можно управлять экраном хоть через сдвиговый регистр, хоть по радио — нужен только драйвер пинов, порядок пинов вы задаёте сами при инициализации библиотеки.

Пример для STM32F10x
HD44780_STM32F10x_GPIO_Driver lcd_pindriver;

void init_lcd(void)
{
  /* Распиновка дисплея */
  const HD44780_STM32F10x_Pinout lcd_pinout =
  {
    {
      /* RS        */  { GPIOA, GPIO_Pin_6 },
      /* ENABLE    */  { GPIOA, GPIO_Pin_5 },
      /* RW        */  { GPIOA, GPIO_Pin_4 },
      /* Backlight */  { NULL, 0 },
      /* DP0       */  { NULL, 0 },
      /* DP1       */  { NULL, 0 },
      /* DP2       */  { NULL, 0 },
      /* DP3       */  { NULL, 0 },
      /* DP4       */  { GPIOA, GPIO_Pin_3 },
      /* DP5       */  { GPIOA, GPIO_Pin_2 },
      /* DP6       */  { GPIOA, GPIO_Pin_1 },
      /* DP7       */  { GPIOA, GPIO_Pin_0 },
    }
  };

  /* Настраиваем драйвер: указываем интерфейс драйвера (стандартный),
     указанную выше распиновку и обработчик ошибок GPIO (необязателен). */
  lcd_pindriver.interface = HD44780_STM32F10X_PINDRIVER_INTERFACE;
  /* Если вдруг захотите сами вручную настраивать GPIO для дисплея
     (зачем бы вдруг), напишите здесь ещё (библиотека учтёт это):
  lcd_pindriver.interface.configure = NULL; */
  lcd_pindriver.pinout = lcd_pinout;
  lcd_pindriver.assert_failure_handler = hd44780_assert_failure_handler;

  /* И, наконец, создаём конфигурацию дисплея: указываем наш драйвер,
     функцию задержки, обработчик ошибок дисплея (необязателен) и опции.
     На данный момент доступны две опции - использовать или нет
     вывод RW дисплея (в последнем случае его нужно прижать к GND),
     и то же для управления подсветкой. */
  const HD44780_Config lcd_config =
  {
    (HD44780_GPIO_Interface*)&lcd_pindriver,
    delay_microseconds,
    hd44780_assert_failure_handler,
    HD44780_OPT_USE_RW
  };

  /* Ну, а теперь всё стандартно: подаём тактирование на GPIO,
     инициализируем дисплей: 16x2, 4-битный интерфейс, символы 5x8 точек. */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  hd44780_init(&lcd, HD44780_MODE_4BIT, &lcd_config, 16, 2, HD44780_CHARSIZE_5x8);
}


Об этой библиотеке есть статья:
http://robocraft.ru/blog/algorithm/785.html

Всё это уже успело порости мхом (2012 г.), и к библиотеке я с того времени не прикасался (драйвер для Arduino придётся писать вам) но вдруг кому пригодится.
Это понятно, если реализовать таким способом, то для моей поставленной цели это сразу съест память тиньки, в моём случае, используется 1 байт RAM (без учета стека, которого при максимальной глубине вызовов, насколько помню, использовалось 8 байт).
В STM с этим проще, а значит C++ предоставляет все неоспоримые удобства и гибкость.
Справедливости ради, библиотеку можно использовать и с AVR — нужно только драйвер пинов написать (мне было не до этого, поэтому AVR в комплект не входит), памяти нужно байт 100, к тому же библиотека на чистом C. ATtiny — понятное дело, хардкор, туда вообще ничего не впихнёшь без напильника и вазелина, единственный плюс — размер.
Это просто магия! Написал код в Atmel Studio на Си, нарисовал схему в Proteus, загрузил в Proteus hex-файл и всё работает!

Я очень скептически относился к эмуляции и не знал про Proteus. А оказывается это такая клевая штука. Спасибо за статью.
Я до железа добираюсь только после полноценных тестов в эмуляции, все фантазии сначала воплощаю виртуально, очень помогает при разработке.
Добавил к статье ссылку на библиотеку LCD, с моими «художествами», символы из которой представлены в демо-ролике.
Её необходимо скопировать с заменой в папку с протеусом:
«C:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\MODELS\»
или где он у Вас установлен, только сохраните оригинал!
Библиотека работает с Proteus 8.3 sp2, с младшей ревизией возможны проблемы.
Успехов в разработках! :)
И еще, возможны проблемы при эмуляции на некоторых микроконтроллерах, в виде неправильно работающих узлов периферии, пусть это Вас не останавливает!
Вспомнил какая была проблема с ATtiny13a в Proteus:
Не работает АЦП в непрерывном режиме (флаг ADLAR если не изменяет память, могу ошибаться).
То есть после выполнения первого преобразования АЦП, значение не изменяется пока не запустишь явное преобразование (ADEN). Баг не страшный, но неприятный.
После пары дней мытарств, нашел описание проблемы у буржуев.
Опять память подвела :)
Флаг ADSC.
И это пишет любитель ATtiny13? :)
Вот один проект на который в итоге забил:



Может Вам пригодится, исходники могу предоставить, но тут лучшее что можно дать — идея.
Ну, Дружище, давайте не будем лукавить ;)
Во-первых в этом видео понятно, что термометр устранен из схемы не потому что он дорогой, а потому что не хватило выводов.
Во-вторых, Вы утверждаете, что увеличили с помощью средне-арифметического — диапазон измерений до 11 бит.
Ок, но тогда (исходя из Ваших утверждений), шаг измерений должен быть равен 2034/2048 ~ 0.001 (1 * 10(-4))
Но Ваше видео показывает, что шаг измерений равен 0.18, что уже больше заявленного на два порядка.
В-третьих, Вы не показываете реальные значения на резисторе в видео, для определения абсолютной погрешности, когда в видео представленном мной, показаны значения вольт-метра, ам-метра, да еще и пробник который показывает реальное падение напряжения. При этом я не использую средне-арифметическое (оно достигается в схеме — интегрально), а абсолютная погрешность не превышает 0.03 для вольт и 0.01 для ампер (естественно с увеличением измеряемого диапазона, абсолютная погрешность растет, однако она нивелируется смещением, чем достигается максимальное приближение на достижимом размере шага).

Не обижайтесь, но наши проекты (громко звучит поделка за 5 минут), далеки.
П.С.: Если убрать второй канал в моем примере (или хотя бы ам-метр), то на его место можно вонзить сеть из интегральных термо-датчиков, с поочередным выводом значений. Вы же заметили что я указал размер полученного кода, который равен 760 байтам? Вот в эти 240 байт легко впишется функция опроса.

Тем не менее, хочу добавить про стоимость:
Мега в моей местности стоит далеко не дешевле тиньки со сдвиговым регистром, при том что сама тинька стоит около 100р (13А). А если учесть что 595-ых у меня «завалялось», а 164-ых — совсем ведро с мертвых роутеров, то выбор очевиден.

Опять же, я никоим образом не против увеличения вычислительных ресурсов, ног и периферии МК, а только за!
Но порой, крутишь в руках 328-ю мегу, и жаба давит делать на ней мигалку, дрыгалку или какую еще простую фигню. Ведь она по объему памяти почти как БК0010-01, а по вычислительной мощности выше на порядок.

В этом проекте у меня осталось много вопросов и непонятностей, потому и забросил.
Со мной такое происходило ранее неоднократно, когда мои идеи просто старались меня съесть своим количеством, и приходилось распыляться на несколько реализаций одновременно. При этом каждая область для меня была новой и неизвестной, а значит нужно было обрабатывать уйму новых знаний. А параллельно с этим наваливался реал: друзья, девушки, учёба, работа и т.п.
Но самое странное, что чужие реализации каких-либо алгоритмов, которые я пытался адаптировать в своих работах, не приводили к успешному финалу, как правило. Отмечу, так же, что среди всей массы чужих исходников, я не видел ни единого комментария к коду.
Поэтому, наверное, я стараюсь сейчас выкладывать исходники для других людей в таком виде.

А Ваши ресурсы я посетил, впечатляет! Только не пойму, почему вы это все делаете в соц-сетях?
Лично меня, очень напрягает просматривать такой материал — лентой. Ведь есть же для этого сайты с тематическими блогами, где можно подобного рода информацию систематизировать.
В соц.сетях я что и делаю, то собираю информацию, большинство из этого всего — найденное мною в сети.

Какая цель всего этого? Наверное коммерция, но мне нравится это делать не зависимо от того приносит ли оно доход или нет.
Спасибо за честность, но вопрос был не об этом.
Я имел ввиду именно удобство чтения.
Или то что Вы сказали означает — При всем богатстве выбора сайтов с мотивацией, нет тех, которые бы касались исключительно радио электронной тематики, предоставляя несравнимые удобства для редактирования, размещения и прочтения статей?
Тогда понятно.
На регистры спрос большой, цену задирают. А специальные регистры с источниками тока на выходе — вообще заменить нечем!
Два 16-битных регистра — и подключаем 4 светодиодных индикатора в статике всего с одним внешним резистором, задающим яркость.
При этом не имеем проблем в программной реализации динамической индикации, минимальные уровни ЭМИ от схемы и т.д. ATmega8 при этом откладывается в сторонку.
Можно использовать Charlieplexing и с помощью 6 контактов attiny управлять 30 светодиодами.

Я делал панельку из 12 светодиодов, которая управляется 4 контактами: www.youtube.com/watch?v=uiaE7snxT3U

Видно, что там загораются лишние светодиоды, это связано с особенностями (если не багами) Arduino Mega 2560 и лечится стягивающими резисторами.

А ещё есть GuGaplexing, с помощью которого можно удвоить количество светодиодов. Т.е. с 6 контактов attiny управлять 60-ю светодиодами.

Конечно, у такого подхода есть недостатки. Светодиоды должны быть одинаковыми. И если одновременно зажигать много светодиодов, то яркость будет ощутимо ниже. Но для каких-то задач это может работать.
Алекс, два 8-разрядных регистра и 8 7-ми сегментных индикатора, зачем такое расточительство? :)
И куча внешних деталей, те же ключи на каждое знакоместо. И повышенный уровень ЭМИ, который не допустим в чувствительном радиоприёмнике — а значит много возни по правильному экранированию схемы.
А вообще, на 8 индикаторов уже есть специализированная микросхема(одна!), еще и SPI…
Согласен.
Цена этой микросхемы, тоже не подарок, насколько помню.
Кстати, сдвиговые регистры так же чувствительны к ЭМИ, особенно при каскадировании, если разнос большой.
В принципе, для простых схем этим можно пренебрегать, а когда речь заходит, например, об автомобильных разработках, тогда необходимо учитывать все подобные нюансы.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации