Это были, как Вы догадались, эпиграфы, то есть присказка, а $SUBJ, то есть сказка, сопсна, вот (во ссылочках там всяких я позволил себе невозбранно повоспиаривать лукоморье, ибо так надо):
Вы не поверите... Шёл 2011-ый год... Шёл себе и шёл, никого не трогал. И вдруг в один прекрасный понедельник ко мне (через трудно описуемую и длинную цепочку всяких знакомств и пр.) подкатились с некоей просьбишкой... наваять некую прогу для управления шаговыми двигателями... которые, в свою очередь, двигают поршни насосов... для чего-то там...
Разведав ситуацию, тыкскыть, на месте, я обнаружил, что...
Итак, вы не поверите ... :) Тщательно осмыслив всё это безобразие, я для начала проделал следующее:
А! Я понял, чо меня торкнуло "повоспиаривать лукоморье" - так именно там я и нашёл ссылочку на DOS Live CD. Оная, правда, битая на тот момент была, но эт мелочи.
Далее я совершил над выданным мне для решения задачонки ноутбуком некоторые действия, расценённые им (ноутбуком) как насильственные и зело развратные, а именно:
Тут надобно отметить, что Turbo C (точнее, евонная IDE) как-то не очень подружилась с FreeDOS (точнее, с его "расширителями", блин, DOS )... сначала вообще не запускалася, потом запустилася, но очень медленно компилировала.... вощщем, не стал я дальше этот вопрос мучать, для набора и компиляции использовал DOS Live CD, благо он флэшки неплохо жуёт.
В итоге за недельку сотворил $SUBJ, который работает по прерываниям от i8253, предварительно задав частоту канала #0 оного равной 20КГц (то есть квант - 50 usec). Обработчик прерывания irq0 (движок, стало быть) заведует формированием импульсов, которые подаются на драйверы шаговых двигателей и прочей всякой такой логикой. Основная, эээ, нить гг занимается опросом клавиатуры и отловом сообщений от движка насчет того, что шаговики оказались в крайних положениях. Неохота более подробно расписывать, если честно...
Кому интересен код, качаем, не стесняемся
... Эх, всё-таки не удержусь я от стёба над тем, что мне выдал т.наз. "заказчик" на этапе предварительного ознакомления с задачонкой. Имеется ввиду типа Си-код, который был накалякан (иного слова я не нахожу) бедолагой, имевшем несчастье быть чуть-чуть знакомым с языком программирования Си и с заказчиком.
Итак, глядим сюды (форматирование текста моё, иначе был бы ваще полный атас):
... short CalculateControl(short *a) { return ( 1 - a[0]) + 2 * (1 - a[1]) + 4 * a[2] + 8 * (1 - a[3]) + 16 * a[4] + 32 * a[5] + 64 * a[6] + 128 * a[7] ); } ... /* * далее, повсеместно внутри кучи всяких функций * (комментарий опять же мой) видим нечто... */ //шлем 1 на контрол short c[8]; c[0] = 1; c[1] = 0; c[2] = 0; c[3] = 0; c[4] = 0; c[5] = 0; c[6] = 0; c[7] = 0; Out32(addressControl, CalculateControl(c));
Что же мы тут видим? Мы тут видим какое-то жуткое извращение, прямо какое-то святотатство, какое-то надругательство над идеями разработчиков вычислительной техники и языков программирования (Деннис Ритчи уже как минимум раз 8 в гробу перевернулся...) Это ж надо было до такого "допереть"! Вы только поглядите, как формируется байтик, который нужно заслать в один из портов LPT! Собирается из младших битиков целых чисел, входящих в состав массива. И как? Умножениями и сложениями. Такое ведь даже в самом страшном сне присниться не может! Дальше - больше...
Что значит "1 - a[k]"?... Я минут через 10 пристального созерцания понял, что таким вот макаром инвертируются битики... мдя, про XOR, стало быть, мы тоже слыхом не слыхивали...
Короче... :) Утомился я баттоны топтать...CalculateControl() блин... Калкулээээйт!... это же круто, шерсть на носу... так и хочется по клямсам за некузявость набздымкать.
Нормальные люди, знакомые с шестнадцатеричной системой счисления, с побитовыми операциями, да и вообще умеющие писать клавиатурой с применением головы, пишут примерно вот так:
/* LPT ctrl port bits */ #define ENABLE_SMD_BIT 0 #define ENABLE_SMD (1 << ENABLE_SMD_BIT) #define GEN_OUT_BIT 1 #define GEN_OUT (1 << GEN_OUT_BIT) #define POWER_ON_BIT 2 #define POWER_ON (1 << POWER_ON_BIT) /* bits 0, 1 and 3 are inverted */ #define CTRL_INV_MASK 0x0B ... unsigned char pv; if (gen.active) { pv = POWER_ON; if (mact) pv |= ENABLE_SMD; if (!gen.tick) { pv |= gen.bit; pv ^= CTRL_INV_MASK; outportb(LPT_CTRL_PORT, pv);
---
Дата последней модификации: 2023-02-18