Сообщения

Сообщения за апрель, 2017

XControl V2 готов!

Изображение
Спустя несколько лет после выхода XControl появился XControl V2, который при то же цене сильно превосходит его по характеристикам. Сначала хотелось бы объяснить, из чего состоит сам проект. Изначально он так и назывался XControl, это была программа, которая могла опрашивать одно или несколько аппаратных блоков XControl. Затем, по мере роста, программа и устройство были разделены на 2 независимые части - устройство XControl V1 и программа XControl Dispatcher ( x-ctrl.net ), которая уже могла работать и с другими устройствами, других производителей. Теперь на замену XControl V1 пришел XControl V2. XControl V2 может успешно конкурировать с ПЛК в сегменте простых задач, так как имея возможность выполнения скрипта и поддержку промышленных стандартов, его цена составляет в среднем 55$, в то время как цена на другие ПЛК начинается от 160$.

STM32F1. Подлючение диспея nokia 1202 к аппаратному SPI

Есть у дисплеев данного типа одна особенность - длина "байта" у них 9 бит, что затрудняет подключение его к аппаратному SPI большинства микроконтроллеров. Так как я сторонник использования аппаратных ресурсов, а не "ножкодрыганий", то решил как то выкрутиться. Порывшись в инете, нашел несколько мыслей, суть в том, что надо паковать 9-битные данные в обычные 8-битные массивы, а потом будет передавать буфер. Соответственно, отправлять буфер на дисплей надо будет только после того, как в нем наберется 9 байт (8-битных), а если не набралось и надо отправить, тогда дополняем буфер NOP'ами.

ICMP запросы (Ping) на uIP

Стек uIP умеет только отвечать на ICMP запросы (если его пингуют, к примеру), но не умеет их отправлять. Исправим это. Составляем IP заголовок #define ICMPBUF ((struct uip_icmpip_hdr *)&uip_buf[UIP_LLH_LEN]) ICMPBUF->vhl = 0x45; ICMPBUF->tos = 0; uint16_t len = sizeof(struct uip_icmpip_hdr); // длина будет равна заголовку ip + icmp ICMPBUF->len[0] = len >> 8; ICMPBUF->len[1] = len & 0xff; uint16_t ipid = 0; ICMPBUF->ipid[0] = ipid >> 8; ICMPBUF->ipid[1] = ipid & 0xff; ICMPBUF->ipoffset[0] = ICMPBUF->ipoffset[1] = 0; ICMPBUF->ttl = UIP_TTL; ICMPBUF->proto = UIP_PROTO_ICMP; // указываем свой ip и ip удаленного устройства. uip_gethostaddr(ICMPBUF->srcipaddr); uip_ipaddr(&ICMPBUF->destipaddr, 192, 168, 1, 1); // адрес, который будем пинговать ICMPBUF->ipchksum = 0; ICMPBUF->ipchksum = ~(uip_ipchksum()); ICMPBUF->type = 8; //ICMP_ECHO; ICMPBUF->icode = 0; ICMPBUF->icmpchksum = 0; ICMPBUF->icmpchksum = uip_chks