История создания первого пикспьютера (пока не забылось и есть возможность восстановить) - частично в картинках:
02 ноября 2007: Решил принять участие в конкурсе журнала Circuit Cellar, посвящённый WizNET чипу W5100 (держит 4 сокета максимум с буферами по 2К на каждый и поддерживает "в железе" протоколы Ethernet: IEEE 802.3 10-BASE-T, IEEE 802.3u 100BASE-TX, MAC, PHY, TCP/IP: TCP, UDP, IPv4, ICMP, ARP, IGMP, PPPoE, допускает прямой доступ к памяти, непрямой доступ к памяти или работу по SPI). Заказал пару платок WIZ810MJ в Корее для экспериментов (2 x $12 + $30 = $54).
04 ноября 2007: Задумался над предназначением предполагаемого конкурсного устройства - выбрал тему сбора данных и передачи их по интернет. Требование конкурса - использовать коммерчески доступный микроконтроллер. Сразу же решил взять PIC в качестве микроконтроллера (но ещё не определился какой).
06 ноября 2007: Решил взять PIC17 в качестве микроконтроллера для конкурсного устройства (он всё ещё "коммерчески доступен"), чтобы получить стимул создать первый рабочий экземпляр пикспьютера, который давно планировал. Начал набрасывать маппинг памяти (8 окон по 8 Kwords) и примерную схему дешифратора адреса. Решил использовать оптопары для ввода фиксируемых данных, а также часы реального времени для сохранения точного времени считывания данных.
08 ноября 2007: Зарегистрировал в конкурсе свой проект под названием
"Remote digital I/O board". Описание:
Digital I/O-board with memory (2048 x 8 digital samples with full timestamps for each). Simple Web-interface to get collected data and to control the board (set time, change sample frequency, control outputs) through network. CPU will be PIC17C44 in microprocessor mode with external memory. Onboard RTC chip (real time clock) for collecting timestamps. I/O channels: 8 opto-isolated inputs and 2 high-voltage relays as outputs. Пришло подтверждение на участие - выдали номер 001098. Пришли WIZ810MJ (прямиком из Южной Кореи). Увидел, что разъём нестандартный (шаг 2 мм) и заказал у DigiKey шесть SMD-коннекторов для втыкания платки (нужно 2 для одной платы). Разработал формат текстового представления данных с метками даты и времени. Доработка маппинга памяти - присматриваюсь к GAL16V8 в качестве дешифратора адреса.
10 ноября 2007: Выложил первое описание схемы в этот топик: Первая версия платы "пикспьютера" будет с COM-портом, 8 Kwords ROM, 8 Kwords RAM, Real-Time Clock, Ethernet+TCP/IP и двумя NI-15, до мегавордов и исабаса пока не дорос...
11 ноября 2007: Приобрёл за $413 стандартный Eagle Layout + Schematic (160 x 100 мм, 4 слоя и 99 листов схем).
13 ноября 2007: Получил SMD-коннекторы для втыкания WIZ810MJ плат (шаг 2 мм).
02 декабря 2007: Стал набрасывать подключение PIC17F42A в PLCC-корпусе. Выбирал память (ОЗУ и ПЗУ), чтобы работала с 20-мегагерцовым PIC17 (должно быть как минимум 120 нс).
03 декабпя 2007: Закончил разработку предварительного маппинга памяти. Пока думаю использовать регистр и мелкую логику для окна 0 (там всегд должен быть ROM).
06 декабря 2007: Решил использовать 22V10 в качестве регистра и дешифратора адреса.
07 декабря 2007: Окончательно определился с адресами устройств в памяти и разработал "ручную" прошивку для 22V10.
10 декабря 2007: Из-за некоторых проблем с прошиваемостью GAL22V10 перешёл на 16V8 (надеясь использовать ATF16V8, который есть в списке поддерживаемых моим программатором). Снова потребовалась микросхема внешней мелкой логики - 4x2И для окна 0. Набросал схемы подключения оптопар и реле. А также вставил в схему две NI-15 и одну NI-23 (16-битный вариант NI-15).
15 декабря 2007: Закончил "ручное" программирование 16V8 для дешифратора адреса - см.
npc17v10.jed.
19 декабря 2007: Закончил разработку платы версии 1.0 в Eagle и заказал производство 4-х плат (всего $340).
20 декабря 2007: Обдумываю веб-интерфейс работы с устройством.
24 декабря 2007: Обнародовал на форуме окончательную спецификацию первого пикспьютера: PIC17C4X работающий на частоте 20 МГц, 64 Kwords ROM с переключением страниц по 8 Kwords, 8 Kwords RAM, MAX3232 и COM-порт, Real-Time Clock, Ethernet+TCP/IP, два разъёма NI-15, один разъём NI-23 (16-битный вариант NI-15), дешифратор адресов на 16V8, 8 оптопар, 2 реле (подключены напрямую к выводам PIC17 с открытым коллектором).
02 января 2008: Пришли недавно купленные ATF16V8 и как оказалось, мой программатор их не шьёт - пришлось взять старый PALCE16V8.
03 января 2008: Пришли платы - получилось долго из-за рождества и нового года.
09 января 2008: Припаял основные микросхемы (пока без WizNET, RTC, RS232, оптопар и реле). Оказалось, что подобранный мной SOIC-корпус для ОЗУ CY6264 оказался узковат - пришлось загибать ножки у микросхемы, чтобы она припаялась к своим контактным площадкам. Тестирую программой зашитой в ПЗУ, которая пишет #AA в порт B (к нему подключены 5 светодиодов что для WizNET припаяны). Оказалось, что незапрограммированный PIC17 требует внешний клок на OSC1, а не осциллятор как я сделал - пришлось навешивать TTL-генератор вместо кристалла, т.к. перепрограммировать PIC17 нет возможности.
10 января 2008: Начал составлять инклудник с макросами для PIC17 под названием
pixmacro.inc - начал с макросов
dealy1 и
delay2.
11 января 2008: Выяснилось, что по умолчанию PIC17 имеет вачдог (WDT), который в этой плате срабатывает каждые 12 мс. Расширил программу для ROM, тестирующую светодиоды и назвал её
pixtest1.asm. Задумал приделать к плате жидкокристаллический индикатор 16x2 в место подключения оптопар и реле для дальнейшей отладки.
12 января 2008: Пишу программу для дисплея.
13 января 2008: Добавил макрос
callw в
pixmacro.inc.
17 января 2008: Оживил дисплей - совсем забыл что A2 и A3 имеют открытый коллектор - всё заработало только после добавления подтягивающих резисторов на питание. Программа для ROM, выводящая слово "PIXPUTER" на дисплей называется
pixtest2.asm. Запланировал проверять периферию в следующем порядке: RS232, RTC, WizNET.
18 января 2008: Начал писать третий ROM-тест
pixtest3.asm в составе четырёх подтестов: тест 3-0 для чтения первых 8 байт нулевого окна (где находится первая страница ПЗУ) и вывод их на дисплей в hex-виде, тест 3-1 для чтения первых слов каждой страницы ПЗУ (через их переключение в окно 3) и вывода их на дисплей в hex-виде, тест 3-2 для тестирования записи и чтения в каждый байт RAM из доступных 8К (всегда в окне 2 адресного пространства - в диапазоне адресов #4000...#5FFF), тест 3-3 для тестирования запуска программ из других страниц ПЗУ (которые всегда выводятся в окно 3 адресного пространства - в диапазоне адресов #6000...#7FFF).
19 января 2008: Добавил макросы
memr, memrn, memrf, memw, memwn, memwf в
pixmacro.inc. Столкнулся с некорректной работой ROM-теста
pixtest3.asm. Из окна 3 адресного пространства - с адреса #6000 - всегда читалось последняя страница 64К-словного ПЗУ и запись ненулевого байта в регистр REG3ADR (который должен переключать окна ПЗУ в окне 3 адресного пространства) не приводило к желаемому результату - более того, программа зависала (тест 3-1 и тест 3-3). Как оказалось, я вместо 4x2И припаял 4x2ИЛИ, что привело к тому, что дешифратор адреса стал работать иначе - в регистр REG3ADR ничего кроме нуля писать стало нельзя (т.к. окно 0 перестанет держать код программы из начала ПЗУ), и по адресу #6000 теперь всегда видна последняя страница ПЗУ. С этим пока жить можно - как видно в исходном коде теста в обоих случаях закомменчена запись в REG3ADR.
20 января 2008: Добавил макросы
memwd, fcall, fcallw в
pixmacro.inc. Закончил третий ROM-тест
pixtest3.asm (с запретом записи в REG3ADR). Тест памяти ОЗУ прошёл успешно. Тест 3-3 как и ожидалось сразу же показывает, что по адресу #6000 раположена последняя страница ПЗУ.
24 января 2008: Готов первый вариант четвёртого ROM-теста
pixtest4.asm, тестирующего взаимодействие по последовательному порту (запись через опрос, чтение - через прерывание). Реализовал чтение из памяти по указанному адресу и вывод прочитанного слова в терминал. До момента окончания приёма проектов на конкурс остаётся ОДНА неделя...
25 января 2008: Добавил в четвёртый ROM-тест
pixtest4.asm возможности по чтению слов из памяти (частично уже было готово за день до этого), записи слов в память и запуск подпрограмм с произвольного адреса. После включения в терминале видим приглашение ввода ">". Сейчас поддерживаются следующие команды:
?HHHH - чтение одного слова по шестнадцатиричному адресу HHHH;
?HHHH=KKKK - чтение KKKK байтов (шестнадцатиричное число) по шестнадцатиричному адресу HHHH;
!HHHH - обнуление ячейки по шестнадцатиричному адресу HHHH;
!HHHH=KKKK....KKKK - запись шестнадцатеричных слов KKKK начиная с шестнадцатиричного адреса HHHH;
$HHHH - вызвать подпрограмму по адресу HHHH и вернуть управление на приглашение ввода. Вставил RTC чип DS1687-5 и с лёгкостью его завёл через этот интерфейс "вручную" (доступен с адреса #3000). Планирую на питоне написать программу по работе с этим интерфейсом - запись .hex файла программы в ОЗУ, проверка правильности и запуск...
26 января 2008: Добавил макросы
memr1, memr1n, memw1, memw1n, memw1d, fcallf в
pixmacro.inc. Написал программу на питоне
pixtest.py, которая берёт файл в HEX формате (имя файла задаётся прямо внутри питоновского кода), засылает в плату через COM-порт (используя команду записи в память), читает обратно (используя команду чтения из памяти), сверяет с оригиналом и если всё ок - запускает (используя команду запуска по произвольному адресу - в данном случае #4000). Сделана первая программа, запускаемая из RAM таким способом и пишущая HELLO на дисплей -
pixram1.asm (первый RAM-тест). Таким же способом была запущена микропрограммка по выводу текущего времени и даты на дисплей
pixram2.asm (второй RAM-тест).
27 января 2009: Собрал плату полностью - осталось воткнуть в панельки оптоизоляторы и реле, для чего сначала нужно убрать дисплей, подключенный к тем же ногам, но он мне пока нужен - чтобы победить WizNET. Через питон научился инициализировать сетевой чип (задавать MAC-адрес, IP-адрес, маску), однако обнаружилось, что он заводится крайне нестабильно - ping нормально отработал только однажды. В интернете удалось раздобыть информацию о том, что WizNET требует наличия железного сброса, которого у меня предусмотрено небыло, а это "0" длительностью не менее 2 uS на ногу RESET - пришлось в экстренном порядке резать дорожку и городить навесиком схемку из конденсатора, резистора и диода.
29 января 2008: Добавил макросы
memr1f, memw1f, incwf, decwf, saveb, savew в
pixmacro.inc. Внесены последние изменения в четвёртый ROM-тест
pixtest4.asm (RS-232). Начал разбираться с программированием WIZnet чипа. Разработал формат записи MAC-адреса, IP-адреса, порта, маски и gateway в CMOS-память RTC-чипа.
30 января 2008: Добавил макросы
addwfn, addwff, subwff, movff в
pixmacro.inc. Впервые связался с программным WEB-сервером через обычный браузер. Завершена корректировка инклудника с константами WIZnet -
wiznet.inc. Разработал интерфейс веб-взаимодействия (чтения записей и установки-сброса реле).
31 января 2008: К трём часам утра готов третий RAM-тест, проверяющий сетевой функционал -
pixram3.asm. Программа является простейшим WEB-сервером. Отключил дисплей и воткнул оптопары и реле. В полшестого утра закончил конкурсную прошивку
ioboard.asm, которая копит данные с указанной в настройках частотой (от 1 раза в секунду до 2^n - пределов возможностей не тестировал), а по запросу выдаёт табличку в обратном хронологическом порядке (данные сохраняются по кольцу - до 2048 записей с метками времени) со строками вида:
080131171603FF0, где первые 12 цифр это год, месяц, день, час, минута и секунда, а далее 2 шестнадцатиричных числа обозначающих байт из 8 оптоизолированных входов и одно шестнадцатироичное число показывающее состояние 2 релюшек. Кроме того можно через веб управлять реле - включать и выключать отдельными запросами. Плюс к этом плата продолжает отзываться на COM-порт со скоростью 9600 - работают теже три команды: чтение, запись и запуск. Через них можно поменять настройки сетевых интерфейсов в энергонезависимой памяти часов реального времени, откуда они берутся при старте платы и даже запретить сетевое взаимодействие совсем (вместе с запретом прерываний на семплирование данных). В последний момент закончил документацию и отправил работу на конкурс в 12:55 по местному времени...
