Поиск по этому блогу

28 янв. 2014 г.

Генератор изображений для LCD

Генератор изображений немного изменился, теперь он может создавать массивы картинок с максимальным разрешением 320х240.

Генератор изображений, Окно программы
Окно программы
Программа позволяет подготавливать монохромные картинки для графических дисплеев с разрешением от 4х8 до 320х240 с кратностью шага 4 по горизонтали, 8 по вертикали.

Из инструментов на данный момент доступны карандаш, масштабирование и добавление точечного рисунка.
Генератор изображений, Окно добавление картинки
Окно добавление картинки
Если этих средств вам недостаточно, то вы можете подготовить точечный рисунок в любом из графических редакторов и вставить в программу.
По завершению работ над изображением оно преобразуется в массив, который можно внедрить в прошивку микроконтроллера. К примеру, выше полученный рисунок будет выглядеть следующим образом:
01.static const char lcd_image_mas[768] =
02.{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
03.0x01, 0x03, 0x02, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x10, 0x30, 0x20, 0x60,
04.0x40, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
05.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x1F, 0x7C, 0xF0, 0xE0,
06.0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
07.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
08.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
09.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
10.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
11.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
12.0x00, 0x00, 0x00, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x08, 0x08, 0x10,
13.0x10, 0x20, 0x20, 0x40, 0x40, 0xC0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x03,
14.0x07, 0x1E, 0x7C, 0xF0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
15.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
16.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80,
17.0xC0, 0xC0, 0xC0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xE0, 0xC0, 0x00, 0x00,
18.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
19.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
20.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00,
21.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x02, 0x06,
22.0x06, 0x0C, 0x08, 0x88, 0xDB, 0x6F, 0xB8, 0xF8, 0xF0, 0xE8, 0x60, 0x70,
23.0x30, 0x70, 0x70, 0x78, 0x78, 0x78, 0x78, 0x78, 0x3C, 0x3C, 0x3C, 0x3C,
24.0x3C, 0x3E, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F,
25.0x07, 0x07, 0x07, 0x07, 0x07, 0x03, 0x03, 0x03, 0x03, 0x01, 0x01, 0x00,
26.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x40,
27.0x00, 0x80, 0xA0, 0xA0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
28.0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x08, 0xED, 0xBC, 0xBC, 0xDF,
29.0xDF, 0xF6, 0xF2, 0xFC, 0xFC, 0xF8, 0xF8, 0x74, 0x1A, 0xCA, 0xC4, 0x86,
30.0xEA, 0xCB, 0xE3, 0x47, 0xE2, 0xFB, 0xFE, 0x7F, 0x63, 0x67, 0xEE, 0x3F,
31.0xFF, 0xCF, 0x2F, 0xAF, 0x2C, 0x7C, 0x38, 0x70, 0xD0, 0xF0, 0xC0, 0xC0,
32.0x90, 0x88, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
33.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
34.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x03, 0x27, 0x0F,
35.0xFF, 0xFF, 0xFF, 0xFD, 0xED, 0xBE, 0xFE, 0x8E, 0xE1, 0xA8, 0x80, 0xE0,
36.0xE0, 0xA0, 0xB2, 0xBE, 0x82, 0x80, 0xF9, 0xE9, 0xFD, 0xFF, 0xE3, 0xE7,
37.0xFE, 0xF6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF2, 0xF3, 0xF3, 0xF1, 0xF0,
38.0xF9, 0xF9, 0xFD, 0xFC, 0xFE, 0xFE, 0xFE, 0xFF, 0xFE, 0x7F, 0xEF, 0xFB,
39.0xF1, 0xE1, 0xFC, 0xFD, 0xFF, 0xFC, 0xB6, 0x74, 0x39, 0x1A, 0x0F, 0x01,
40.0x03, 0x07, 0x07, 0x0E, 0x0E, 0x1C, 0x3C, 0x38, 0x70, 0x70, 0xE0, 0xE0,
41.0xC0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x04,
43.0x06, 0x06, 0x06, 0x07, 0x01, 0x01, 0x02, 0x06, 0x07, 0x0F, 0x1C, 0x1D,
44.0x10, 0x11, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x03,
45.0x03, 0x07, 0x07, 0x07, 0x0F, 0x0F, 0x0F, 0x2F, 0xFF, 0xEF, 0x6F, 0xF7,
46.0xE7, 0xF7, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xE3, 0x01, 0x00,
47.0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
48.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
49.0x01, 0x03, 0x03, 0x07, 0x0F, 0x0E, 0x1E, 0x1C, 0x38, 0x78, 0x70, 0xF0,
50.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
51.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
52.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
53.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0F, 0x0F, 0x07, 0x06,
54.0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00,
55.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
58.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59.0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
60.0x78, 0x14, 0x14, 0x7C, 0x00, 0x7C, 0x40, 0x40, 0x40, 0x00, 0x7C, 0x54,
61.0x54, 0x44, 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00, 0x10, 0x10, 0x10,
62.0x00, 0x7C, 0x54, 0x54, 0x44, 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, 0x00,
63.0x7C, 0x54, 0x54, 0x44, 0x00, 0x40, 0x00, 0x7C, 0x08, 0x10, 0x20, 0x7C,
64.0x00, 0x7C, 0x54, 0x54, 0x44, 0x00, 0x04, 0x04, 0x7C, 0x04, 0x04, 0x40,
65.0x00, 0x7C, 0x14, 0x34, 0x48, 0x00, 0x3C, 0x40, 0x40, 0x7C, 0x40, 0x00};
66. 
67.void lcd_image()
68.{
69.char x,y;
70.for(y=0;y < 8;y++)
71.{
72.lcd_gotoxy(0,y);
73.for(x=0;x < 96;x++)
74.lcd_send(lcd_image_mas[y*96+x], LCD_TDATA);
75.}
76.}
Если размеры изображения будут отличаться от 96х64 – в функции lcd_image() нужно будет указать своё количество точек по горизонтали и количество линий по вертикали.
Данная программа подходит для генерации изображений для таких дисплеев как: nokia3310, nokia1100 и им подобным монохромным дисплеям, для все монохромных графических дисплеев Wistar (например: WG320240). А также всех остальных дисплеев со схожим типом построения картинки.


Предыдущая версия программы лежит тут — Генератор изображений (версия 1).

Переходник для дисплея от Nokia 1202

Так повелось, что дисплеи от мобильников заняли свое почетное место в ряду любимых всеми радиолюбителями запчастей.
Думаю, нет смысла доказывать, что самым популярным дисплеем от сотовых для использования в своих проектах, построенных на AVR и PIC архитектуре является LCD от Nokia 3310. Монохромный графический, 84*48px, с простым интерфейсом управления и по приемлемой цене. В Сириусе сие чудо с подложкой  стоит 65 рублей. И все, казалось бы, хорошо, но есть у этого дисплея пара противных недостатков…
  1. На рынке существует два вида этих экранов. Фирменный от Nokia и китайский аналог, управляемый неведомым контроллером с расширенной адресацией. По этой причине, прошивки для двух этих братьев не взаимозаменяемы. Беда в том, что фирменный дисплей можно достать разве что только разобрав телефон либо у ремонтников сотовых. В магазинах же чаще продаются только их китайские собратья.
  2. Вторая особенность в том, что что у китайского аналога, как у самого распространенного отсутствует металлизация контактов. Точнее, на некоторых экранах она есть, а на некоторых ее нет. Поэтому чаще всего приходится обрезать пластиковую подложку дисплея вместе с подпружиненными контактами и в таком уродском виде вставлять в свои проекты. Нет смысла доказывать что это не эстетично, да и качество контакта в местах соприкосновения с экраном, на мой взгляд, не слишком качественное. Некоторые умельцы используют эластомер, но под этот вариант придется проектировать плату и каким-то образом крепить экран и подсветку для него. В общем, сплошной гемор.
Но, ура товарищи! Счастье в этом мире есть. Называется оно LCD Nokia 1202. Это небольшой графический монохромный дисплей разрешением 96 * 68px. Встроенная белая подсветка, гибкий шлейф для распайки на плату с шагом 0,6 мм, никаких убогих подложек.  Но самое главное еще впереди!) Продается это чудо повсеместно и стоит, внимание, 35 рублей.
Дисплей имеет следующую распиновку:
Номер пина Название Описание
0 nc Не подключено
1 !RESET Сброс контроллера
2 !CS Выбор кристалла
3 GND Земля
4 SDA SPI data/cmd
5 SCLK SPI clock
6 VDDI Напряжение питания для I/O 1.6~3.6V
7 VDD Напряжение питания ядра 2.4~3.3V
8 GND Земля
9 -LED
10 +LED
11 nc
Протокол общения с микроконтроллером – SPI 9-bit (первый бит признак команды либо данных).
Немного не удобно, т.к. становится невозможно использовать аппаратный SPI 8-bit, например, на AVR или ARM (STM). Остается только вариант программной реализации (ногодрыг). Но и в этом можно усмотреть небольшой плюс – работу с дисплеем можно повесить на любые “непопулярные” ноги порта, а аппаратный SPI использовать по назначению, например для общения с  радио-трансивером.
Как и все подобные, этот экран питается от 3.3V. Это не всегда бывает удобно, поэтому я собрал небольшой адаптер-плату толерантную к более высоким напряжениям.
Преобразователь уровней собран не на резистивных делителях, а на диодах, включенных катодами к выходам МК и анодами, соответственно, к ногам дисплея. Питающее напряжение обеспечивается линейным стабилизатором LM-1117-3.3 в необходимой обвязке. Включение питания схемы и подсветки осуществляется через биполярные транзисторы BC847 или им подобные.
Принципиальная схема адаптера
Принципиальная схема адаптера
Такой способ включения позволяет сделать дисплей более лояльным к питанию и уровням на шине данных, т.к. максимально допустимое подаваемое напряжение ограничивается лишь значениями допустимых напряжений для преобразователя и напряжением пробоя для диодов.
Плата
Плата односторонняя, изготовленная ЛУТом с последующим лужением в Розе. Все компоненты в SMD исполнении кроме диодов (не было у меня нужного формфактора).
Адаптер для lcd nokia 1202
Адаптер для lcd nokia 1202
Вид с обратной стороны
Вид с обратной стороны
Дисплей паяется легко. Шлейф хорошо держит температуру. Единственное, даже после лужения в сплаве Розе, перед посадкой шлейфа на место нужно добавить немного припоя на контакты платы, для того, чтобы после посадки его хватило для проникновения через перфорацию контактов шлейфа. Главное не переборщить, как с количеством припоя, так и с температурой и временем нагрева. У меня все село очень даже неплохо.
Распайка шлейфа от lcd nokia 1202
Распайка шлейфа от lcd nokia 1202
Теперь экран болтается на шлейфе, что не очень хорошо. Дальше все упирается в вашу фантазию и уровень лени. Можно приклеить двухсторонним скотчем либо намазать соплей. Я сопли не люблю, поэтому мы будем делать настоящий заводской дисплей.
Общий вид
Из оцинкованного железа по шаблону была вырезана и согнута пластина по размерам экрана. По краям к ней припаяны четыре шпильки из куска медной проволоки с резьбой М2. Все это чудо покрашено серой молотковой эмалью. Гаек таких маленьких у меня нет, поэтому в качестве доноров были взяты шляпки от болтов М4.
Защита на экран
Защита на экран
Дорожки на плате залиты зеленым цапон-лаком. Под экраном на плату наклеиваем кусочки пенки, а сверху укладываем нашу защиту.
Плата залита цапон-лаком
Не помешает залить лаком
Вот, собственно, что получилось в итоге.
В сборе
В сборе
С включенной подсветкой
С включенной подсветкой

В качестве программной реализации была использована графическая библиотека для дисплеев Nokia 1100  товарища Chiper с сайта digitalchip.ru, которая отлично работает и с экраном Nokia 1202. Спасибо ему большое!

nokia1100_lib_all_v2 - Текстовый и графический вариант библиотеки.

ste2007(nokia1202) - Datasheet на кристалл от LCD Nokia 1202

nokia1202lcd-EagleCad - Проект для EagleCAD 6.1

lcd1202 - Компонент LCD Nokia 1202 для EagleCad 6.1

27 янв. 2014 г.

20 вещей, которые я не знал в 20 лет


1. Мир хочет, чтобы вы оставались тупыми. Чем вы тупее, тем вам проще продать продукты и услуги. Размер диагонали телевизора обратно пропорционален коэффициенту интеллекта.

2. Не надо слепо верить в образовательную систему. Учебная программа устарела в первый день начала вашего обучения. (Исключение – фундаментальные программы, но только в точных науках; вопрос применения фундаментальных знаний в обычной жизни остается открытым.)

3. Читайте без остановки, читайте как можно больше. Вы никогда не знаете, когда вам пригодятся новые знания и концепции, но вы будете намного лучше подготовлены к жизненным неожиданностям.

4. Научитесь общаться с окружающими. Избегать людей, считая их недостойными своего общения, – значит не найти клиентов, друзей или работу в дальнейшем.
 
5. Быть застенчивым – это пустая трата времени. Не давайте эмоциям рулить процессами принятия решений.

6. Если вам что-то не нравится в отношениях с другим человеком, – в случае вашего разрыва это “что-то” и будет причиной.

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

8. Найдите людей, которыми можно восхищаться, и старайтесь их превзойти.

9. Со временем люди становятся более консервативными. Если хотите сделать рисковые вещи – делайте их, пока молодые. Я давно пришел к выводу, что реформаторство – это следствие отсутствия знаний, а не наличия фокуса.

10. Не тратьте деньги на ерунду: скопите их на что-то серьезное (в т.ч. и свой стартап). Это вас также научит тратить деньги и в бизнесе: с умом и ради цели.

11. Выбирая между тратой денег на вещи или впечатления, выбирайте впечатления. Радость от впечатлений и воспоминаний выше.

12. После того, как вы научились экономить, научитесь зарабатывать.

13. Научитесь программировать. Проще самому сделать прототип, нежели тратить время и деньги на то, чтобы его объяснить кому-то еще. Не хотите программировать – научитесь что-то делать руками, чтобы можно было производить что-то полезное.

14. Не набирайте лишний вес в молодости. Это сократит вашу активную жизнь на 10-20 лет.

15. Научитесь готовить еду. Лучшее время для обдумывания чего-то – когда вы режете ингредиенты на салат или суп.

16. Высыпайтесь ночью. Недостаток сна сильно влияет на качество принятия решений.

17. Записывайте свои дела. Памяти недостаточно, какой бы фантастической она ни была.

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

19. Станьте специалистом своего дела перед тем, как менять сферу деятельности. Тут дело и в правиле 10000 часов, и в том, что хороший управленец должен в прошлом быть хорошим специалистом.

20. Не старайтесь исправить людей. Ищите тех, кто еще не испорчен.

Бонус:
— Учите 2-3 иностранных языка. Знание языка также дает понимание культуры и понимание разнообразных точек зрения и ценностей.
— Учитесь культурно разговаривать и писать без ошибок. Умение говорить складно и по делу пригодится тогда, когда вы будете доносить точку зрения компании потребителям, а также управлять людьми.
— Научитесь этично конкурировать в нужных вам областях жизни. Жизнь – очень конкурентная штука, и неумение конкурировать снижает ваши шансы на изменение своего положения или социального статуса.
Источник: http://kalinin-v.livejournal.com/138663.html


От себя хочу добавить — можно «найти смысл жизни» и остановиться. Или «не найти» и тоже остановиться. В сущности — похоронить себя заживо. А можно жить — и это того стоит, без дураков.

Печатные платы своими руками (фоторезист).

В продаже появились фоторезистивные материалы по весьма доступным ценам. А результат работы с ними после моих пещерных технологий кажется натуральной магией. Разумеется, я не удержался от того, чтобы купить фоторезист ORDYL 350 и попробовать всё своими руками.
Для примера сделаем модуль часов на микросхеме DS1307.
Для начала нам нужно распечатать фотошаблон печатной платы на прозрачной плёнке. У меня принтер струйный и плёнка, соответственно, специальная — с одной матовой стороной.

Шаблон нужен негативный — тот фоторезист, который засветится, станет прочным несмываемым рисунком.
Подготовим текстолит. Вырежем заготовку по размеру будущей платы. Заготовку я довёл до блеска сначала обычной мелкой шкуркой, а потом, как пишут, качественно её отмыл при помощи обычного Пемолюкса, который есть на любой кухне. В результате, как и должно быть, на плате стал оставаться тонкий слой воды.
После этого на плату нужно наклеить фоторезист. Технология примерно такая же, как при наклейке плёнки на экран мобильника — нужно не допустить попадания пылинок и образования воздушных пузырей. Снимаем с одной стороны фоторезиста защитную лавсановую плёнку и аккуратно приклеиваем, двигаясь с одной стороны платы.
Разглаживаем пальцами, выгоняем все воздушные пузырики. После несильно прогреваем плату обычным феном для волос и при помощи куска ткани с хорошим усилием придавливаем фоторезист по всей площади платы. Повторяем прогрев и разглаживание.

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

Выдержка — 50 секунд, но лучше подобрать экспериментально под свой принтер. Если недодержать — дорожки смоются. Если передержать — не смоется ничего. Засвеченный рисунок сильно потемнел.

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

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

Теперь плату можно травить обычным способом. После травления остатки фоторезиста легко смываются обычным средством «Крот» для прочистки канализации.
Дальше всё как обычно — сверлим отверстия, лудим, паяем. 
Итак, тестирование новой технологии можно считать удачным — магия получилась.
— Скорость. Перенос рисунка на медь занял меньше 15 минут. Хорошо тестовая плата простая, но ведь и на более сложных платах будет примерно такой же порядок времени. Дольше этот пост писался.
— Качество. Дорожки шириной 0.3 миллиметра и текст на плате получаются вообще без каких-либо проблем. Можно спокойно делать платы для планарных микросхем и SMD компонентов, что для меня всегда было совершенно запредельным умением.
— Доступность. Фоторезист и плёнка для принтера стоят очень дёшево, у меня получилось в районе 10 рублей за лист А4. Не нужны какие-то особенные редкие реактивы — сода и средство для чистки труб есть везде. Однажды напечатанный шаблон можно использовать сколько угодно раз. УФ лампу я купил на строительном рынке неподалёку.

Моддинговый стрелочный индикатор

Зачастую у энтузиастов моддинга возникает желание сделать стильный индикатор для собственного моддинг проекта, который бы мог отобразить такие рабочие свойства компьютера, как загрузка процессора, жесткого диска, а также сетевого подключения. Интернеты содержат достаточно много гайдов на эту тематику, разной степени сложности, с разными способами отображения важных параметров, но недавно я нашел отличный способ создания своими руками устройства для того, чтобы отобразить загрузку центрального процессора, жесткого диска, а также сетевой активности от шведского моддера и радиолюбителя под псевдонимом simoninns.
Общий вид стрелочного индикатора для моддинг проекта
Общий вид стрелочного индикатора для моддинг проекта
Здесь загрузка процессора и сетевого подключения отображается с помощью аналоговых стрелочных индикаторов (аналогично с Hi-FI аппаратурой). Аппарат имеет вид отдельного модуля, который к компьютеру подсоединяется с помощью самого обычного USB, однако, как уверяет автор, его можно встроить и в корпус компьютера.
Как же оно работает? Основу индикатора составляет микроконтроллер PIC18F2550, а в него заложена специальная программа, которую и составил автор данного девайса. В микроконтроллер PIC18F2550 от специальной программы (также составленной simoninns на основе Open Source решений) идет информация о параметрах работы компьютера. Затем микроконтроллер выводит параметры загрузки процессора и сети с помощью ШИМ/PWM (широтно-импульсной модуляции) на аналоговый вольтметр. Как загружается жесткий диск можно увидеть при помощи RGB светодиода. Причем по яркости свечения светодиода определятся степень нагрузки на жесткий диск, а по цвету свечения светодиода отображение операций (считывание или запись).
Для людей, не являющихся специалистами в компьютерной технике, описание устройства может показаться сложным, однако автор сделал все, чтобы девайс его смогли воспроизвести все, кто пожелает. В сеть он выложил детальный гайд, а также все необходимое — это программы, схемы, прошивки и т. д., чтобы человек, даже не обладающий специальными знаниями процесса программирования мог справиться с этим делом.

20 янв. 2014 г.

О практическом использовании микроконтроллеров AVR

В настоящее время при построении систем управления различным технологическим оборудованием все чаще стали использовать микроконтроллеры. Причем наиболее распространенными из них являются микроконтроллеры фирмы ATMEL. В работе рассматривается один из подходов практического использования микроконтроллера ATmega8 для решения трех практических задач:
1.Определение температуры с использованием датчика DS18B20 и в зависимости от ее значения моделирование управлением оборудованием.
2.Измерение постоянного напряжения в диапазоне от 0 до 15 вольт.
3. Измерение времени (цифровые часы).
         Принципиальная схема устройства для решения перечисленных задач представлена на рис.1.
Рис.1
         Для отображения информации о времени, измеряемом напряжении, температуре, используется жидкокристаллический индикатор с числом столбцов и строк  16х2 соответственно (LCD 16x20), который поддерживает систему команд, совместимую с контроллером HD44780 (фирма Hitachi) и его аналогами, например, KS0066 (фирма Samsung), SED1278 (фирма Epson), ST7066 (фирма Sitronix). В качестве микроконтроллера выбран ATmega8-16 илиATmega8L-8. Последняя модель отличается меньшей тактовой частотой (8МГц) и меньшим энергопотреблением. Для измерения температуры используется цифровой датчик DS18B20 температуры с точностью до 0,0625 C (при разрешающей способности температурного преобразователя 12 бит) и диапазоном от -55 до +125 С. Датчик с микроконтроллером сопрягается по протоколу 1wire. Иначе 1wire – это однопроводной интерфейс, позволяющий подключить к одной линии данных практически неограниченное количество периферии. Каждое устройство имеет уникальный 64-х битный идентификационный номер.
         При включении устройство на индикаторе отображает в течение 5 секунд свое назначение и далее в бесконечном цикле отображает время, постоянное напряжение любого подключенного источника питания в пределах от 0 до 15 вольт и температуру. Если температура превысит 32 градуса C (по представленной программе), загорается  светодиод (моделирование управлением оборудования). Если температура опускается ниже 32 градусов, светодиод гаснет (оборудование отключается).
         После изготовления устройства по схеме на рис.1. в микроконтроллер должна быть загружена программа с помощью программатора. В качестве программатора  был использован простой, но надежно работающий адаптер для COM порта (рис.2) и программа PonyProg ( http://www.lancos.com/prog.html )
 
Рис.2
         Программирование устройства (рис.1) выполнялось на языке Си. И если учесть, что в архитектуру AVR изначально были заложены принципы оптимизации Си-процедур, то альтернативы этому алгоритмическому языку нет.
         Для программирования микроконтроллера ATMega8 воспользуемся компилятором языка Си CodeVision AVR фирмы  HP InfoTech, Румыния (http://www.hpinfotech.ro/html/cvavr.htm).  Он популярен тем, что включает в себя
- Кросс-компилятор Си, обеспечивающий выполнение почти всех элементов языка Си, разрешенных архитектурой AVR;
- Интегрированную среду разработки, в состав которой входит программатор чипов AVR для автоматической пересылки кодов после компиляции в микроконтроллерный чип через адаптер, а также набор библиотек Си для работы с LCD модулями, температурными датчиками,  часами реального времени и т.д.;
- Автоматический генератор программ CodeWizardAVR, позволяющий написать за несколько минут весь код необходимый для выполнения таких функций, как инициализация таймеров/счетчиков, инициализация LCD, инициализация АЦП и др.
         Рассмотрим последовательно этапы программирования микроконтроллера для решения представленной выше задачи. Предположим, что пакет CodeVision AVR установлен на компьютере. В работе в качестве примера используется CodeVision AVR Version  1.25.8 Professional. Перед запуском программы CodeVision AVR создаем каталог, где будут храниться файлы.
1. Запускаем CodeVision AVR и выбераем пункт CodeWizardAVR:
2.Выбираем тип микроконтроллера и частоту:

3.Выбираем LCD и подключаем его к порту D:

Видно, что автоматически устанавливается соответствие между подключаемыми битами микроконтроллера и выводами LCD модуля.
4.Инициализируем шину 1Wire и температурный датчик DS1820, хотя по заданию используется датчик DS18B20. Это делается для подсказки вызова необходимых библиотек. Впоследствии в программе будут произведены необходимые замены. Датчик устанавливаем на 3-й бит порта C:

5.Заходим во вкладку Timers. Выбираем для ATMegaTimer 1:

В качестве источника тактовой частоты (Clock Source) выбираем System Clock, т.е. таймер будет тактироваться с частотой, на которой работает микроконтроллер (8MHz). Выберем тактовую частоту для таймера-счетчика (ClockValue) равную 7,813kHz. Она получается делением частоты работы микроконтроллера на коэффициент деления(1024). Включаем прерывание (Interrupt on), которое должно произойти, если в регистре A  появиться  значение, указанное в поле Comp.A. Поле Value  определяет начальное значение таймера-счетчика. Таким образом, наш таймер должен «тикнуть» 7813 раз, чтобы прошла ровно 1 секунда, если кварцевый резонатор идеально настроен на частоту 8 MHz. Однако при делении 8 MHz на делитель частоты 1024 получается 7.8125kHz. Поэтому в поле Comp.A необходимо поставить или 7812 или 7813 тактов (1e84 или 1e85 для шестнадцатеричной системы исчисления). Однако, как показал опыт с практически используемым кварцевым резонатором на 8 MHz, значение 7811 тактов оказалось наилучшим, что привело к опережению времени только на 1 секунду в сутки. Эта величина и установлена в программе после практической корректировки. Для получения наибольшей точности часов можно программно через каждые 24 часа от полученного времени отнимать 1 секунду.
6.Заходим последовательно в вкладки File -> GenerateSave and Exit:
Даем имена проекту и исходному файлу. В результате появится окно с текстом программы на языке Си:

7. Корректируем программу в окне текстом программы, который представлен ниже:
#include
#include
#include
#include
// Вставка ассемблерного кода (1 wire)
#asm
   .equ __w1_port=0x15 ;PORTC
   .equ __w1_bit=3
#endasm
#include <1wire .h="">
// Вставка ассемблерного кода (LCD)
#asm
   .equ __lcd_port=0x12 ;PORTD
#endasm
#include
#include // подключаем библиотеку задержки
#define VREF 5000 // Определяем опорное напряжение в миливольтах
unsigned int s; // переменная сек.
unsigned int m; // пересенная мин.
unsigned int h; // переменная часов
// Вызов функции обработки прерывания Timer 1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// Увеличиваем секунду на 1 в случае появления в регистре A числа 7813(изм. на 7811)
 TCNT1H=0;
 TCNT1L=0;
  s++;
}
void main(void)
{
// Declare your local variables here
int temp,temp3;       
float temp1,temp2,volt1;
unsigned long volt;
char lcd_volt[8],znak[2],lcd_buffer[16];
// Input/Output Ports initialization
// Port B initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTB=0xFF;
DDRB=0xFF;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x03;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7,813 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E; //  Частота работы таймера
OCR1AL=0x84; // Скорректирована на 7812 (1E84)
OCR1BH=0x00;
OCR1BL=0x00;
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// LCD module initialization
lcd_init(16);    // Инициализация LCD
// Глобальное разрешение прерываний
#asm("sei")  
w1_init(); // Инициализация линии 1 wire    
lcd_gotoxy(0,0);   // Позиционируем вывод на начало 1-й строки
lcd_putsf(" Time  Voltmetr"); // Выполняем вывод
lcd_gotoxy(0,1); // Позиционируем на начало 2-й строки   
lcd_putsf(" Termoregulator");  // Выполняем вывод
 DDRB.0=1;      // Переводим в режим вывода 0-й бит порта B
 PORTB.0=1;     // Устанавливаем на выходе 0 порта B логическую единицу
 delay_ms(5000); // Удерживаем вывод в течении 5 секунд
 lcd_clear();   // Очищаем экран LCD
  m=0;  // Обнуляем минуты
  h=0;  // и часы
  // Устанавливаем режим работы АЦП
  ADMUX &= 0xDF &  0x7F & 0xF2; ADMUX |= 0x40 | 0x02; // Разрядность 10бит, опорное напряжение AVCC Вольт,
  // внутренний источник опорного напряжения, линия PC2
  // ADCSRA &= 0xFE;
  ADCSRA |= 0x80 | 0x40 | 0x20 | 0x07; // Включить АЦП, запуск нового замера, постоянное измерение,
  //частота АЦП=8.0МГц/128
while (1) // Запуск бесконечного цикла измерений
  {    
           if (PINC.0==0) // если нажата первая кнопка (порт C бит 0)
           {
               m++; // к значению минуты добавляем единицу
           }
           if (PINC.1==0) // если нажата вторая кнопка  (порт C бит 1)
          {
              h++; // к значению часов добавляем единицу
           }
  // Условия часов.
            if(s==60) // если сек = 60
           {
              m++; // добавляем 1 к переменной "минута"
              s=0; // зануляем переменную "секунда"
           }
            if(m==60) // если мин = 60
            {
               h++; // добавляем 1 к переменной "час"
               m=0; // зануляем переменную "минута"
             }
      if (h==24) // так как у нас часы имеют 24 часовый формат
       { // при достыжении 24 часов, зануляем все переменные.
         h=0;
         m=0;
         s=0;
        }
  // Выводим переменные (время)
  lcd_gotoxy(0,0);
  lcd_putchar(h/10+0x30);
  lcd_putchar(h%10+0x30);
  lcd_putchar(':');
  lcd_putchar(m/10+0x30);
  lcd_putchar(m%10+0x30);
  lcd_putchar(':');
  lcd_putchar(s/10+0x30);
  lcd_putchar(s%10+0x30);
 // Определяем напряжение     
  volt=ADCL;
  volt += ((int)ADCH << 8);
  volt=volt*VREF/1024;
  volt1=volt/1000.0;
  volt1=3.224*volt1; // Вычисляем напряжение в соответсвии с выбранным делителем напряжения
  // Выводим напряжение
    sprintf(lcd_volt," U=%5.2f",volt1);
          lcd_puts(lcd_volt);              
 // Определяем и выводим температуру               
        temp1=ds18b20_temperature(0);  // Функция определения температуры для одног датчика 
         sprintf(znak,"+");
         if (temp1 < 0.0 ){ // Определяем знаки температуры
         temp1=-temp1;      
         sprintf(znak,"-");
         }
    // Формируем дробное значение температура при работе с целыми числами (это полезно
    // в целях экономии памяти)   
          temp=temp1;       
          temp2=temp1-temp; 
          temp3=100*temp2;       
          if (temp>=32){ // Если температура больше или равна 32 град.
            PORTB.0=0;   // Выставит ноль на нулевом выходе порта B (включится светодиод)
            } 
         if (temp<32 32="" nbsp="" o:p="">
         PORTB.0=1; // Выставит единицу на нулевом выходе порта B (выключится светодиод)
            }
        // Вывод температуры            
         lcd_gotoxy(0,1);
         sprintf(lcd_buffer," temp = %s%i.%i",znak,temp,temp3);                        
         lcd_gotoxy(0,1);
         lcd_puts(lcd_buffer);               
  }; // Закрыть бесконечный цикл     
}  // Закрыть программу main()
8. Выбираем закладку Project->Configure->C Compile и устанавливаем в поле (s)printf Features значения float,width,precision

9.Компилируем проект (команда Compile):
10. Собираем проект командой Make:
В каталоге, где расположена программы на Си, появится файл с расширением .hex, который необходимо будет переслать в микроконтроллер с помощью адаптера и программатора. Для этой цели воспользуемся программой-программатором PonyProg, которая должна быть предварительно установлена на компьютере со свободным COM портом. После установки PonyProg должна быть выполнена процедура ее калибровки. Для этого необходимо зайти в закладки Setup->Calibration  и нажать на Yes.
Рассмотрим следующие этапы использования программы PonyProg.
1.Запускаем программу и настраиваем интерфейс связи между компьютером и  микроконтроллером:
Указываем использование адаптера для связи с COM портом:
2.Открываем файл с расширением .hex
3.После загрузки файла заходим в закладку Command->Security and Configuration Bits и устанавливаем  фьюз-биты (биты конфигурации). Ниже на рисунке представлена заводская конфигурация фьюз-битов для ATMega8. Для нашей конфигурации необходимо снять все галочки и нажать на Write.
4.Выполняем передачу файла микроконтроллеру по команде Ctrl-P. Или можно зайти во вкладку Command и курсором мышки выбрать Program.  В случае успешной передачи программы в микроконтроллер должно появиться окно с надписью Program succesful. При программировании необходимо не забыть на устройство подать напряжение (10…15В). После ввода программы устройство должно сразу же заработать.
Выводы.
1.Показан на простом примере возможный способ управления с помощью  распространенных и недорогих микроконтроллеров технологическим оборудованием на основе таймера, температуры, напряжения.
2.На основании используемого пакета  CodeVision AVR показано, как просто и прозрачно на языке Си создается программное обеспечение для функционирования микроконтроллера фирмы Atmel.
3.Приведена схема простейшего надежно работающего адаптера и последовательность работы с программатором для пересылки откомпилированной программы в микроконтроллер.
Литература.
1. Рюмик С.М. Микроконтроллеры AVR. Ступень 1. http://forum.radiospec.ru/index.php?showtopic=5612 - 2007