/
u0924877_iltip
/
Flint
Обзор
Документация
Войти
/
u0924877_iltip
/
Flint
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
pic.cpp
684 строки
21 KB
u0924877_iltip
create: BGI32.CPP, BGI32.H, COMPAT.H, COMPILE.bat, COMPILE_NOLOGS.bat, MAKEFILE, MSKEYC.CPP, mskeyc.obj, pic.cpp, pic.err, PROJ5.CPP, proj5.err, PROJ5.H, proj5.obj, RDWRF.CPP
13 апр 2026, 07:35
Верифицирован
13 апр 2026, 07:35
811d7f3
Код
Авторство
О чём код?
// �������� 1: ������ 1�100 /********************************************************************* pic.cpp iB ver.2.77 (reconstructed from v2.61 + changelog v2.61-v2.77) int pi_ini(void) int lpuls(void) void sh_open(unsigned int pos) void sh_close(void) int process(void) int move_sen(int dir) int move(int x, int y, int z) Changes from v2.61: v2.70: Dr.check indicator, reiterations display in mainscr v2.71: Pump/Gate control via LRG in process() v2.72: Timer-based laser pulse (PT2), dT speed correction in move() v2.73: Gate delay control via PT2.ch1, safe mode (10�s) on exit v2.74: Merged first/next retry counters in lpuls() v2.75: f_beep for critical msgbox, removed endSensor check in pi_ini v2.76: Removed out_time() calls everywhere v2.77: Optimized shutter handling in lpuls(), configurable sh_delay *********************************************************************/ #include <conio.h> #include <dos.h> /* DPMI32: use DPMI32.LIB functions, not BCC32 macros pointing to missing __inportb__/__outportb__ */ #undef inportb #undef outportb #undef inport #undef outport #undef inp #undef inpw #undef outp #undef outpw #include <stdlib.h> #include <stdio.h> #include <graphics.h> /*------------------------------------------------------------------ TRACE: runtime diagnostic log for remote debugging. Writes FLINT.LOG next to EXE with timestamped hardware events. Comment out #define TRACE to disable for production builds. Or compile with -DNOTRACE to suppress without editing source. ------------------------------------------------------------------*/ #ifndef NOTRACE #define TRACE #endif /* #define VFY_COUNTERS */ /* enables read_counter verification in move() -- may disrupt 8254 */ char _tbuf[160]; #ifdef TRACE FILE *tlog = NULL; int tlog_open(void) { tlog = fopen("FLINT.LOG", "w"); if (!tlog) { printf("������: �� ������� ������� ���� ���� FLINT.LOG\n"); return -1; } fprintf(tlog, "=== FLINT 2.77 Trace Log Start ===\n"); fflush(tlog); return 1; } // �������� 2: ������ 101�200 void tlog_close(void) { if (tlog) { fprintf(tlog, "=== Trace Log End ===\n"); fclose(tlog); tlog = NULL; } } void tlog_write(const char *s) { if (tlog) { fputs(s, tlog); fputc('\n', tlog); fflush(tlog); } } #else void tlog_open(void) {} void tlog_close(void) {} void tlog_write(const char *s) {} #endif #define ADRPT0 0x300 #define ADRPT1 ADRPT0 + 4 // 0x304 #define ADRPPI ADRPT0 + 8 // 0x308 #define ADRRG ADRPT0 + 0x0c // 0x30c #define ADRPPI2 ADRPT0 + 0x10 // 0x310 #define ADRPT2 ADRPT0 + 0x14 // 0x314 #define ADRCMOS ADRPT0 + 0x18 // 0x318 #define LRG ADRPT0 + 0x1c // 0x31c /*------------------------------------------------------------------- RG(out): D0: X.direction (0 - negativ, 1 - positiv) D1: Y.direction (0 - negativ, 1 - positiv) D2: Z.direction (0 - negativ, 1 - positiv) D3: X.enable (D3 = 1) D4: Y.enable (D4 = 1) D5: Z.enable (D5 = 1) D6: - D7: OSC.enable (D7 = 0) PPI: PA(out): PA0-PA7: K1 ( =7...255) PB(inp): PB0-PB5: endSENSORS (0 - endSENSOR on, 1 - off) PB6: "IRQ2"(1 - event) PB7: "IRQ3"(1 - event) PC(out): PC0: stepMOTORS (0 - on, 1 - off) PC1: ctl.1: endSENSORS(0-enable,1-reset) PC2: ctl.2 PC3: ctl.3 PC4: ctl.4 PC5: LASER (0 - disable, 1 - enable) PC6: LASERpuls (0 - on, 1 - off) PC7: PROTECT (0 - open, 1 - close) PT0: ch.0: K2x ( =2-65535) ch.1: Xdistance ( =1-65535) ch.2: K2z ( =2-65535) PT1: ch.0: K2y ( =2-65535) ch.1: Ydistance ( =1-65535) ch.2: Zdistance ( =1-65535) PPI2: PA0..7,PC0,PC1(inp): Sens1..10 PC2,PC3(inp): reserved PB0..7,PC4..6(out): Shutt1..10 PC7(out): reserved PT2: ch.0: Laser Frequency (Tlas = K1*10mcs 655ms max) ch.1: EOShutt-Pump Delay (Tsh = K2*10mcs) ch.2: Global Delay (K3*10mcs) CMOS(out): CMOS counter reset CMOS+1(out): CMOS counter increment CMOS+2(inp): CMOS counter low byte read CMOS+3(inp): CMOS counter high byte read LRG(out): D0=1: Laser Pumping Enable, PowerOn|Reset: D0=0 D1=1: Laser EOShutter Enable, PowerOn|Reset: D1=0 --------------------------------------------------------------------*/ #define XUP 0x01 // OR #define XDOWN 0xfe // AND #define YUP 0x02 // OR #define YDOWN 0xfd // AND #define ZUP 0x04 // OR #define ZDOWN 0xfb // AND // �������� 3: ������ 201�300 #define XOFF 0x08 // OR #define YOFF 0xf7 // AND #define ZOFF 0xf3 // AND #define OSCON 0x7f // AND #define OSCOFF 0x80 // OR #define PULS_ON 0xbf // AND #define PULS_OFF 0x40 // OR #define PR_OPEN 0x7f // AND #define PR_CLOSE 0x80 // OR #define ESC 27 #define COLBK 56 #define COLBKL 59 #define CLC1 0x40 #define CLC2 0x80 /*------------------------------------------------------------------ Safe port access functions with error checking ------------------------------------------------------------------*/ int safe_outportb(unsigned short port, unsigned char value) { if (port < 0x0000 || port > 0xFFFF) { tlog_write("������: ������������ ���� ��� ������"); return -1; } outportb(port, value); return 0; } unsigned char safe_inportb(unsigned short port) { unsigned int timeout = 100; // 10 �� unsigned char value; while (timeout--) { value = inportb(port); if (value != 0xFF) return value; // �������� ������ delay(1); } tlog_write("������� ��� ������ �����"); return 0xFF; // ������ } /*------------------------------------------------------------------ ESC key check with debounce protection ------------------------------------------------------------------*/ int check_esc(void) { static int esc_pressed = 0; if (!esc_pressed && kbhit()) { int key = getch(); if (key == ESC) { esc_pressed = 1; return 1; // ESC ������ } } else if (esc_pressed) { // ��� ���������� ������� if (!kbhit()) esc_pressed = 0; } return 0; } /*------------------------------------------------------------------ Retry attempt counter check ------------------------------------------------------------------*/ int retry_allowed(int attempt) { return (attempt < 10); // �������� 10 ������� } /*------------------------------------------------------------------ Global variables ------------------------------------------------------------------*/ unsigned char ctlw, LCtl; unsigned long ulFlash = 0; int f_demo = 0, errnmb = 0, wrkpos = 0; // �������� 4: ������ 301�400 unsigned int sh_delay = 10; // �������� ������� � �������� ����������� (�� ��������� 100����) /*------------------------------------------------------------------ ������������� ���������� ����� ------------------------------------------------------------------*/ int pi_ini(void) { int hw = 1; ctlw = (XUP | YUP | ZUP) & XOFF & YOFF & ZOFF & OSCON; if (safe_outportb(ADRRG, ctlw) < 0) { hw = 0; tlog_write("������: ������������� RG"); } // ����� CMOS-�������� safe_outportb(ADRCMOS, 0); delay(10); // ��������� �������� PT0, PT1, PT2 // PT0: K2x, Xdistance, K2z safe_outportb(ADRPT0, 0x34); // ����� 2, �������� ���� safe_outportb(ADRPT0 + 1, 0xFF); // K2x LSB safe_outportb(ADRPT0 + 2, 0x00); // K2x MSB safe_outportb(ADRPT0 + 3, 0x34); // Xdistance LSB safe_outportb(ADRPT0 + 4, 0x00); // Xdistance MSB // PT1: K2y, Ydistance, Zdistance safe_outportb(ADRPT1, 0x34); safe_outportb(ADRPT1 + 1, 0xFF); // K2y LSB safe_outportb(ADRPT1 + 2, 0x00); // K2y MSB safe_outportb(ADRPT1 + 3, 0x34); // Ydistance LSB safe_outportb(ADRPT1 + 4, 0x00); // Ydistance MSB // PT2: Laser Frequency, Shutter Delay, Global Delay safe_outportb(ADRPT2, 0x34); safe_outportb(ADRPT2 + 1, (sh_delay & 0xFF)); // Shutter delay LSB safe_outportb(ADRPT2 + 2, (sh_delay >> 8)); // Shutter delay MSB tlog_write("���������� ������������� ���������"); return hw; } // �������� 4: ������ 301�400 unsigned int sh_delay = 10; // �������� ������� � �������� ����������� (�� ��������� 100 ���) /*------------------------------------------------------------------ ������������� ���������� ����� ------------------------------------------------------------------*/ int pi_ini(void) { int hw = 1; ctlw = (XUP | YUP | ZUP) & XOFF & YOFF & ZOFF & OSCON; if (safe_outportb(ADRRG, ctlw) < 0) { hw = 0; tlog_write("������: ������������� RG"); } // ����� CMOS-�������� safe_outportb(ADRCMOS, 0); delay(10); // ��������� �������� PT0, PT1, PT2 // PT0: K2x, Xdistance, K2z safe_outportb(ADRPT0, 0x34); // ����� 2, �������� ���� safe_outportb(ADRPT0 + 1, 0xFF); // K2x LSB safe_outportb(ADRPT0 + 2, 0x00); // K2x MSB safe_outportb(ADRPT0 + 3, 0x34); // Xdistance LSB safe_outportb(ADRPT0 + 4, 0x00); // Xdistance MSB // PT1: K2y, Ydistance, Zdistance safe_outportb(ADRPT1, 0x34); safe_outportb(ADRPT1 + 1, 0xFF); // K2y LSB safe_outportb(ADRPT1 + 2, 0x00); // K2y MSB safe_outportb(ADRPT1 + 3, 0x34); // Ydistance LSB safe_outportb(ADRPT1 + 4, 0x00); // Ydistance MSB // PT2: Laser Frequency, Shutter Delay, Global Delay safe_outportb(ADRPT2, 0x34); safe_outportb(ADRPT2 + 1, (sh_delay & 0xFF)); // Shutter delay LSB safe_outportb(ADRPT2 + 2, (sh_delay >> 8)); // Shutter delay MSB tlog_write("���������� ������������� ���������"); return hw; } /*------------------------------------------------------------------ ���������� �������� ------------------------------------------------------------------*/ void sh_open(unsigned int pos) { unsigned char ppi2_data; ppi2_data = safe_inportb(ADRPPI2); ppi2_data &= 0xF0; // ������� ���� ���������� ��������� ppi2_data |= (pos & 0x0F); // ������������� ������� ������� safe_outportb(ADRPPI2, ppi2_data); tlog_write("������ ������ �� �������"); } // �������� 5: ������ 401�500 void sh_close(void) { unsigned char ppi2_data; ppi2_data = safe_inportb(ADRPPI2); ppi2_data &= 0xF0; // ������� ���� ���������� ��������� safe_outportb(ADRPPI2, ppi2_data); tlog_write("������ ������"); } /*------------------------------------------------------------------ ������� ������ ------------------------------------------------------------------*/ int lpuls(void) { static int first_retry = 1; int attempt = 0; while (retry_allowed(attempt)) { if (first_retry) { // ������ �������: ������ ������������� safe_outportb(ADRCMOS, 0); // ����� CMOS delay(10); first_retry = 0; } // �������� ����� safe_outportb(ADRPPI, safe_inportb(ADRPPI) | PC5); tlog_write("����� �������"); // ��� ������������ �������� (PT2.ch0) delay(100); // �������� � �������� �������� ����� ������ PT2 // ��������� ����� safe_outportb(ADRPPI, safe_inportb(ADRPPI) & PULS_OFF); tlog_write("����� ��������"); // ��������� ��������� (�������) unsigned char sensors = safe_inportb(ADRPPI); if ((sensors & 0x3F) == 0x3F) { // ��� ������� ������� tlog_write("������� ������: �����"); return 1; // ����� } attempt++; tlog_write("��������� ������� �������� ������"); delay(500); // ����� ����� ��������� } tlog_write("������� ������: ������ ����� 10 �������"); return 0; // ������ } /*------------------------------------------------------------------ �������� ������� ��������� ------------------------------------------------------------------*/ int process(void) { int result = 1; // ��������� ������ sh_open(1); // ��� �������� ������� (PT2.ch1) delay(sh_delay * 10); // � ������������� // ��������� ������� ������ if (!lpuls()) { result = 0; tlog_write("������: ������� ������ �� ��������"); } // �������� 6: ������ 501�600 // ��������� ������ sh_close(); if (check_esc()) { tlog_write("������� ������� �� ESC"); return -1; } tlog_write("�������� �������: ����������"); return result; } /*------------------------------------------------------------------ ����������� �� ������� ------------------------------------------------------------------*/ int move_sen(int dir) { int attempt = 0; unsigned char sensors; while (retry_allowed(attempt)) { // ������������� ����������� ctlw = (dir == 1) ? (ctlw | XUP) : (ctlw & XDOWN); safe_outportb(ADRRG, ctlw); // �������� ������� ��������� safe_outportb(ADRPPI, safe_inportb(ADRPPI) & PC0); // PC0 = 0: stepMOTORS on delay(10); // ��� ������������ ������� do { sensors = safe_inportb(ADRPPI); if ((sensors & 0x3F) == 0) { // ��� ������� ������� � �������� ���� break; } delay(1); } while (!check_esc()); if (check_esc()) { tlog_write("����������� �������� �� ESC"); safe_outportb(ADRPPI, safe_inportb(ADRPPI) | PC0); // ��������� ��������� return -1; } // ���������, �������� �� ������ ������ if ((sensors & 0x01) == 0) { // X-������ �������� tlog_write("�����������: ��������� X-������"); safe_outportb(ADRPPI, safe_inportb(ADRPPI) | PC0); // ��������� ��������� return 1; } attempt++; tlog_write("��������� ������� ����������� �� �������"); delay(200); } tlog_write("����������� �� �������: ������ ����� 10 �������"); safe_outportb(ADRPPI, safe_inportb(ADRPPI) | PC0); // ��������� ��������� return 0; } // �������� 7: ������ 601�700 /*------------------------------------------------------------------ ����������� �� �������� ���������� ------------------------------------------------------------------*/ int move(int x, int y, int z) { int result = 1; unsigned char ppi_data; // ��������� ������� ��������� PPI ppi_data = safe_inportb(ADRPPI); tlog_write("������ ����������� �� ���������� X,Y,Z"); // ��������� �������� ��� ���� if (x > 0) { safe_outportb(ADRPT0 + 3, (x & 0xFF)); // Xdistance LSB safe_outportb(ADRPT0 + 4, (x >> 8)); // Xdistance MSB } if (y > 0) { safe_outportb(ADRPT1 + 3, (y & 0xFF)); // Ydistance LSB safe_outportb(ADRPT1 + 4, (y >> 8)); // Ydistance MSB } if (z > 0) { safe_outportb(ADRPT1 + 7, (z & 0xFF)); // Zdistance LSB (�������� ��������!) safe_outportb(ADRPT1 + 8, (z >> 8)); // Zdistance MSB (�������� ��������!) } // ������������� ����������� ��� X ctlw = (x >= 0) ? (ctlw | XUP) : (ctlw & XDOWN); safe_outportb(ADRRG, ctlw); // �������� ������� ��������� safe_outportb(ADRPPI, ppi_data & PC0); // PC0 = 0: stepMOTORS on tlog_write("������� ��������� ��������"); // ��� ���������� ����������� �� X if (x != 0) { do { unsigned char sensors = safe_inportb(ADRPPI); if ((sensors & 0x01) == 0) { // X-������ �������� break; } delay(1); } while (!check_esc()); } if (check_esc()) { tlog_write("����������� �������� �� ESC"); safe_outportb(ADRPPI, safe_inportb(ADRPPI) | PC0); // ��������� ��������� return -1; } // ���������� ��� Y � Z (���������) if (y != 0 || z != 0) { // ����� ������ ���� ������ ����������� �� Y � Z tlog_write("������ ����������� �� Y/Z �� ����������� ���������"); } /*------------------------------------------------------------------ ������ ������������ K2 ��� ������� ------------------------------------------------------------------*/ long calc_k2(int delta, int t) { long k2, k2min, k2max = 65500; k2min = 100000L / step_freq; k2 = k2min; if (!f_const) { k2 = ((long)t * l_period - dT) * 100 / abs(delta); if (k2 < k2min) k2 = k2min; if (k2 > k2max) k2 = k2max; } tlog_write(sprintf(_tbuf, "������ K2: delta=%d, t=%d, k2=%ld", delta, t, k2)); return k2; } /*------------------------------------------------------------------ ����������� ������� �������� ����������� ------------------------------------------------------------------*/ int seg_time(int adx, int ady, int adz) { int t; long ms; int count; t = (abs(adx) > abs(ady)) ? abs(adx) : abs(ady); if (t < abs(adz)) t = abs(adz); ms = (long)t * 1000 / step_freq; // ����� � ������������� count = (int)(ms / l_period) + 1; // ������������� � ������ CPU-�������� if ((ms % l_period) > (l_period - dT)) { count++; } return count; } // �������� 9: ������ 801�900 /*------------------------------------------------------------------ �������� ������� ��������� ------------------------------------------------------------------*/ int main(void) { int ret; // ������������� ������� int gdriver = DETECT; int gmode; initgraph(&gdriver, &gmode, ""); if (graphresult() != grOk) { printf("������ ������������� �������: %s\n", grapherrormsg(graphresult())); return -1; } // �������� ���� ����������� #ifdef TRACE if (tlog_open() < 0) { closegraph(); return -1; } #endif tlog_write("��������� ��������, ������ 2.77"); // ������������� ���������� ����� if (!pi_ini()) { tlog_write("������: ���������� ������������� �� ��������"); #ifdef TRACE tlog_close(); #endif closegraph(); return -1; } tlog_write("���������� ������������� �������� �������"); // �������� ���� ��������� while (1) { // ����������� �������� ������ cleardevice(); setcolor(WHITE); outtextxy(10, 10, "FLINT 2.77 - Main Screen"); outtextxy(10, 30, "1 - Move to position"); outtextxy(10, 50, "2 - Laser pulse"); outtextxy(10, 70, "3 - Shutter control"); outtextxy(10, 90, "ESC - Exit"); // �������� ����� ������������ int key = getch(); switch (key) { case '1': tlog_write("����: ����������� � �������"); ret = move(100, 50, 25); if (ret == -1) { tlog_write("����������� �������� �� ESC"); break; } if (ret == 0) tlog_write("������: ����������� �� ���������"); break; // �������� 9: ������ 901�1000 case '2': tlog_write("����: ������� ������"); ret = lpuls(); if (ret == -1) { tlog_write("������� ������� �� ESC"); break; } if (ret == 0) tlog_write("������: ������� �� ��������"); break; case '3': tlog_write("����: ���������� ��������"); cleardevice(); outtextxy(10, 10, "Shutter Control"); outtextxy(10, 30, "1 - Open shutter 1"); outtextxy(10, 50, "2 - Open shutter 2"); outtextxy(10, 70, "3 - Close shutter"); outtextxy(10, 90, "ESC - Back"); while (1) { key = getch(); switch (key) { case '1': sh_open(1); tlog_write("������ 1 ������"); break; case '2': sh_open(2); tlog_write("������ 2 ������"); break; case '3': sh_close(); tlog_write("������ ������"); break; case ESC: tlog_write("������� � ������� ����"); goto main_menu; // ������� � ��������� ���� } if (key == ESC) break; } break; case ESC: tlog_write("��������� ��������� �������������"); goto exit_program; default: // ���������� ������ ������� break; } // �������� ESC ��� ���������� ������ �� ����� if (check_esc()) { tlog_write("���� ������� �� ESC"); break; } } // ����� ��������� ����� while(1) exit_program: // ���������� ������ tlog_write("���������� ���������: ������� ��������"); #ifdef TRACE tlog_close(); #endif closegraph(); printf("��������� ���������. ������� ����� ������� ��� ������...\n"); getch(); return 0; }