Это были, как Вы догадались, эпиграфы, то есть присказка, а $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