Pull to refresh

Умные выключатели на основе 8051 ядра, с управлением по Ethernet, Ч. 1

Reading time4 min
Views12K
Доброго времени суток, уважаемые хабровчане!
Разрабатываемое устройство в чем-то повторяет IRemo: Tap, а также некоторые другие аналоги, о которых писалось уже на хабрахабре. Мой же вариант будет более простым и дешевым. Для коммуникаций я выбрал обычную витую пару, а для управления у устройства будет своя вебстраничка.
В данной статье описан первый этап-создание «мозгов» для будущего проекта.


Итак этап номер ноль


Всегда проще разбивать разработку сложных вещей на простые «кирпичики». Это называется по научному принципом модульности. Так что для начала подумаем, и разобьем нашу идею на блоки. Глобально во всем приборе я выделил 3 основных модуля: блок управления, блок коммутации и блок питания.

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

Расшифровка обозначений такая:
  • БП Блок питания,
  • БУ Блок управления,
  • Кн н-й коммутационный узел(наше устройство реализует только выключение и включение света).


Первый кирпич.


Первый этап.

Разработку первого кирпичика начинаем с выбора элементной базы. После ознакомления с микросхемами доступными на территории Украины, мною был выбран мк C8051F340-GQR(64кб флеша, 4кб ОЗУ, 10-битный АЦП, кроссбар позволяющий конфигурировать UART, АЦП и SPI на любые порты процессора, USB, 48Мгц тактовой частоты от встроенного источника, датчик температуры) в качестве «мозгов» проекта и микросхема CP2200-GQR в качестве езернет контроллера, который обеспечит нас скоростью до 10 мбит\сек(чего нам с головой хватит). Обе микросхемы существуют в корпусах TQFP-48, предназначенных для поверхностного монтажа. Более подробные характеристики в даташитах C8051F340 и CP2200.

Из остальных компонентов на первом этапе нам понадобиться Ethernet разъем с трансформатором 1:1, желательно интегрированным в сам разъем. Я выбрал HR911105A.

Второй этап.

Отлично микросхемы добыты(за езернет контроллером пришлось побегать, есть аналог CP2201 но он в корпусе QFN-28, а паять его немного трудновато). На данном этапе мы будем создавать принципиальную схему.
Вот что у меня получилось(изображение кликабельно):


Теперь некоторые пояснения:
  1. Начнем с соеденения мк и CP2200. Ситуация очень упрощается из-за наличия на борту интерфейса EMIF(Интерфейс внешней памяти) у обоих микросхем, ведь по сути дела CP2200 и есть навороченная память. По байту Р3 передается адрес, по байту Р4-данные, также бита Р1.7\не WR при установки в 0 микросхема понимает что мы в нее пишем по заданному адресу, а при установки бита Р1.6\не RD соответственно происходит чтение. Подключение взято с даташита, также резисторы R1-8 низковатные имеют номинал 1 КОм, и подтягивают к пины к значению логической единицы. Наличие их не обязательно.
    Остальные пины:
    • Р0.2\INT-сигнал тактирования, после установки в 1 микросхема начнет обрабатывать наш запрос
    • Р0.0\RES-сигнал сброса
    • Р0.1\CS-выбор микросхем, как позже выяснилось тоже можно было не разводить.
  2. Также обратите внимание на кварцевый резонатор Q2 он имеет номинал 20.000Мгц, его наличие обязательное(Q1 можно не устанавливать).
  3. С подключение разъема ethernet тоже сложностей нету, все подключение взято тоже из даташита. R14,R14,C16,C17 фильтр НЧ(номиналы приведены внизу статьи).
  4. Также я не забыл про юсб. Замыканием Х1.1 и Х1.2 Вы можете добиться питания от юсб, используя внутренний регулятор напряжения мк, но увы микросхему CP2200 Вы так не обеспечите питанием(ток на выходе мк до 100мА, требования CP2200 до 122мА при передачи).
  5. К Х6 подключается светодиод, который просто светиться и сигнализирует о наличие питания, на Х8 выведен транзисторный ключ на основе транзистора BC847, управляющий пин Р2.7, Вы можете подключить сюда светодиод. Очень помогло при отладки прошивки.
  6. На Х4 подается питание 3.3В. На Х2 можно также подать 5В для питания разных флешек и прочих юсб устройств в режиме когда мк ведущий. Х3 порты программатора С2. Остальные пины выведены на разъем Х5.

Третий этап.

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

Ну, а дальше экспортируем все в формат Gerber(рисунок платы, каждая сторона в своем файле), отверстия сохраняем в формате NC drill.
Если у вас не лицензионный альтиум, не забываем удалить все ссылки на ПО из гербер файлов, иначе Вас разведут на штраф(прецеденты были). По возможности пользуемся лицензионным ПО.
Получаем платы, собираем:
Верх:

Низ:

Обилие проводов связано с тем что я не знал какой будет использован программатор, предполагалось изначально подавать питание и данные с программатора, но увы я допустил пару ошибок при разводке программатора и он не заработал. Потому он был приведен к разъему используемого(заодно и макетная часть пригодилась).

Четвертый этап.

Без описания всех частей приводить пока код прошивки не буду, а прошьем туда стандартный пример от компании Silabs. Тут только одна проблема все примеры заточены под силабовский отладочный модуль, с приставкой CP2200DK. Отличия тут только в управляющих пинах, потому открываем файл main.c
Ищем функцию void PORT_Init (void) меняем ее код на:
void PORT_Init (void) 
{
   IT01CF = 0x02;                      // Enable Interrupt 0 on P0.3
   TCON &= ~0x01;                      // Make /INT0 level triggered

   XBR1    = 0x40;                     // Enable crossbar and enable
                                       // weak pull-ups

   P0MDOUT |= 0x10 | 0x1F;                    // enable UTX as push-pull output
   P1MDOUT |= 0xD8 | 0xFF;                    // /WR and /RD are push-pull
                                       
   P2MDOUT |= 0xFF;
   P3MDOUT |= 0xFF;
   P4MDOUT |= 0xFF;
}

Находим функцию void ether_reset_low() меняем на:
void ether_reset_low()
{

   P0 &= ~0x01;               // Pull reset low

}

Проделіваем тоже с void ether_reset_high():
void ether_reset_high (void)
{

   P0 |= 0x01;               // Allow /RST to rise
   while(!(P0 & 0x01));      // Wait for /RST to go high
}

Открываем mn_userconst.h
устанавливаем айпи адресс:
#define IP_SRC_ADDR  { 192, 168, 0, 6 }

в void main()
после port_init();
добавить
P0 &= ~0x02;//Cs=0

Далее идем в VFILE_DIR
правим index.html
Выполняем update.bat.
Таким образом из index.html сделается стандартный массив 16-ричных значений.
Компилим, собираем в hex файл, назначаем компу айпи-адрес в той же сети и прошиваем.
Пингуем:

Ну и заходим посмотреть на результат:

Если не пингуется-проверяем кабеля, код программы, а если совсем плохо-идем к знакомым, берем осцилограф и дебажим.

Ссылки:

  1. Переделанный пример, а также чертежи платы формате альтиума(10й версии) и перечень элементов в формате пдф:
  2. Даташиты(техническая документация):

Продолжение в следующих статьях.

Благодарю моих друзей за помощь в создании устройства и статьи.
Tags:
Hubs:
Total votes 67: ↑63 and ↓4+59
Comments38

Articles