From 6443a7dbf458b3255730e046898d86f9ab44312d Mon Sep 17 00:00:00 2001 From: eddyem Date: Thu, 23 Jul 2015 13:44:53 +0300 Subject: [PATCH] init on github --- .gitignore | 6 + 02-TEST/Frontend/FE.c | 389 ++++++++++++++++++++++++++++++ 02-TEST/Frontend/main.c | 275 ++++++++++++++++++++++ 02-TEST/Frontend/signals.h | 39 ++++ 02-TEST/main.c | 274 ++++++++++++++++++++++ 02-TEST/main1.c | 242 +++++++++++++++++++ 02-TEST/run | 3 + 02-TEST/signals.h | 50 ++++ 03-focusing/Frontend/FE.c | 413 ++++++++++++++++++++++++++++++++ 03-focusing/Frontend/Makefile | 18 ++ 03-focusing/Frontend/signals.h | 44 ++++ 03-focusing/main.c | 227 ++++++++++++++++++ 03-focusing/main1.c | 242 +++++++++++++++++++ 03-focusing/run | 3 + 03-focusing/signals.h | 55 +++++ opisanie.pdf | Bin 0 -> 140087 bytes opisanie.tex | 416 +++++++++++++++++++++++++++++++++ pins.pdf | Bin 0 -> 52223 bytes 18 files changed, 2696 insertions(+) create mode 100644 .gitignore create mode 100644 02-TEST/Frontend/FE.c create mode 100644 02-TEST/Frontend/main.c create mode 100644 02-TEST/Frontend/signals.h create mode 100644 02-TEST/main.c create mode 100644 02-TEST/main1.c create mode 100755 02-TEST/run create mode 100644 02-TEST/signals.h create mode 100644 03-focusing/Frontend/FE.c create mode 100644 03-focusing/Frontend/Makefile create mode 100644 03-focusing/Frontend/signals.h create mode 100644 03-focusing/main.c create mode 100644 03-focusing/main1.c create mode 100755 03-focusing/run create mode 100644 03-focusing/signals.h create mode 100644 opisanie.pdf create mode 100644 opisanie.tex create mode 100644 pins.pdf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e12707a --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +*~ +*.bak +*.bck +*.o +.hg* +.dropbox.attr diff --git a/02-TEST/Frontend/FE.c b/02-TEST/Frontend/FE.c new file mode 100644 index 0000000..2b405d9 --- /dev/null +++ b/02-TEST/Frontend/FE.c @@ -0,0 +1,389 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "signals.h" // определения сигналов связи + +#define C_NO 224 // номер контроллера (старшие 3 бита) +int BAUD_RATE = B9600; + +struct termio oldtty, tty; // флаги для UART +struct termios oldt, newt; // флаги для консоли +//struct serial_struct old_extra_term; +int comfd; // Файловый дескриптор порта +char *comdev = "/dev/ttyS0"; // Устройство порта (потом переделать для запроса) + +void tty_sig(unsigned char rb); + +unsigned char crc(unsigned char data){ + unsigned char crc = data & 1; + unsigned int i; + for(i = 1; i<8; i++) crc ^= (data >> i) & 1; + return crc; +} + +void quit(int ex_stat){ // выход из программы + tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); // возвращаем консоль в начальное состояние (на всякий случай) + ioctl(comfd, TCSANOW, &oldtty ); // восстанавливаем режим работы com + close(comfd); // закрываем соединение + printf("Выход... (сигнал %d)\n", ex_stat); + exit(ex_stat); +} + +void tty_init(){ + printf("\nОткрываю порт...\n"); + if ((comfd = open(comdev,O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0){ + fprintf(stderr,"Can't use port %s\n",comdev); + quit(1); + } + printf(" OK\nПолучаю текущие настройки порта...\n"); + ioctl(comfd,TCGETA,&oldtty); // Узнаем текущие параметры порта + tty = oldtty; + tty.c_lflag = 0; // ~(ICANON | ECHO | ECHOE | ISIG) + tty.c_iflag = BRKINT; // подготовка к 9битной передаче + tty.c_oflag = 0; + tty.c_cflag = BAUD_RATE|CS8|CREAD|CLOCAL|PARENB; // 9.6к, 8N1, RW, игнорировать контр. линии + tty.c_cc[VMIN] = 0; // не канонический режим + tty.c_cc[VTIME] = 5; // (без символов ВК и пр.) + if(ioctl(comfd,TCSETA,&tty)<0) exit(-1); // Устанавливаем текущие параметры порта + printf(" OK\n"); +} + +unsigned char read_tty(unsigned char *byte){ + *byte = 0; + fd_set rfds; // набор файловых дескрипторов + struct timeval tv; // время ожидания + int retval; // возвращаемое ф-й select значение + tty.c_iflag &= ~PARODD; + ioctl(comfd,TCSETA,&tty); +// Ждем, сигнала с порта + FD_ZERO(&rfds); // очищаем набор + FD_SET(comfd, &rfds); // теперь это - свойства порта + tv.tv_sec = 0; tv.tv_usec = 50000; // ждем + retval = select(comfd + 1, &rfds, NULL, NULL, &tv); + if (!retval) return 0; // если сигнала нет, возвращаем ноль + if(FD_ISSET(comfd, &rfds)){ +// printf("ready "); + if(read(comfd, byte, 1) < 1) return 0; // ошибка считывания + } + else return 0; // ошибка +/* if(*byte == 8){ + return 0; + + } + else*/ +// printf("считан: %d (команда %d)\n", *byte, *byte & 0x1f); + return 1; +} + +unsigned char read_console(){ // считываем данные с консоли + unsigned char rb; + struct timeval tv; + int retval; + tcgetattr( STDIN_FILENO, &oldt ); // открываем терминал для реакции на клавиши без эха + newt = oldt; + newt.c_lflag &= ~( ICANON | ECHO ); + tcsetattr( STDIN_FILENO, TCSANOW, &newt ); + fd_set rfds; + FD_ZERO(&rfds); + FD_SET(STDIN_FILENO, &rfds); // 0 - стандартный вход + tv.tv_sec = 0; tv.tv_usec = 10000; // ждем 0.01с + retval = select(1, &rfds, NULL, NULL, &tv); + if (!retval) rb = 0; + else { + if(FD_ISSET(STDIN_FILENO, &rfds)) rb = getchar(); + else rb = 0; + } + tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); + return rb; +} + +unsigned char mygetchar(){ // аналог getchar() без необходимости жать Enter + unsigned char ret; + do ret = read_console(); + while(ret == 0); + return ret; +} + +void write_tty_raw(unsigned char wb){ + if(crc(wb)) // нечетная сумма + tty.c_cflag |=PARODD; // 9-й бит = 0 + else + tty.c_cflag &= ~PARODD; // = 1 + ioctl(comfd,TCSETA,&tty); // перенастраиваем порт + if(write(comfd, &wb, 1) < 0) err("Ошибка! Запись не удалась :(\n"); // и пишем в него байт +} + +void write_tty(unsigned char wb){ + unsigned char tmp = wb; + tmp &= 0x1f; // на всякий случай очищаем от мусора + tmp |= C_NO; // добавляем к команде + write_tty_raw(tmp); +} + +int send_cmd(unsigned char cmd){ // посылка контроллеру команды с контролем + unsigned char rtn=ERR_CMD, byte=0, i=0; + while(i<2 && rtn != 1){ + write_tty(cmd); + usleep(100000); + rtn = read_tty(&byte); + byte &= 0x1f; + i++; + } + if(byte != cmd){ + printf("\n\n!!!!!! Ошибка! Контроллер не отвечает (ответ %d на команду %d) !!!!!\n\n", byte, cmd); + return 0; + } + else return 1; +} + +void sendword(unsigned int data){ + unsigned char tmp,i=0,rr=0, ret; + tmp = (data >> 8) & 0xFF; + if(crc(tmp)) // нечетная сумма + tty.c_cflag &= ~PARODD; // 9-й бит = 0 + else + tty.c_cflag |= PARODD; // = 1 + ioctl(comfd,TCSETA,&tty); // перенастраиваем порт + write(comfd, &tmp, 1); + do{ i++; + usleep(10000); + ret = read_tty(&rr); rr &= 0x1F; + }while((ret == 0 || rr != OK) && i < 10 ); + if(rr != OK){ err("Ошибка записи"); return;} + i = 0; + tmp = data & 0xFF; + if(crc(tmp)) // нечетная сумма + tty.c_cflag &= ~PARODD; // 9-й бит = 0 + else + tty.c_cflag |= PARODD; // = 1 + ioctl(comfd,TCSETA,&tty); // перенастраиваем порт + write(comfd, &tmp, 1); + do{ i++; + usleep(10000); + ret = read_tty(&rr); rr &= 0x1F; + }while((ret == 0 || rr != OK) && i < 10 ); + if(rr != OK){err("Неудача"); return;} +} + +void send_seq(){ + unsigned char seq[1024], byte; + char *line; + int cntr = 0, n, sz = 9; + line = (char*) malloc(10); + printf("\nВводите числа по одному в строке, окончание - слово end\n"); + do{ + n = getline(&line, &sz, stdin); + if(n == 0 || strstr(line, "end") != NULL) break; + seq[cntr++] = (unsigned char)atoi(line); + }while(cntr < 1024); + printf("\nНачинаю передачу\n"); + for(n=0; n>=1; + } + bin[8]=0; +} + +void tty_sig(unsigned char rb){ // обработка сигналов с контроллера + char bin[9]; + dec2bin(rb, bin); + switch(rb){ + case ERR_CMD: printf("Ошибка (\e[1;31;40m%d\e[0m?)\n", ERR_CMD); break; + case OK: printf("OK (\e[1;31;40m%d\e[0m?)\n", OK); break; + default: printf("\e[1;31;40m%d\e[0m\t(%s)\n", rb, bin); + } +} + +int main(int argc, char *argv[]){ + unsigned char rb, byte, i = 0; // считанные данные, счетчик + tty_init(); + rb = ERR_CMD; + signal(SIGTERM, quit); // kill (-15) + signal(SIGINT, quit); // ctrl+C + signal(SIGQUIT, SIG_IGN); // ctrl+\ . + signal(SIGTSTP, SIG_IGN); // ctrl+Z + setbuf(stdout, NULL); + printf("\nИнициализация...\n"); + do{ + write_tty(INIT); // Инициализация контроллера + rb = read_tty(&byte); + usleep(100000); + i ++; + } + while(i<3 && rb != 1); // проверка связи + if(i > 2 || (byte&0x1f) != INIT){ + fprintf(stderr,"\n!!!!!! Ошибка: контроллер не отвечает (%d) !!!!!!\n", byte); + } + else printf(" OK\n"); + while(1){ // бесконечно зацикливаемся + rb = read_console(); + if(rb != 0) con_sig(rb); // если что-то появилось - обрабатываем + rb = read_tty(&byte); + if(rb != 0) tty_sig(byte); // если есть сигнал с контроллера - обрабатываем + + } +} diff --git a/02-TEST/Frontend/main.c b/02-TEST/Frontend/main.c new file mode 100644 index 0000000..25eb978 --- /dev/null +++ b/02-TEST/Frontend/main.c @@ -0,0 +1,275 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "signals.h" // определения сигналов связи +#include "func.h" // функции обработки сигналов, глобальные переменные +#include "keys.h" // клавишные команды +#include "killbrothers.h" +#include "queues.h" + +#define CMSPAR 010000000000 +extern int get_auth_level(); +FILE* outfile; + +double tm0, tm; // время в секундах + +struct termio oldtty, tty; // флаги для UART +int comfd = -1; // Файловый дескриптор порта +static char *comdev = "/dev/ttyS1"; // Устройство порта (потом переделать для запроса) + +unsigned char crc(unsigned char data){ + unsigned char crc = data & 1; + unsigned int i; + for(i = 1; i<8; i++) crc ^= (data >> i) & 1; + return crc; +} + +double dtime(){ + struct timeval tv; + struct timezone tz; + int ret; + double t; + ret = gettimeofday(&tv, &tz); + t = (double)tv.tv_sec + (double)tv.tv_usec*0.000001; + t -= timezone; + return(t); +} + +void quit(int ex_stat){ // выход из программы + unsigned char i; + err("Отключаюсь..."); + if(comfd > 0){ + for(i=0; i<8; i++) + stop_motor(i<<5, "0"); // останавливаем двигатель + ioctl(comfd, TCSETA, &oldtty); // восстанавливаем режим работы com + close(comfd); // закрываем соединение + } + rm_queues(); + exit(ex_stat); +} + +void tty_init(){ + if ((comfd = open(comdev,O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0) + die("Can't use port %s\n",comdev); + ioctl(comfd,TCGETA,&oldtty); // Узнаем текущие параметры порта + tty = oldtty; + tty.c_lflag = 0; + tty.c_iflag = BRKINT;//|PARENB|CMSPAR; + tty.c_oflag = 0; + tty.c_cflag = B9600|CS8|CREAD|CLOCAL|PARENB;//|CMSPAR; + tty.c_cflag &= ~PARODD; + tty.c_cc[VMIN] = 0; + tty.c_cc[VTIME] = 1; + ioctl(comfd,TCSETA,&tty); +} + +unsigned char read_tty(){ // считываем 1 байт (с ожиданием сигнала) + unsigned char rb; // то, что считываем + tty.c_iflag &= ~PARODD; // принимаем с девятым битом = 0 + ioctl(comfd,TCSETA,&tty); + if(read(comfd, &rb, 1) < 1) return 0; // ошибка считывания + tm = dtime() - tm0; + tm0 = dtime(); + fprintf(stderr,"считан сигнал: %d с контроллера %d, время от предыдущего считывания: %f с\n", rb&0x1F, rb&0xE0, tm); + return rb; +} + +void write_tty_raw(unsigned char wb){ + if(crc(wb)) // нечетная сумма + tty.c_cflag |=PARODD; // 9-й бит = 0 + else + tty.c_cflag &= ~PARODD; // = 1 + ioctl(comfd,TCSETA,&tty); // перенастраиваем порт + if(write(comfd, &wb, 1) < 0) err("Ошибка! Запись не удалась :(\n"); // и пишем в него байт +} + +void write_tty(unsigned char wb, unsigned char cno){ + unsigned char tmp = wb; + tmp &= 0x1f; // на всякий случай очищаем от мусора + tmp |= cno; // добавляем к команде + write_tty_raw(tmp); +} + +int send_cmd(unsigned char cmd, unsigned char flag, unsigned char cno){ // посылка контроллеру команды с контролем + // flag = 1 - команда отсылается текущему контроллеру, 0 - по запросу + int ret = -1; + unsigned char rtn=0, i=0, cmd1; + cmd1 = (flag)? ((cmd&0x1F)|cno) : cmd; + while(i<10 && rtn != cmd1){ // 10 попыток + usleep(1000); + if(flag) write_tty(cmd, cno); + else write_tty_raw(cmd); + usleep(100000); + rtn = read_tty(); + i++; + } + if(rtn != cmd1) + err("!!!!!! Ошибка! Контроллер не отвечает !!!!!"); + else ret = (i<2)?1:0; + return ret; +} + +void sendword(unsigned int data){ + unsigned char tmp,i=0,rr=0; + tmp = (data >> 8) & 0xFF; + if(crc(tmp)) // нечетная сумма + tty.c_cflag &= ~PARODD; // 9-й бит = 0 + else + tty.c_cflag |= PARODD; // = 1 + ioctl(comfd,TCSETA,&tty); // перенастраиваем порт + do{ i++; + if(write(comfd, &tmp, 1) < 0){continue;} + usleep(10000); + rr = read_tty() & 0x1F; + }while(rr != OK && i < 10); + if(rr != OK){ err("Ошибка записи"); return;} + i = 0; + tmp = data & 0xFF; + if(crc(tmp)) // нечетная сумма + tty.c_cflag &= ~PARODD; // 9-й бит = 0 + else + tty.c_cflag |= PARODD; // = 1 + ioctl(comfd,TCSETA,&tty); // перенастраиваем порт + do{ i++; + if(write(comfd, &tmp, 1) < 0){continue;} + usleep(10000); + rr = read_tty() & 0x1F; + }while(rr != OK && i < 10); + if(rr != OK){err("Неудача"); return;} +} + +/* +int getl(int fd, char* data, int N){ + int rb = 0, i=0; + char *ptr = data; + do{ + if((rb = read(fd, ptr, 1)) != 1) break; + if(*ptr == '\0' || *ptr == '\n') break; + ptr++; + }while(++i < N); + if(rb != 1 && i == 0) return (-1); + *ptr = '\0'; + return i; +}*/ + +void tmrset(unsigned char cno){ + unsigned char t_h,t_l; + float period; + if(send_cmd(TMR_SETTINGS, 1, cno)<0) return; + usleep(10000); + read(comfd, &t_h, 1); + usleep(10000); + read(comfd, &t_l, 1); + period = (65536.0 - 256.0*(float)t_h - (float)t_l)/125000.0; + warn("Период таймера: T=%f", period); +} + +void init_ctrlr(unsigned char cno){ + unsigned char rb = ERR_CMD; + unsigned char ini = INIT | cno; + int i=0; + warn("Инициализация..."); + do{ + write_tty(INIT, cno); // Инициализация контроллера + rb = read_tty(); + usleep(100000); + i++; + } + while(i<10 && rb != ini); // проверка связи + if(i > 9 || rb != ini){ + err("!!!!!! Ошибка: контроллер не отвечает !!!!!!"); + } + else{ + warn("... успешно."); + } +} + +void con_sig(unsigned char cno, unsigned char rb, char *val){ // обработка сигналов с консоли + //fprintf(stderr, "key: %c, cno: %d, val:%s\n", rb, cno, val); + switch(rb){ + case KEY_QUIT: quit(0); break; + case KEY_DEVICE: set_dev(cno, val); break; + case KEY_LEFT: rotate_left(cno, val); break; + case KEY_RIGHT: rotate_right(cno, val); break; + case KEY_NR: steps_(cno,RIGHT, val); break; + case KEY_NL: steps_(cno,LEFT, val); break; + case KEY_STOP: stop_motor(cno, val); break; + case KEY_VOLTAGE: set_voltage(cno, val); break; + case KEY_TMR: set_timer(cno, val); break; + case KEY_TMR_STOP: send_cmd(STOP_TIMER, 1, cno); break; + case KEY_TMR_STNGS: tmrset(cno); break; + case KEY_INIT: init_ctrlr(cno); break; + case KEY_Xplus: corrector(cno,0, val); break; + case KEY_Xminus: corrector(cno,1, val); break; + case KEY_Yplus: corrector(cno,2, val); break; + case KEY_Yminus: corrector(cno,3, val); break; + case KEY_MIDDLE: goto_middle(cno); break; + case KEY_TEST: send_cmd(TEST,1, cno); break; + +/* default: send_cmd(rb, 0); // спец. команда (для выделенных контроллеров) + data = read_int(); + if(data != -1) sendword(data); */ + } +} + +void tty_sig(unsigned char rb){ // обработка сигналов с контроллера + unsigned char cno = rb & 0xE0; + rb &= 0x1F; + switch(rb){ + case TERMINAL_: terminals(cno); break; // обработка концевиков + case STACK_OVERFLOW: error(STACK_OVERFLOW, cno); break; // переполнение стека RX контроллера + case NO_STOP_BIT: error(NO_STOP_BIT, cno); break; + } +} + +int main(int argc, char *argv[]){ + unsigned char rb, key;// считанные данные, счетчик + char *val; + setbuf(stdout, NULL); + printf("Content-type: multipart/form-data; charset=koi8-r\n\n"); + if(!killbrothers()) die("Не могу гарантировать монопольный доступ.."); + printf("Перехожу в режим демона\n"); + umask(0); + mk_queues(); + val = calloc(512, 1); + tty_init(); + close(0); close(1); close(2); // отключаемся от терминала + if(fork() != 0) exit(0); // закрываем родительский поток + if(argc > 1){ //comdev = argv[1]; + if(strcmp(argv[1], "XY") == 0){ + warn("Режим XY-актуаторов\n"); + if(init_motor(MOTOR_X)==0){ // двигатель Y + err("Y: Ошибка !"); + } + if(init_motor(MOTOR_Y)==0){ // двигатель X + err("X: Ошибка!"); + } + } + } + else + warn("Обычный режим работы"); + signal(SIGTERM, quit); // kill (-15) + signal(SIGINT, quit); // ctrl+C + signal(SIGQUIT, SIG_IGN); // ctrl+\ . + signal(SIGTSTP, SIG_IGN); // ctrl+Z + tm0 = dtime(); + while(1){ // бесконечно зацикливаемся + if(read_queue(&rb, &key, val) > 0){ + if(key != 0) con_sig(rb, key, val); // если что-то появилось - обрабатываем + } + rb = read_tty(); + if(rb != 0) tty_sig(rb); // если есть сигнал с контроллера - обрабатываем + } +} + diff --git a/02-TEST/Frontend/signals.h b/02-TEST/Frontend/signals.h new file mode 100644 index 0000000..aee6ac9 --- /dev/null +++ b/02-TEST/Frontend/signals.h @@ -0,0 +1,39 @@ +/*********** Перечень команд ************/ +// получить с компьютера два байта данных и записать их в SPI +#define SPI_send 1 +// режимы работы SPI +#define IMP_RISE 2 +#define IMP_FALL 3 +#define SPI_ON 4 +#define SPI_OFF 5 +#define SPI_ACTIVE 6 +#define SPI_PASSIVE 7 +#define MID_DATA 8 +#define END_DATA 9 + +#define SPI_SHOW 14 + +// скорости порта (по умолчанию 9600) +#define MID_SPD 15 +#define HIG_SPD 16 +// записать в порт один полученный байт +#define SPI_send_one 17 +// текущий период таймера +#define TMR_SETTINGS 18 +// установить значение таймера +#define SET_TIMER 26 +// сброс +#define INIT 28 +#define TEST 29 +/************** Ошибки и сигналы контроллера ******************/ +// все в порядке +#define OK 22 +// нет стопового бита +#define NO_STOP_BIT 24 +// переполнение регистров +#define STACK_OVERFLOW 25 +// ошибочкая команда +#define ERR_CMD 31 + +#define TWOBYTE 33 // двухбайтная посылка + diff --git a/02-TEST/main.c b/02-TEST/main.c new file mode 100644 index 0000000..7480b3b --- /dev/null +++ b/02-TEST/main.c @@ -0,0 +1,274 @@ +#include +#include "signals.h" +#define BUFSIZE 95 +//#define CLRWDT _asm clrwdt _endasm; +typedef unsigned int word; +word at 0x2007 CONFIG = 0x3F72; // для WDT: 0x3F76 +unsigned char + cmd, // полученная команда + d_H, d_L, // старший и младший байты двухбайтной посылки + T1H, T1L, // значения регистров счетчика таймера 1 + mC_addr; // физ. адрес контроллера (константа, устанавливается функцией init) + +unsigned char SPI_buf[BUFSIZE], SPI_cntr; + +void send9bit(unsigned char something){ + unsigned char tmp; + something &= 0x1F; // сброс старших трех бит (там будет адрес) + tmp = mC_addr | something; + TXEN = 1; // готов к передаче + TX9D = 0; // 0 - передает контроллер + TXREG = tmp; // послать команду +} + +unsigned char get9bit(){ + unsigned char err1, err2, flag9bit, tmp; + while(!RCIF); + flag9bit = RX9D; + err1 = FERR; err2 = OERR; // считать 9-й бит и ошибки + cmd = RCREG; // очистить буфер данных + RX9D = 0; + if(err1 == 1){ +// send9bit(NO_STOP_BIT); // не обнаружен стоповый бит + return NO_STOP_BIT; + } + if(err2 == 1){ +// send9bit(STACK_OVERFLOW); // переполнение приемных регистров + CREN = 0; CREN = 1; // сбросить флаг ошибки + return STACK_OVERFLOW; + } + if(flag9bit) return TWOBYTE; // данные - часть двухбайтной посылки (неизвестно еще чьей :) ) + tmp = cmd & 0xE0; // выделение адреса из команды + cmd &= 0x1F; // обнуление адресных битов + if(tmp != mC_addr) return ERR_CMD; // если адресован чужому + send9bit(cmd); // Эхо принятой команды + return OK; +} + +void sendword(unsigned char data_H, unsigned char data_L){ + RCIE = 0; // disable USART in interrupt + TMR1IE = 0; + TXEN = 1; + TX9D = 1; + TXREG = data_H; + while(!TRMT); + TXEN = 1; + TX9D = 1; + TXREG = data_L; + RCIE = 1; + TMR1IE = 1; +} + +unsigned char getword(){ + unsigned char ret = 0; + RCIE = 0; // disable USART in interrupt + TMR1IE = 0; + if(ten_times_read()){ + d_H = cmd; + if(ten_times_read()){ + d_L = cmd; + ret = 1;}} // если оба байта считали правильно + TMR1IE = 1; + RCIE = 1; // enable USART in interrupt + return ret; +} + +unsigned char ten_times_read(){ // 10 попыток чтения для двухбайтного приема + unsigned char i=0; + do i++; + while(get9bit() != TWOBYTE && i < 10); + if(i > 9){send9bit(ERR_CMD); return 0;} + send9bit(OK); + return 1; +} + +void init(){ // инициализация +// Настройка USART'a +// TXSTA: | CSRC | TX9 | TXEN | SYNC | N/A | BRGH | TRMT | TX9D | + TXSTA = 0x66; // (11000110): master, 9-ти битный ввод/вывод, async, hi-speed, ready +// SPBRG - скорость передачи + SPBRG = 25; // 9.6 кб/с +// RCSTA: | SPEN | RX9 | SREN | CREN | ADDEN | FERR | OERR | RX9D | + RCSTA = 0xD0; // ( 11010000): enable, 9bit, continuous mode +// настройка портов: + PORTA = 0; // 6-ти битный аналогово/цифровой порт (0..5 биты) +// ADCON1: | ADFM | N/A | N/A | N/A | PCFG3 | PCFG2 | PCFG1 | PCFG0 | + ADCON1 = 0x06; // Аналогово/цифровой порт работает в полностью цифровом режиме + TRISA = 0; // направление порт А (1-вход, 0-выход) + TRISB = 0xff; // --/ B /-- +// OPTION_REG: | !RBPU | INTEDG | TOCS | TOSE | PSA | PS2 | PS1 | PS0 | + OPTION_REG = 0x7f; /* (01111111) 0 - подключение подтяжек на порт B (уст. лог. 1), + прерывание по нарастающему фронту RB0, + таймер 0 работает по сигналу с RA4 + таймер 0 увеличивается при спаде сигнала на RA4 + предделитель подключен к сторожевому таймеру + режим prescaler: 1:128 */ + TRISC = 0xC0; // (11000000) - 0..5 биты как выходы + INTCON = 0; // отключить все прерывания + T1CON = 0; +// PIE1: | PSPIE | ADIE | RCIE | TXIE | SSPIE | CCP1IE | TMR2IE | TMR1IE | + PIE1 = 0x20; // (00100000): enable USART(in) +// PIE2: все N/A, кроме EEIE (PIE2.4) + PIE2 = 0; // & disable other int.s + PORTB = 0; +// INTCON: | GIE | PEIE | T0IE | INTE | RBIE | T0IF | INTF | RBIF | + INTCON = 0xC0; // (1100000) - включить глобальные прерывания, прерывания по периферии + PORTC = 0; // без напряжения + PORTA = 0xF; // (00001111) +// получение адреса + mC_addr = PORTB; // физический адрес устройства + mC_addr &= 0xE0; // выделение физического адреса + SSPEN = 0; SSPIE = 1; + SPI_cntr = 0; +} + +void timer1set(){ // установка таймера +// unsigned int tmp = 0xffff - usec/8; + T1CON = 0; // выключить таймер + TMR1IF = 0; // сбросить флаг прерывания + TMR1IE = 1; // разр/запр прерывание + TMR1H = T1H = d_H; //(tmp >> 8) & 0xff; + TMR1L = T1L = d_L; //tmp & 0xff; // установить счетчики +// T1CON: | - | - | T1CPS1 | T1CPS0 | T1OSCEN | T1SYNC | TMR1CS | TMR1ON | + T1CON = 0x31; // (00110001) - включить таймер 1, предделитель на 1/8 (250 кГц) +} + +void timer1int(){ // обработка прерываний первого таймера + T1CON = 0; + TMR1H = T1H; TMR1L = T1L; +// send9bit(TEST); + T1CON = 0x31; // снова запускаем таймер +} + +void SPI_int(){ // в пассивном режиме принимаемые данные сохраняются в +// буфер, при заполнении буфера он отсылается на ПК + unsigned char i; + if(SSPOV == 1) // ошибка переполнения буфера + return; + if(BF == 0) return; // буфер не заполнен + SSPIE = 0; + TMR1IE = 0; + RCIE = 0; + SPI_buf[SPI_cntr++] = SSPBUF; + if(SPI_cntr == BUFSIZE){ + for(i = 0; i < BUFSIZE; i++){ + TXEN = 1; + TXREG = SPI_buf[i]; + while(!TRMT); + } + SPI_cntr = 0; + } +// BF = 0; + RCIE = 1; + TMR1IE = 1; + SSPIF = 0; + SSPIE = 1; +} + +/* +void SPI_int(){ + SSPIE = 0; + if(SSPOV == 1) // ошибка переполнения буфера + return; + if(BF == 0) return; // буфер не заполнен + RCIE = 0; + TMR1IE = 0; + TXEN = 1; + TXREG = SSPBUF; // отправляем полученный байт +// while(!TRMT); + RCIE = 1; + TMR1IE = 1; + BF = 0; + SSPIF = 0; + SSPIE = 1; +}*/ + + +void write_SPI(unsigned char byte){ + SSPBUF = byte; + //PORTA &= 0xEF; // -SS = 0 - передаем данные по SPI ведомому + while(!SSPIF); // ждем окончания передачи +// SPI_int(); + + if(SSPOV == 1) // ошибка переполнения буфера + return; + //if(BF == 0) return; // буфер не заполнен + SSPIE = 0; + RCIE = 0; + TMR1IE = 0; + TXEN = 1; + TXREG = SSPBUF; // отправляем полученный байт + while(!TRMT); + RCIE = 1; + TMR1IE = 1; +// BF = 0; + SSPIF = 0; + SSPIE = 1; +} + +void show_spi(){ + unsigned char i; + SSPIE = 0; + RCIE = 0; + TMR1IE = 0; + TXEN = 1; + TXREG = SPI_cntr; + while(!TRMT); + if(SPI_cntr > 0) + for(i = 0; i < SPI_cntr; i++){ + TXEN = 1; + TXREG = SPI_buf[i]; + while(!TRMT); + } + SPI_cntr = 0; + TMR1IE = 1; + BF = 0; + SSPIF = 0; + SSPIE = 1; +} + +void on_interrupt() __interrupt 0{ // обработка прерываний + if(RCIF == 1){ // поступило прерывание от USART + if(get9bit() != OK) return; + switch(cmd){ + case INIT: init(); break; + case SET_TIMER: if(getword()) timer1set(); + else send9bit(ERR_CMD); + break; + case TMR_SETTINGS: sendword(T1H, T1L); break; + case SPI_send: if(getword()){ + write_SPI(d_H); + write_SPI(d_L);} + break; + case SPI_send_one: while(!RCIF); write_SPI(RCREG); break; + case IMP_RISE: CKE = 1; break;//данные передаются по заднему фронту + case IMP_FALL: CKE = 0; break; //данные передаются по переднему фронту + case MID_DATA: SMP = 0; break; + case END_DATA: SMP = 1; break; + case SPI_ON: // SPI + // SSPCON: | WCOL | SSPOV | SSPEN | CKP | SSPM3 | SSPM2 | SSPM1 | SSPM0 | + SSPEN = 1; // (00110010) - выключить SPI, высокий уровень CLK (CKP=1), частота Fosc/64 + // SSPSTAT: | SMP | CKE | - | - | - | - | - | BF | +// SSPSTAT = 0; // режим работы SPI: SMP=0 - опрос входа в середине периода + // CKE=0 - данные передаются по заднему фронту + SSPIE = 1; break; + case SPI_OFF: SSPEN = 0; SSPIE = 0; break; + case SPI_ACTIVE: SSPCON = 0x32; TRISC = 0xD0; CKE = 0; SSPIE = 1; break; //TRISC = 0xC0 + case SPI_PASSIVE: SSPCON = 0x35; TRISC = 0xD8; CKE = 0; SSPIE = 1; break;//TRISC=255; + case HIG_SPD: SPBRG = 1; break; // 115200 + case MID_SPD: SPBRG = 12; break; // 19200 + case TEST: T1CON = 0; TMR1IF = 0; break; + case SPI_SHOW: show_spi(); break; + } + } + if(TMR1IF == 1) // поступило прерывание от таймера + timer1int(); // обработать прерывание + if(SSPIF == 1) // прерывание от SPI + SPI_int(); // обрабатываем +} + +void main(){ // основной цикл + init(); + while(1){}; +} + diff --git a/02-TEST/main1.c b/02-TEST/main1.c new file mode 100644 index 0000000..a208de6 --- /dev/null +++ b/02-TEST/main1.c @@ -0,0 +1,242 @@ +#include +#include "signals.h" +//#define CLRWDT _asm clrwdt _endasm; +typedef unsigned int word; +word at 0x2007 CONFIG = 0x3F72; // для WDT: 0x3F76 +unsigned char + cmd, // полученная команда + d_H, d_L, // старший и младший байты двухбайтной посылки + T1H, T1L, // значения регистров счетчика таймера 1 + mC_addr; // физ. адрес контроллера (константа, устанавливается функцией init) + +unsigned char SPI_buf[64], SPI_cntr; + +void send9bit(unsigned char something){ + unsigned char tmp; + something &= 0x1F; // сброс старших трех бит (там будет адрес) + tmp = mC_addr | something; + TXEN = 1; // готов к передаче + TX9D = 0; // 0 - передает контроллер + TXREG = tmp; // послать команду +} + +unsigned char get9bit(){ + unsigned char err1, err2, flag9bit, tmp; + while(!RCIF); + flag9bit = RX9D; + err1 = FERR; err2 = OERR; // считать 9-й бит и ошибки + cmd = RCREG; // очистить буфер данных + RX9D = 0; + if(err1 == 1){ +// send9bit(NO_STOP_BIT); // не обнаружен стоповый бит + return NO_STOP_BIT; + } + if(err2 == 1){ +// send9bit(STACK_OVERFLOW); // переполнение приемных регистров + CREN = 0; CREN = 1; // сбросить флаг ошибки + return STACK_OVERFLOW; + } + if(flag9bit) return TWOBYTE; // данные - часть двухбайтной посылки (неизвестно еще чьей :) ) + tmp = cmd & 0xE0; // выделение адреса из команды + cmd &= 0x1F; // обнуление адресных битов + if(tmp != mC_addr) return ERR_CMD; // если адресован чужому + send9bit(cmd); // Эхо принятой команды + return OK; +} + +void sendword(unsigned char data_H, unsigned char data_L){ + RCIE = 0; // disable USART in interrupt + TMR1IE = 0; + TXEN = 1; + TX9D = 1; + TXREG = data_H; + while(!TRMT); + TXEN = 1; + TX9D = 1; + TXREG = data_L; + RCIE = 1; + TMR1IE = 1; +} + +unsigned char getword(){ + unsigned char ret = 0; + RCIE = 0; // disable USART in interrupt + TMR1IE = 0; + if(ten_times_read()){ + d_H = cmd; + if(ten_times_read()){ + d_L = cmd; + ret = 1;}} // если оба байта считали правильно + TMR1IE = 1; + RCIE = 1; // enable USART in interrupt + return ret; +} + +unsigned char ten_times_read(){ // 10 попыток чтения для двухбайтного приема + unsigned char i=0; + do i++; + while(get9bit() != TWOBYTE && i < 10); + if(i > 9){send9bit(ERR_CMD); return 0;} + send9bit(OK); + return 1; +} + +void init(){ // инициализация +// Настройка USART'a +// TXSTA: | CSRC | TX9 | TXEN | SYNC | N/A | BRGH | TRMT | TX9D | + TXSTA = 0x66; // (11000110): master, 9-ти битный ввод/вывод, async, hi-speed, ready +// SPBRG - скорость передачи + SPBRG = 25; // 9.6 кб/с +// RCSTA: | SPEN | RX9 | SREN | CREN | ADDEN | FERR | OERR | RX9D | + RCSTA = 0xD0; // ( 11010000): enable, 9bit, continuous mode +// настройка портов: + PORTA = 0; // 6-ти битный аналогово/цифровой порт (0..5 биты) +// ADCON1: | ADFM | N/A | N/A | N/A | PCFG3 | PCFG2 | PCFG1 | PCFG0 | + ADCON1 = 0x06; // Аналогово/цифровой порт работает в полностью цифровом режиме + TRISA = 0; // направление порт А (1-вход, 0-выход) + TRISB = 0xff; // --/ B /-- +// OPTION_REG: | !RBPU | INTEDG | TOCS | TOSE | PSA | PS2 | PS1 | PS0 | + OPTION_REG = 0x7f; /* (01111111) 0 - подключение подтяжек на порт B (уст. лог. 1), + прерывание по нарастающему фронту RB0, + таймер 0 работает по сигналу с RA4 + таймер 0 увеличивается при спаде сигнала на RA4 + предделитель подключен к сторожевому таймеру + режим prescaler: 1:128 */ + TRISC = 0xC0; // (11000000) - 0..5 биты как выходы + INTCON = 0; // отключить все прерывания + T1CON = 0; +// PIE1: | PSPIE | ADIE | RCIE | TXIE | SSPIE | CCP1IE | TMR2IE | TMR1IE | + PIE1 = 0x20; // (00100000): enable USART(in) +// PIE2: все N/A, кроме EEIE (PIE2.4) + PIE2 = 0; // & disable other int.s + PORTB = 0; +// INTCON: | GIE | PEIE | T0IE | INTE | RBIE | T0IF | INTF | RBIF | + INTCON = 0xC0; // (1100000) - включить глобальные прерывания, прерывания по периферии + PORTC = 0; // без напряжения + PORTA = 0xF; // (00001111) +// получение адреса + mC_addr = PORTB; // физический адрес устройства + mC_addr &= 0xE0; // выделение физического адреса + SSPEN = 0; SSPIE = 0; + SPI_cntr = 0; +} + +void timer1set(){ // установка таймера +// unsigned int tmp = 0xffff - usec/8; + T1CON = 0; // выключить таймер + TMR1IF = 0; // сбросить флаг прерывания + TMR1IE = 1; // разр/запр прерывание + TMR1H = T1H = d_H; //(tmp >> 8) & 0xff; + TMR1L = T1L = d_L; //tmp & 0xff; // установить счетчики +// T1CON: | - | - | T1CPS1 | T1CPS0 | T1OSCEN | T1SYNC | TMR1CS | TMR1ON | + T1CON = 0x31; // (00110001) - включить таймер 1, предделитель на 1/8 (250 кГц) +} + +void timer1int(){ // обработка прерываний первого таймера + T1CON = 0; + TMR1H = T1H; TMR1L = T1L; +// send9bit(TEST); + T1CON = 0x31; // снова запускаем таймер +} + +void SPI_int(){ // в пассивном режиме принимаемые данные сохраняются в +// буфер, при заполнении буфера он отсылается на ПК + unsigned char i; + TMR1IE = 0; + RCIE = 0; + SPI_buf[SPI_cntr++] = SSPBUF; + if(SPI_cntr == 64){ + for(i = 0; i < 64; i++){ + TXEN = 1; + TXREG = SPI_buf[i]; + while(!TRMT); + } + SPI_cntr = 0; + } + RCIE = 1; + TMR1IE = 1; + BF = 0; + SSPIF = 0; +} + + + +/* +void SPI_int(){ + SSPIE = 0; + if(SSPOV == 1) // ошибка переполнения буфера + return; + if(BF == 0) return; // буфер не заполнен + RCIE = 0; + TMR1IE = 0; + TXEN = 1; + TXREG = SSPBUF; // отправляем полученный байт +// while(!TRMT); + RCIE = 1; + TMR1IE = 1; + BF = 0; + SSPIF = 0; + SSPIE = 1; +} +*/ + +void write_SPI(unsigned char byte){ + SSPBUF = byte; + //PORTA &= 0xEF; // -SS = 0 - передаем данные по SPI ведомому + while(!SSPIF); // ждем окончания передачи +// SPI_int(); + + RCIE = 0; + TMR1IE = 0; + TXEN = 1; + TXREG = SSPBUF; // отправляем полученный байт + RCIE = 1; + TMR1IE = 1; + BF = 0; + SSPIF = 0; +} + +void on_interrupt() __interrupt 0{ // обработка прерываний + if(RCIF == 1){ // поступило прерывание от USART + if(get9bit() != OK) return; + switch(cmd){ + case INIT: init(); break; + case SET_TIMER: if(getword()) timer1set(); + else send9bit(ERR_CMD); + break; + case TMR_SETTINGS: sendword(T1H, T1L); break; + case SPI_send: if(getword()){ + write_SPI(d_H); + write_SPI(d_L);} + break; + case SPI_send_one: while(!RCIF); write_SPI(RCREG); break; + case IMP_RISE: CKE = 1; break;//данные передаются по заднему фронту + case IMP_FALL: CKE = 0; break; //данные передаются по переднему фронту + case MID_DATA: SMP = 0; break; + case END_DATA: SMP = 1; break; + case SPI_ON: // SPI + // SSPCON: | WCOL | SSPOV | SSPEN | CKP | SSPM3 | SSPM2 | SSPM1 | SSPM0 | + SSPEN = 1; // (00110010) - выключить SPI, высокий уровень CLK (CKP=1), частота Fosc/64 + // SSPSTAT: | SMP | CKE | - | - | - | - | - | BF | +// SSPSTAT = 0; // режим работы SPI: SMP=0 - опрос входа в середине периода + // CKE=0 - данные передаются по заднему фронту + SSPIE = 0; break; + case SPI_OFF: SSPEN = 0; SSPIE = 0; break; + case SPI_ACTIVE: SSPCON = 0x32; TRISC = 0x10; CKE = 0; SSPIE = 0; break; //TRISC = 0xC0; + case SPI_PASSIVE: SSPCON = 0x35; TRISC = 0x18; CKE = 0; SSPIE = 1; break;//TRISC = 255; + case HIG_SPD: SPBRG = 1; break; // 115200 + case MID_SPD: SPBRG = 12; break; // 19200 + case TEST: T1CON = 0; TMR1IF = 0; break; + } + } + if(TMR1IF == 1) // поступило прерывание от таймера + timer1int(); // обработать прерывание + if(SSPIF == 1) // прерывание от SPI + SPI_int(); // обрабатываем +} + +void main(){ // основной цикл + init(); + while(1){}; +} + diff --git a/02-TEST/run b/02-TEST/run new file mode 100755 index 0000000..61eb4d8 --- /dev/null +++ b/02-TEST/run @@ -0,0 +1,3 @@ +#!/bin/sh +sdcc -V -mpic14 -p16f873a main.c +#packihx main.ihx > main.hex diff --git a/02-TEST/signals.h b/02-TEST/signals.h new file mode 100644 index 0000000..6a42ea6 --- /dev/null +++ b/02-TEST/signals.h @@ -0,0 +1,50 @@ +/*********** Функции ***********************/ +void send9bit(unsigned char something); +unsigned char get9bit(); +void sendword(unsigned char data_H, unsigned char data_L); +unsigned char getword(); +unsigned char ten_times_read(); +void init(); +void timer1set(); +void timer1int(); +void SPI_int(); + +/*********** Перечень команд ************/ +// получить с компьютера два байта данных и записать их в SPI +#define SPI_send 1 +// режимы работы SPI +#define IMP_RISE 2 +#define IMP_FALL 3 +#define SPI_ON 4 +#define SPI_OFF 5 +#define SPI_ACTIVE 6 +#define SPI_PASSIVE 7 +#define MID_DATA 8 +#define END_DATA 9 + + +#define SPI_SHOW 14 + +// скорости порта (по умолчанию 9600) +#define MID_SPD 15 +#define HIG_SPD 16 +// записать в порт один полученный байт +#define SPI_send_one 17 +// текущий период таймера +#define TMR_SETTINGS 18 +// установить значение таймера +#define SET_TIMER 26 +// сброс +#define INIT 28 +#define TEST 29 +/************** Ошибки и сигналы контроллера ******************/ +// все в порядке +#define OK 22 +// нет стопового бита +#define NO_STOP_BIT 24 +// переполнение регистров +#define STACK_OVERFLOW 25 +// ошибочкая команда +#define ERR_CMD 31 + +#define TWOBYTE 33 // двухбайтная посылка diff --git a/03-focusing/Frontend/FE.c b/03-focusing/Frontend/FE.c new file mode 100644 index 0000000..e8164f0 --- /dev/null +++ b/03-focusing/Frontend/FE.c @@ -0,0 +1,413 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "signals.h" // определения сигналов связи + +#define C_NO 224 // номер контроллера (старшие 3 бита) +int BAUD_RATE = B9600; + +struct termio oldtty, tty; // флаги для UART +struct termios oldt, newt; // флаги для консоли +//struct serial_struct old_extra_term; +int comfd; // Файловый дескриптор порта +char *comdev = "/dev/ttyS0"; // Устройство порта (потом переделать для запроса) + +void tty_sig(unsigned char rb); + +unsigned char crc(unsigned char data){ + unsigned char crc = data & 1; + unsigned int i; + for(i = 1; i<8; i++) crc ^= (data >> i) & 1; + return crc; +} + +void quit(int ex_stat){ // выход из программы + tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); // возвращаем консоль в начальное состояние (на всякий случай) + ioctl(comfd, TCSANOW, &oldtty ); // восстанавливаем режим работы com + close(comfd); // закрываем соединение + printf("Выход... (сигнал %d)\n", ex_stat); + exit(ex_stat); +} + +void tty_init(){ + printf("\nОткрываю порт...\n"); + if ((comfd = open(comdev,O_RDWR|O_NOCTTY|O_NONBLOCK)) < 0){ + fprintf(stderr,"Can't use port %s\n",comdev); + quit(1); + } + printf(" OK\nПолучаю текущие настройки порта...\n"); + ioctl(comfd,TCGETA,&oldtty); // Узнаем текущие параметры порта + tty = oldtty; + tty.c_lflag = 0; // ~(ICANON | ECHO | ECHOE | ISIG) + tty.c_iflag = BRKINT; // подготовка к 9битной передаче + tty.c_oflag = 0; + tty.c_cflag = BAUD_RATE|CS8|CREAD|CLOCAL|PARENB; // 9.6к, 8N1, RW, игнорировать контр. линии + tty.c_cc[VMIN] = 0; // не канонический режим + tty.c_cc[VTIME] = 5; // (без символов ВК и пр.) + if(ioctl(comfd,TCSETA,&tty)<0) exit(-1); // Устанавливаем текущие параметры порта + printf(" OK\n"); +} + +unsigned char read_tty(unsigned char *byte){ + *byte = 0; + fd_set rfds; // набор файловых дескрипторов + struct timeval tv; // время ожидания + int retval; // возвращаемое ф-й select значение + tty.c_iflag &= ~PARODD; + ioctl(comfd,TCSETA,&tty); +// Ждем, сигнала с порта + FD_ZERO(&rfds); // очищаем набор + FD_SET(comfd, &rfds); // теперь это - свойства порта + tv.tv_sec = 0; tv.tv_usec = 50000; // ждем + retval = select(comfd + 1, &rfds, NULL, NULL, &tv); + if (!retval) return 0; // если сигнала нет, возвращаем ноль + if(FD_ISSET(comfd, &rfds)){ +// printf("ready "); + if(read(comfd, byte, 1) < 1) return 0; // ошибка считывания + } + else return 0; // ошибка +/* if(*byte == 8){ + return 0; + + } + else*/ +// printf("считан: %d (команда %d)\n", *byte, *byte & 0x1f); + return 1; +} + +unsigned char read_console(){ // считываем данные с консоли + unsigned char rb; + struct timeval tv; + int retval; + tcgetattr( STDIN_FILENO, &oldt ); // открываем терминал для реакции на клавиши без эха + newt = oldt; + newt.c_lflag &= ~( ICANON | ECHO ); + tcsetattr( STDIN_FILENO, TCSANOW, &newt ); + fd_set rfds; + FD_ZERO(&rfds); + FD_SET(STDIN_FILENO, &rfds); // 0 - стандартный вход + tv.tv_sec = 0; tv.tv_usec = 10000; // ждем 0.01с + retval = select(1, &rfds, NULL, NULL, &tv); + if (!retval) rb = 0; + else { + if(FD_ISSET(STDIN_FILENO, &rfds)) rb = getchar(); + else rb = 0; + } + tcsetattr( STDIN_FILENO, TCSANOW, &oldt ); + return rb; +} + +unsigned char mygetchar(){ // аналог getchar() без необходимости жать Enter + unsigned char ret; + do ret = read_console(); + while(ret == 0); + return ret; +} + +void write_tty_raw(unsigned char wb){ + if(crc(wb)) // нечетная сумма + tty.c_cflag |=PARODD; // 9-й бит = 0 + else + tty.c_cflag &= ~PARODD; // = 1 + ioctl(comfd,TCSETA,&tty); // перенастраиваем порт + if(write(comfd, &wb, 1) < 0) fprintf(stderr, "Ошибка! Запись не удалась :(\n"); // и пишем в него байт +} + +void write_tty(unsigned char wb){ + unsigned char tmp = wb; + tmp &= 0x1f; // на всякий случай очищаем от мусора + tmp |= C_NO; // добавляем к команде + write_tty_raw(tmp); +} + +int send_cmd(unsigned char cmd){ // посылка контроллеру команды с контролем + unsigned char rtn=ERR_CMD, byte=0, i=0; + while(i<2 && rtn != 1){ + write_tty(cmd); + usleep(100000); + rtn = read_tty(&byte); + byte &= 0x1f; + i++; + } + if(byte != cmd){ + printf("\n\n!!!!!! Ошибка! Контроллер не отвечает (ответ %d на команду %d) !!!!!\n\n", byte, cmd); + return 0; + } + else return 1; +} + +void sendword(unsigned int data){ + unsigned char tmp,i=0,rr=0, ret; + tmp = (data >> 8) & 0xFF; + if(crc(tmp)) // нечетная сумма + tty.c_cflag &= ~PARODD; // 9-й бит = 0 + else + tty.c_cflag |= PARODD; // = 1 + ioctl(comfd,TCSETA,&tty); // перенастраиваем порт + write(comfd, &tmp, 1); + do{ i++; + usleep(10000); + ret = read_tty(&rr); rr &= 0x1F; + }while((ret == 0 || rr != OK) && i < 10 ); + if(rr != OK){ fprintf(stderr, "Ошибка записи"); return;} + i = 0; + tmp = data & 0xFF; + if(crc(tmp)) // нечетная сумма + tty.c_cflag &= ~PARODD; // 9-й бит = 0 + else + tty.c_cflag |= PARODD; // = 1 + ioctl(comfd,TCSETA,&tty); // перенастраиваем порт + write(comfd, &tmp, 1); + do{ i++; + usleep(10000); + ret = read_tty(&rr); rr &= 0x1F; + }while((ret == 0 || rr != OK) && i < 10 ); + if(rr != OK){fprintf(stderr, "Неудача"); return;} +} + +void send_rand(){ + int i, j = 0; unsigned char byte, rb; + srand(time(NULL)); + for(i=0; i<128; i++) + if(send_cmd(SPI_send_one)){ + write_tty_raw(25); + printf("%d: передан байт \e[1;32;40m18\e[0m\n",i); + if(read_tty(&byte)) + tty_sig(byte); + rb = read_console(); + if(rb == 'q') break; + //byte = (rand()|rand()) & 0xff; + byte = j++; + if(send_cmd(SPI_send_one)){ + write_tty_raw(byte); + printf("%d: передан байт \e[1;32;40m%d\e[0m\n", i, byte); + if(read_tty(&byte)) + tty_sig(byte); + rb = read_console(); + if(rb == 'q') break; + } + if(send_cmd(SPI_send_one)){ + write_tty_raw(0); + printf("%d: передан байт \e[1;32;40m0\e[0m\n", i); + if(read_tty(&byte)) + tty_sig(byte); + rb = read_console(); + if(rb == 'q') break; + } + } + +} + +void send_nseq(){ + int i, j; unsigned char byte, rb; + for(i=0; i<256; i++) + if(send_cmd(SPI_send_one)){ + byte = (unsigned char)i; + write_tty_raw(byte); + printf("%d: передан байт \e[1;32;40m%d\e[0m\n", i, byte); + if(read_tty(&byte)) + tty_sig(byte); + rb = read_console(); + if(rb == 'q') return; + for(j=0; j<5; j++) + if(send_cmd(SPI_send_one)){ + write_tty_raw(0); + printf("%d: передан байт \e[1;32;40m0\e[0m\n", i); + if(read_tty(&byte)) + tty_sig(byte); + rb = read_console(); + if(rb == 'q') return; + } + } + +} + +void send_seq(){ + unsigned char seq[1024], byte; + char *line; + int cntr = 0, n, sz = 9; + line = (char*) malloc(10); + printf("\nВводите числа по одному в строке, окончание - слово end\n"); + do{ + n = getline(&line, &sz, stdin); + if(n == 0 || strstr(line, "end") != NULL) break; + seq[cntr++] = (unsigned char)atoi(line); + }while(cntr < 1024); + printf("\nНачинаю передачу\n"); + for(n=0; n>=1; + } + bin[8]=0; +} + +void tty_sig(unsigned char rb){ // обработка сигналов с контроллера + char bin[9]; + dec2bin(rb, bin); + switch(rb){ + case ERR_CMD: printf("Ошибка (\e[1;31;40m%d\e[0m?)\n", ERR_CMD); break; + case OK: printf("OK (\e[1;31;40m%d\e[0m?)\n", OK); break; + default: printf("\e[1;31;40m%d\e[0m\t(%s)\n", rb, bin); + } +} + +int main(int argc, char *argv[]){ + unsigned char rb, byte, i = 0; // считанные данные, счетчик + tty_init(); + rb = ERR_CMD; + signal(SIGTERM, quit); // kill (-15) + signal(SIGINT, quit); // ctrl+C + signal(SIGQUIT, SIG_IGN); // ctrl+\ . + signal(SIGTSTP, SIG_IGN); // ctrl+Z + setbuf(stdout, NULL); + printf("\nИнициализация...\n"); + do{ + write_tty(INIT); // Инициализация контроллера + rb = read_tty(&byte); + usleep(100000); + i ++; + } + while(i<3 && rb != 1); // проверка связи + if(i > 2 || (byte&0x1f) != INIT){ + fprintf(stderr,"\n!!!!!! Ошибка: контроллер не отвечает (%d) !!!!!!\n", byte); + } + else printf(" OK\n"); + while(1){ // бесконечно зацикливаемся + rb = read_console(); + if(rb != 0) con_sig(rb); // если что-то появилось - обрабатываем + rb = read_tty(&byte); + if(rb != 0) tty_sig(byte); // если есть сигнал с контроллера - обрабатываем + + } +} diff --git a/03-focusing/Frontend/Makefile b/03-focusing/Frontend/Makefile new file mode 100644 index 0000000..8a80410 --- /dev/null +++ b/03-focusing/Frontend/Makefile @@ -0,0 +1,18 @@ +PROGRAM = FE +LOADLIBES = +CXX.SRCS = FE.c +CC = gcc +DEFINES = +CXX = gcc +CPPFLAGS = -Wall $(DEFINES) +OBJS = $(CXX.SRCS:.c=.o) +all : $(PROGRAM) clean +$(PROGRAM) : $(OBJS) + $(CC) $(CPPFLAGS) $(OBJS) $(LOADLIBES) -o $(PROGRAM) +clean: + /bin/rm -f *.o *~ +depend: + $(CXX) -MM $(CXX.SRCS) + +### +# name1.o : header1.h header2.h ... diff --git a/03-focusing/Frontend/signals.h b/03-focusing/Frontend/signals.h new file mode 100644 index 0000000..0d56dec --- /dev/null +++ b/03-focusing/Frontend/signals.h @@ -0,0 +1,44 @@ +/*********** Перечень команд ************/ +// получить с компьютера байт данных и записать в SPI +#define SPI_send_one 1 +// режимы работы SPI +#define MID_DATA 2 +#define END_DATA 3 +// скорости порта (по умолчанию 9600) +#define MID_SPD 4 // 19200 +#define LOW_SPD 5 // 9600 +// скорости объектива (время, через которое будет послан сигнал "стоп") +#define SPEED1 6 // .3c +#define SPEED2 7 // .05c +#define SPEED3 8 // .01c +// направления движения +#define FORW 9 +#define BACK 10 +#define INFTY 11 +#define ZERO 12 +// узнать фокус +#define FOCUS 19 +// ручной режим управления +#define HANDS 13 +#define TMR_ON 14 +#define TMR_OFF 15 +#define SPI_ON 16 +#define SPI_OFF 17 +// текущий период таймера +#define TMR_SETTINGS 18 +// установить значение таймера +#define SET_TIMER 26 +// сброс +#define INIT 28 +#define TEST 29 +/************** Ошибки и сигналы контроллера ******************/ +// все в порядке +#define OK 22 +// нет стопового бита +#define NO_STOP_BIT 24 +// переполнение регистров +#define STACK_OVERFLOW 25 +// ошибочкая команда +#define ERR_CMD 31 + +#define TWOBYTE 33 // двухбайтная посылка diff --git a/03-focusing/main.c b/03-focusing/main.c new file mode 100644 index 0000000..e93b382 --- /dev/null +++ b/03-focusing/main.c @@ -0,0 +1,227 @@ +#include +#include "signals.h" +#define BUFSIZE 95 +//#define CLRWDT _asm clrwdt _endasm; +typedef unsigned int word; +word at 0x2007 CONFIG = 0x3F72; // для WDT: 0x3F76 +unsigned char + cmd, // полученная команда + d_H, d_L, // старший и младший байты двухбайтной посылки + T1H, T1L, // значения регистров счетчика таймера 1 + mC_addr, // физ. адрес контроллера (константа, устанавливается функцией init) + tmr_on; // ==1 - таймер включен + +unsigned char write_SPI(unsigned char); +void hands(){ + unsigned char i; + write_SPI(10); // инициализация + write_SPI(0); +/* write_SPI(128); + for(i=0; i<20; i++) + write_SPI(0);*/ + write_SPI(94); // руки + for(i=0; i<5; i++) + write_SPI(0); + T1CON = 0; +} + +void focus(){ + unsigned char i; + write_SPI(194); + TX9D = 0; + for(i=0; i<5; i++){ + TXEN = 1; + TXREG = write_SPI(0); + while(!TRMT); + } +} + +void send9bit(unsigned char something){ + unsigned char tmp; + something &= 0x1F; // сброс старших трех бит (там будет адрес) + tmp = mC_addr | something; + TXEN = 1; // готов к передаче + TX9D = 0; // 0 - передает контроллер + TXREG = tmp; // послать команду +} + +unsigned char get9bit(){ + unsigned char err1, err2, flag9bit, tmp; + while(!RCIF); + flag9bit = RX9D; + err1 = FERR; err2 = OERR; // считать 9-й бит и ошибки + cmd = RCREG; // очистить буфер данных + RX9D = 0; + if(err1 == 1){ + return NO_STOP_BIT; + } + if(err2 == 1){ + CREN = 0; CREN = 1; // сбросить флаг ошибки + return STACK_OVERFLOW; + } + if(flag9bit) return TWOBYTE; // данные - часть двухбайтной посылки (неизвестно еще чьей :) ) + tmp = cmd & 0xE0; // выделение адреса из команды + cmd &= 0x1F; // обнуление адресных битов + if(tmp != mC_addr) return ERR_CMD; // если адресован чужому + send9bit(cmd); // Эхо принятой команды + return OK; +} + +void sendword(unsigned char data_H, unsigned char data_L){ + RCIE = 0; // disable USART in interrupt + TMR1IF = 0; + TMR1IE = 0; + TXEN = 1; + TX9D = 1; + TXREG = data_H; + while(!TRMT); + TXEN = 1; + TX9D = 1; + TXREG = data_L; + RCIE = 1; + if(tmr_on) TMR1IE = 1; +} + +unsigned char getword(){ + unsigned char ret = 0; + RCIE = 0; // disable USART in interrupt + TMR1IF = 0; + TMR1IE = 0; + if(ten_times_read()){ + d_H = cmd; + if(ten_times_read()){ + d_L = cmd; + ret = 1;}} // если оба байта считали правильно + if(tmr_on) TMR1IE = 1; + RCIE = 1; // enable USART in interrupt + return ret; +} + +unsigned char ten_times_read(){ // 10 попыток чтения для двухбайтного приема + unsigned char i=0; + do i++; + while(get9bit() != TWOBYTE && i < 10); + if(i > 9){send9bit(ERR_CMD); return 0;} + send9bit(OK); + return 1; +} + +void init(){ // инициализация +// Настройка USART'a +// TXSTA: | CSRC | TX9 | TXEN | SYNC | N/A | BRGH | TRMT | TX9D | + TXSTA = 0x66; // (11000110): master, 9-ти битный ввод/вывод, async, hi-speed, ready +// SPBRG - скорость передачи + SPBRG = 25; // 9.6 кб/с +// RCSTA: | SPEN | RX9 | SREN | CREN | ADDEN | FERR | OERR | RX9D | + RCSTA = 0xD0; // ( 11010000): enable, 9bit, continuous mode +// настройка портов: + PORTA = 0; // 6-ти битный аналогово/цифровой порт (0..5 биты) +// ADCON1: | ADFM | N/A | N/A | N/A | PCFG3 | PCFG2 | PCFG1 | PCFG0 | + ADCON1 = 0x06; // Аналогово/цифровой порт работает в полностью цифровом режиме + TRISA = 0; // направление порт А (1-вход, 0-выход) + TRISB = 0xff; // --/ B /-- +// OPTION_REG: | !RBPU | INTEDG | TOCS | TOSE | PSA | PS2 | PS1 | PS0 | + OPTION_REG = 0x7f; /* (01111111) 0 - подключение подтяжек на порт B (уст. лог. 1), + прерывание по нарастающему фронту RB0, + таймер 0 работает по сигналу с RA4 + таймер 0 увеличивается при спаде сигнала на RA4 + предделитель подключен к сторожевому таймеру + режим prescaler: 1:128 */ + TRISC = 0xC0; // (11000000) - 0..5 биты как выходы + INTCON = 0; // отключить все прерывания + T1CON = 0; +// PIE1: | PSPIE | ADIE | RCIE | TXIE | SSPIE | CCP1IE | TMR2IE | TMR1IE | + PIE1 = 0x20; // (00100000): enable USART(in) +// PIE2: все N/A, кроме EEIE (PIE2.4) + PIE2 = 0; // & disable other int.s + PORTB = 0; +// INTCON: | GIE | PEIE | T0IE | INTE | RBIE | T0IF | INTF | RBIF | + INTCON = 0xC0; // (1100000) - включить глобальные прерывания, прерывания по периферии + PORTC = 0; // без напряжения + PORTA = 0xF; // (00001111) +// получение адреса + mC_addr = PORTB; // физический адрес устройства + mC_addr &= 0xE0; // выделение физического адреса + // SSPCON: | WCOL | SSPOV | SSPEN | CKP | SSPM3 | SSPM2 | SSPM1 | SSPM0 | + SSPCON = 0x32; // (00110010) - включить SPI, высокий уровень CLK (CKP=1), частота Fosc/64 + // SSPSTAT: | SMP | CKE | - | - | - | - | - | BF | + SSPSTAT = 0; // режим работы SPI: SMP=0 - опрос входа в середине периода + // CKE=0 - данные передаются по заднему фронту + TRISC = 0xD0; SSPIE = 1; + tmr_on = 0; + hands(); +} + +void timer1set(){ // установка таймера +// unsigned int tmp = 0xffff - usec/8; + T1CON = 0; // выключить таймер + TMR1IF = 0; // сбросить флаг прерывания + TMR1IE = 1; // разр/запр прерывание + TMR1H = T1H = d_H; //(tmp >> 8) & 0xff; + TMR1L = T1L = d_L; //tmp & 0xff; // установить счетчики +// T1CON: | - | - | T1CPS1 | T1CPS0 | T1OSCEN | T1SYNC | TMR1CS | TMR1ON | + T1CON = 0x31; // (00110001) - включить таймер 1, предделитель на 1/8 (250 кГц) + tmr_on = 1; +} + +unsigned char write_SPI(unsigned char byte){ + unsigned char ans; + TMR1IF = 0; + if(tmr_on){ + T1CON = 0; // отключаем таймер + TMR1IE = 0; + } + SSPBUF = byte; + while(!SSPIF); // ждем окончания передачи + ans = SSPBUF; // регистрируем полученный байт + SSPIF = 0; + SSPIE = 1; + if(tmr_on){ + TMR1H = T1H; TMR1L = T1L; + T1CON = 0x31; // запускаем таймер + TMR1IE = 1; + } + return ans; +} + +void on_interrupt() __interrupt 0{ // обработка прерываний + if(RCIF == 1){ // поступило прерывание от USART + if(get9bit() != OK) return; + switch(cmd){ + case INIT: init(); break; + case SET_TIMER: if(getword()) timer1set(); + else send9bit(ERR_CMD); + break; + case TMR_SETTINGS: sendword(T1H, T1L); break; + case SPI_send_one: while(!RCIF); + TX9D = 0; TXEN = 1; TXREG = write_SPI(RCREG); break; + case SPI_ON: SSPEN = 1; SSPIE = 1; break; + case SPI_OFF: SSPEN = 0; SSPIE = 0; break; + case MID_DATA: SMP = 0; break; + case END_DATA: SMP = 1; break; + case MID_SPD: SPBRG = 12; break; // 19200 + case LOW_SPD: SPBRG = 25; break; // 9600 + case SPEED1: d_H = 0x6D; d_L = 0x84; timer1set(); break; // 0.3с + case SPEED2: d_H = 0xE7; d_L = 0x96; timer1set(); break; // 0.05с + case SPEED3: d_H = 0xFB; d_L = 0x1E; timer1set(); break; // 0.01с + case FORW: write_SPI(5); break; + case BACK: write_SPI(6); break; + case INFTY: write_SPI(37); break; + case ZERO: write_SPI(22); break; + case HANDS: hands(); break; + case TMR_OFF: tmr_on = 0; T1CON = 0; TMR1IE = 0; break; + case TMR_ON: tmr_on = 1; T1CON = 0x31; TMR1IE = 1; break; + case FOCUS: focus(); break; + } + } + if(TMR1IF == 1 && tmr_on){ // поступило прерывание от таймера + write_SPI(4); // посылаем сигнал стоп и перезапускаем таймер + write_SPI(0); + } +} + +void main(){ // основной цикл + init(); + while(1){}; +} + diff --git a/03-focusing/main1.c b/03-focusing/main1.c new file mode 100644 index 0000000..a208de6 --- /dev/null +++ b/03-focusing/main1.c @@ -0,0 +1,242 @@ +#include +#include "signals.h" +//#define CLRWDT _asm clrwdt _endasm; +typedef unsigned int word; +word at 0x2007 CONFIG = 0x3F72; // для WDT: 0x3F76 +unsigned char + cmd, // полученная команда + d_H, d_L, // старший и младший байты двухбайтной посылки + T1H, T1L, // значения регистров счетчика таймера 1 + mC_addr; // физ. адрес контроллера (константа, устанавливается функцией init) + +unsigned char SPI_buf[64], SPI_cntr; + +void send9bit(unsigned char something){ + unsigned char tmp; + something &= 0x1F; // сброс старших трех бит (там будет адрес) + tmp = mC_addr | something; + TXEN = 1; // готов к передаче + TX9D = 0; // 0 - передает контроллер + TXREG = tmp; // послать команду +} + +unsigned char get9bit(){ + unsigned char err1, err2, flag9bit, tmp; + while(!RCIF); + flag9bit = RX9D; + err1 = FERR; err2 = OERR; // считать 9-й бит и ошибки + cmd = RCREG; // очистить буфер данных + RX9D = 0; + if(err1 == 1){ +// send9bit(NO_STOP_BIT); // не обнаружен стоповый бит + return NO_STOP_BIT; + } + if(err2 == 1){ +// send9bit(STACK_OVERFLOW); // переполнение приемных регистров + CREN = 0; CREN = 1; // сбросить флаг ошибки + return STACK_OVERFLOW; + } + if(flag9bit) return TWOBYTE; // данные - часть двухбайтной посылки (неизвестно еще чьей :) ) + tmp = cmd & 0xE0; // выделение адреса из команды + cmd &= 0x1F; // обнуление адресных битов + if(tmp != mC_addr) return ERR_CMD; // если адресован чужому + send9bit(cmd); // Эхо принятой команды + return OK; +} + +void sendword(unsigned char data_H, unsigned char data_L){ + RCIE = 0; // disable USART in interrupt + TMR1IE = 0; + TXEN = 1; + TX9D = 1; + TXREG = data_H; + while(!TRMT); + TXEN = 1; + TX9D = 1; + TXREG = data_L; + RCIE = 1; + TMR1IE = 1; +} + +unsigned char getword(){ + unsigned char ret = 0; + RCIE = 0; // disable USART in interrupt + TMR1IE = 0; + if(ten_times_read()){ + d_H = cmd; + if(ten_times_read()){ + d_L = cmd; + ret = 1;}} // если оба байта считали правильно + TMR1IE = 1; + RCIE = 1; // enable USART in interrupt + return ret; +} + +unsigned char ten_times_read(){ // 10 попыток чтения для двухбайтного приема + unsigned char i=0; + do i++; + while(get9bit() != TWOBYTE && i < 10); + if(i > 9){send9bit(ERR_CMD); return 0;} + send9bit(OK); + return 1; +} + +void init(){ // инициализация +// Настройка USART'a +// TXSTA: | CSRC | TX9 | TXEN | SYNC | N/A | BRGH | TRMT | TX9D | + TXSTA = 0x66; // (11000110): master, 9-ти битный ввод/вывод, async, hi-speed, ready +// SPBRG - скорость передачи + SPBRG = 25; // 9.6 кб/с +// RCSTA: | SPEN | RX9 | SREN | CREN | ADDEN | FERR | OERR | RX9D | + RCSTA = 0xD0; // ( 11010000): enable, 9bit, continuous mode +// настройка портов: + PORTA = 0; // 6-ти битный аналогово/цифровой порт (0..5 биты) +// ADCON1: | ADFM | N/A | N/A | N/A | PCFG3 | PCFG2 | PCFG1 | PCFG0 | + ADCON1 = 0x06; // Аналогово/цифровой порт работает в полностью цифровом режиме + TRISA = 0; // направление порт А (1-вход, 0-выход) + TRISB = 0xff; // --/ B /-- +// OPTION_REG: | !RBPU | INTEDG | TOCS | TOSE | PSA | PS2 | PS1 | PS0 | + OPTION_REG = 0x7f; /* (01111111) 0 - подключение подтяжек на порт B (уст. лог. 1), + прерывание по нарастающему фронту RB0, + таймер 0 работает по сигналу с RA4 + таймер 0 увеличивается при спаде сигнала на RA4 + предделитель подключен к сторожевому таймеру + режим prescaler: 1:128 */ + TRISC = 0xC0; // (11000000) - 0..5 биты как выходы + INTCON = 0; // отключить все прерывания + T1CON = 0; +// PIE1: | PSPIE | ADIE | RCIE | TXIE | SSPIE | CCP1IE | TMR2IE | TMR1IE | + PIE1 = 0x20; // (00100000): enable USART(in) +// PIE2: все N/A, кроме EEIE (PIE2.4) + PIE2 = 0; // & disable other int.s + PORTB = 0; +// INTCON: | GIE | PEIE | T0IE | INTE | RBIE | T0IF | INTF | RBIF | + INTCON = 0xC0; // (1100000) - включить глобальные прерывания, прерывания по периферии + PORTC = 0; // без напряжения + PORTA = 0xF; // (00001111) +// получение адреса + mC_addr = PORTB; // физический адрес устройства + mC_addr &= 0xE0; // выделение физического адреса + SSPEN = 0; SSPIE = 0; + SPI_cntr = 0; +} + +void timer1set(){ // установка таймера +// unsigned int tmp = 0xffff - usec/8; + T1CON = 0; // выключить таймер + TMR1IF = 0; // сбросить флаг прерывания + TMR1IE = 1; // разр/запр прерывание + TMR1H = T1H = d_H; //(tmp >> 8) & 0xff; + TMR1L = T1L = d_L; //tmp & 0xff; // установить счетчики +// T1CON: | - | - | T1CPS1 | T1CPS0 | T1OSCEN | T1SYNC | TMR1CS | TMR1ON | + T1CON = 0x31; // (00110001) - включить таймер 1, предделитель на 1/8 (250 кГц) +} + +void timer1int(){ // обработка прерываний первого таймера + T1CON = 0; + TMR1H = T1H; TMR1L = T1L; +// send9bit(TEST); + T1CON = 0x31; // снова запускаем таймер +} + +void SPI_int(){ // в пассивном режиме принимаемые данные сохраняются в +// буфер, при заполнении буфера он отсылается на ПК + unsigned char i; + TMR1IE = 0; + RCIE = 0; + SPI_buf[SPI_cntr++] = SSPBUF; + if(SPI_cntr == 64){ + for(i = 0; i < 64; i++){ + TXEN = 1; + TXREG = SPI_buf[i]; + while(!TRMT); + } + SPI_cntr = 0; + } + RCIE = 1; + TMR1IE = 1; + BF = 0; + SSPIF = 0; +} + + + +/* +void SPI_int(){ + SSPIE = 0; + if(SSPOV == 1) // ошибка переполнения буфера + return; + if(BF == 0) return; // буфер не заполнен + RCIE = 0; + TMR1IE = 0; + TXEN = 1; + TXREG = SSPBUF; // отправляем полученный байт +// while(!TRMT); + RCIE = 1; + TMR1IE = 1; + BF = 0; + SSPIF = 0; + SSPIE = 1; +} +*/ + +void write_SPI(unsigned char byte){ + SSPBUF = byte; + //PORTA &= 0xEF; // -SS = 0 - передаем данные по SPI ведомому + while(!SSPIF); // ждем окончания передачи +// SPI_int(); + + RCIE = 0; + TMR1IE = 0; + TXEN = 1; + TXREG = SSPBUF; // отправляем полученный байт + RCIE = 1; + TMR1IE = 1; + BF = 0; + SSPIF = 0; +} + +void on_interrupt() __interrupt 0{ // обработка прерываний + if(RCIF == 1){ // поступило прерывание от USART + if(get9bit() != OK) return; + switch(cmd){ + case INIT: init(); break; + case SET_TIMER: if(getword()) timer1set(); + else send9bit(ERR_CMD); + break; + case TMR_SETTINGS: sendword(T1H, T1L); break; + case SPI_send: if(getword()){ + write_SPI(d_H); + write_SPI(d_L);} + break; + case SPI_send_one: while(!RCIF); write_SPI(RCREG); break; + case IMP_RISE: CKE = 1; break;//данные передаются по заднему фронту + case IMP_FALL: CKE = 0; break; //данные передаются по переднему фронту + case MID_DATA: SMP = 0; break; + case END_DATA: SMP = 1; break; + case SPI_ON: // SPI + // SSPCON: | WCOL | SSPOV | SSPEN | CKP | SSPM3 | SSPM2 | SSPM1 | SSPM0 | + SSPEN = 1; // (00110010) - выключить SPI, высокий уровень CLK (CKP=1), частота Fosc/64 + // SSPSTAT: | SMP | CKE | - | - | - | - | - | BF | +// SSPSTAT = 0; // режим работы SPI: SMP=0 - опрос входа в середине периода + // CKE=0 - данные передаются по заднему фронту + SSPIE = 0; break; + case SPI_OFF: SSPEN = 0; SSPIE = 0; break; + case SPI_ACTIVE: SSPCON = 0x32; TRISC = 0x10; CKE = 0; SSPIE = 0; break; //TRISC = 0xC0; + case SPI_PASSIVE: SSPCON = 0x35; TRISC = 0x18; CKE = 0; SSPIE = 1; break;//TRISC = 255; + case HIG_SPD: SPBRG = 1; break; // 115200 + case MID_SPD: SPBRG = 12; break; // 19200 + case TEST: T1CON = 0; TMR1IF = 0; break; + } + } + if(TMR1IF == 1) // поступило прерывание от таймера + timer1int(); // обработать прерывание + if(SSPIF == 1) // прерывание от SPI + SPI_int(); // обрабатываем +} + +void main(){ // основной цикл + init(); + while(1){}; +} + diff --git a/03-focusing/run b/03-focusing/run new file mode 100755 index 0000000..61eb4d8 --- /dev/null +++ b/03-focusing/run @@ -0,0 +1,3 @@ +#!/bin/sh +sdcc -V -mpic14 -p16f873a main.c +#packihx main.ihx > main.hex diff --git a/03-focusing/signals.h b/03-focusing/signals.h new file mode 100644 index 0000000..3012ba6 --- /dev/null +++ b/03-focusing/signals.h @@ -0,0 +1,55 @@ +/*********** Функции ***********************/ +void send9bit(unsigned char something); +unsigned char get9bit(); +void sendword(unsigned char data_H, unsigned char data_L); +unsigned char getword(); +unsigned char ten_times_read(); +void init(); +void timer1set(); +void timer1int(); +void SPI_int(); + +/*********** Перечень команд ************/ +// получить с компьютера байт данных и записать в SPI +#define SPI_send_one 1 +// режимы работы SPI +#define MID_DATA 2 +#define END_DATA 3 +// скорости порта (по умолчанию 9600) +#define MID_SPD 4 // 19200 +#define LOW_SPD 5 // 9600 +// скорости объектива (время, через которое будет послан сигнал "стоп") +#define SPEED1 6 // .3c +#define SPEED2 7 // .05c +#define SPEED3 8 // .01c +// направления движения +#define FORW 9 +#define BACK 10 +#define INFTY 11 +#define ZERO 12 +// узнать фокус +#define FOCUS 19 +// ручной режим управления +#define HANDS 13 +#define TMR_ON 14 +#define TMR_OFF 15 +#define SPI_ON 16 +#define SPI_OFF 17 +// текущий период таймера +#define TMR_SETTINGS 18 +// установить значение таймера +#define SET_TIMER 26 +// сброс +#define INIT 28 +#define TEST 29 +/************** Ошибки и сигналы контроллера ******************/ +// все в порядке +#define OK 22 +// нет стопового бита +#define NO_STOP_BIT 24 +// переполнение регистров +#define STACK_OVERFLOW 25 +// ошибочкая команда +#define ERR_CMD 31 + +#define TWOBYTE 33 // двухбайтная посылка diff --git a/opisanie.pdf b/opisanie.pdf new file mode 100644 index 0000000000000000000000000000000000000000..19e5b2b3bfaa2ef775089a7a1ea455621dbaf93b GIT binary patch literal 140087 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 lRc*YmMm@rldfhfiH7GLKd!Jze*= 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 +Для работы со SPI--интерфейсом объектива использовался микроконтроллер PIC16F873a, +подключенный к персональному компьютера через интерфейс~RS--232. +Так как кварцевый резонатор контроллера имел частоту~$f_{osc}=4\,$МГц, пришлось ограничиться +довольно медленной скоростью~--- 19.2\,кбит/с. + +SPI--интерфейс контроллера был настроен на скорость передачи сообщений~$f_{osc}/64$ (62.5\,кГц). +SPI работал в третьем режиме (высокий уровень CLK, передача информации на падающий +фронт CLK, прием в середине такта -- на возрастающий фронт CLK), регистры: +\begin{verbatim} +SSPCON = 0x32; TRISC = 0xD0; CKE = 0; SSPIE = 1; SMP = 0; +\end{verbatim} + +Для анализа сообщений, отсылаемых фотоаппаратом объективу, SPI переключался в пассивный +режим: +\begin{verbatim} +SSPCON = 0x35; TRISC = 0xD8; CKE = 0; SSPIE = 1; SMP = 0; +\end{verbatim} +Однако, поток данных в обычном режиме работы фотоаппарата довольно велик, а скорость RS--232 +слишком мала, чтобы контроллер успевал за промежуток между посылками отсылать их на~ПК. +Для буферизации посылок использовался массив данных из~95 элементов. Полученные по +SPI--интерфейсу данные буферизовались контроллером в этот массив, а затем, при заполнении +буфера или по команде пользователя, буфер передавался на~ПК. +Однако, и в этом случае оказалось очень много дополнительных команд, не имеющих отношения +к управлению объективом. + +Для подбора команд, вызывающих изменение фокусного расстояния объектива было принято решение +отсылать поочередно объективу ненулевую однобайтную посылку, за которой следовало восемь +нулевых посылок (как оказалось, нулевые посылки используются фотоаппаратом для считывания +информации с объектива). + +Методом последовательного перебора были определены основные управляющие команды. +Временн\'ые интервалы между командами могут быть довольно велики. Если объектив должен +ответить на какой-нибудь запрос, а после запроса никаких посылок не отсылалось, объектив +будет ждать очередных посылок, чтобы выдать запрашиваемые данные. Поэтому стоит +каждую команду завершать последовательностью нулевых посылок. + +\section{Команды EF~200} +Некоторые команды не требуют от объектива ответа, поэтому их можно не завершать нулями, +однако, некоторые запросы подразумевают достаточно длинный ответ, и требуют до восьми +последующих нулевых сообщений. + +Для перехода в ручной режим управления используется команда~{\bf94} или ее эквивалент~{\bf30} +(все команды записываются здесь в десятичной системе). +За этой командой должны следовать одна или две нулевых посылки. +Некоторые команды для изменения фокусного расстояния требуют предварительного +перехода в ручной режим управления. + +Для увеличения фокусного расстояния объектива используются следующие команды +(объектив EF~200, для EF~85 скорости не изменяются). +\begin{description} +\item[5] плавное увеличение фокусного расстояния (если за ней не следует других команд). +\item[37] быстрый переход в~$\infty$, за этой посылкой должны следовать две нулевые. +\end{description} +Для уменьшения фокусного расстояния используются команды +\begin{description} +\item[6] плавное перемещение на отметку~2.5\,м. +\item[22] быстрый переход на отметку~2.5\,м. За этой командой следуют две +нулевых. Эта команда имеет полные эквиваленты: {\bf 38, 70, 86}. +\item[68] поворот привода объектива на заданный угол. Угол задается двумя следующими +байтами (short int, старший байт первый). Узнать текущее угловое положение можно командой~192. +\end{description} +Для останова используется команда~{\bf4}. Таким образом, манипулируя командами~{\bf5/6} +и~{\bf4} можно добиться постепенного изменения фокусного расстояния. Помимо ожидания +для изменения фокусного расстояния на нужную величину после команд~{\bf5} или~{\bf6} +можно отсылать нулевые посылки. + +Кроме этой команды есть следующие информационные команды, чье предназначение +пока не расшифровано (для EF~200, EF~85 см. в сводной таблице): +\begin{description} +\item[31] имеет двухбайтный ответ, оба байта содержали комбинации из единицы и тройки. +\item[79] имеет трехбайтный ответ, являющийся комбинацией единиц и нулей. +\item[95] ведет себя аналогично~{\bf31}. +\item[111] имеет однобайтный ответ~--- единицу. +\item[120] имеет однобайтный ответ~--- восьмерку. +\item[239] имеет однобайтный ответ~--- 224 или 225. +\item[247] однобайтный ответ 240. +\item[250] однобайтный ответ 130 или~128. +\item[251] однобайтный ответ 248. +\item[252] однобайтный ответ (разные числа). +\item[128] ответ из семи или восьми байт, возможно~--- запрос статуса объектива. +\end{description} + +Было обнаружено еще несколько подозрительных запросов, ответом на которые был один +байт с постоянным значением 128 или 192 (при любых манипуляциях с объективом). + + +\subsection{Небольшое дополнение} +команды (EF~85): + +10 --- {\bf инициализация}, без этой команды EF85 не работает. + +194 --- узнать расстояние фокусировки (в метрах). Ответ --- четыре байта, первые два --- текущее расстояние, +вторые два --- предыдущее положение. В паре чисел первое умножаем на 2.5\,м и складываем со вторым (в +сантиметрах). + +192 --- узнать угловое положение лимба (от некоторого условного нуля). Ответ --- два байта (short int, +старший байт первый). + +Управление диафрагмой: два байта число 18 (собственно команда) и байт --- на сколько изменить +текущее состояние диафрагмы (signed char) положительное число для закрытия, отрицательное -- открыть. + + +При небольшом изменении состояния диафрагмы каждая команда 2 или 3 повторяет это изменение. +Плюс объектив входит в режим пошаговой подстройки фокусировки. Выход из этого режима --- команда 8 +(или ее эквиваленты 11, 27, 43, 75). + + +\section{Сводный перечень команд для EF~85} +Расшифровка обозначений столбцов: +\begin{description} +\item[cmd] команда; +\item[N] минимальная длина ответа в байтах; +\item[ans] ответ (в случае изменяющегося ответа --- диапазон); +\item[desc] краткое описание команды. +\end{description} +Команды, чье предназначение не выявлено, имеют пустое поле описания. +Если действие команды аналогично другой команде, в описании пишется эта команда. +Под F подразумевается значение расстояния до объекта, чье изображение +четко сфокусировано. Буква <<о>> в описании означает, что назначение команды +неизвестно, но она приводит к отключению ручного управления~F. +Если в ответах встречаются записи через слеш, значит, в разные моменты времени +появляется то одна, то другая из приведенных команд без видимой зависимости. +\begin{longtable}[c]{||c||c|c| p{0.5\textwidth}||} +\caption{Сводка команд}\\ +\hline\hline +\bf cmd &\bf N &\bf ans &\bf desc\\ +\hline +\hline +\endfirsthead +\caption{(продолжение).}\\ +\hline +\bf cmd &\bf N &\bf ans &\bf desc\\ +\hline +\hline +\endhead +\hline +\endfoot + +0 & 1 & 0 & <<пустышка>> для получения ответа от объектива\\ +1 & 1 & 1 & \\ +\bf 2 & 1 & 2 & повтор предыдущего изменения величины диафрагмы, режим коротких шагов перемещения\\ +3 & 1 & 3 & 2\\ +\bf 4 & 1 & 4 & остановить изменение F\\ +\bf 5 & 1 & 5 & увеличить F\\ +\bf 6 & 1 & 6 & уменьшить F\\ +7 & 1 & 7 & о\\ +\bf 8 & 2 & 255/0, 170 & отмена действия команды 2\\ +9 & 1 & 9 & о\\ +\bf 10 & 1 & 10 & инициализация объектива EF85 (без этой команды он не выходит из спящего режима)\\ +11 & 1 & 11 & 8\\ +12 & 1 & 12 & \\ +13 & 1 & 13 & \\ +14 & 1 & 14 & \\ +15 & 1 & 15 & \\ +16 & 2 & 16, 16 & \\ +17 & 2 & 17, 17 & \\ +\bf 18 & 2 & 18, 18 & управление затвором, вторым байтом (signed char) отсылается степень изменения + диаметра отверстия (положительным значениям соответствует уменьшение диаметра)\\ +19 & 2 & 19, 19 & 18\\ +20 & 2 & 20, 20 & 4\\ +21 & 2 & 21, 21 & 5\\ +22 & 2 & 22, 22 & 6\\ +23 & 2 & 23, 23 & о\\ +24 & 3 & 24, 0/255, 170 & \\ +25 & 2 & 25, 25 & о\\ +26 & 2 & 26, 26 & \\ +27 & 2 & 27, 27 & 8\\ +28 & 2 & 28, 28 & \\ +29 & 2 & 29, 29 & \\ +30 & 2 & 30, 30 & (для EF~200 эквивалент команды 94)\\ +31 & 2 & 31, 31 & \\ +32 & 2 & 32, 32 & \\ +33 & 2 & 33, 33 & \\ +34 & 2 & 34, 34 & \\ +35 & 2 & 35, 35 & \\ +36 & 2 & 36, 36 & 4\\ +37 & 2 & 37, 37 & 5\\ +38 & 2 & 38, 38 & 6\\ +39 & 2 & 39, 39 & о\\ +40 & 3 & 40, 255/0, 170 & \\ +41 & 2 & 41, 41 & о\\ +42 & 2 & 42, 42 & \\ +43 & 2 & 43, 43 & 8\\ +44 & 2 & 44, 44 & \\ +45 & 2 & 45, 45 & \\ +46 & 2 & 46, 46 & \\ +47 & 2 & 47, 47 & \\ +48 & 1 & 48 & \\ +49 & 1 & 49 & \\ +50 & 1 & 50 & \\ +51 & 1 & 51 & \\ +52 & 1 & 52 & \\ +53 & 1 & 53 & \\ +54 & 1 & 54 & \\ +55 & 1 & 55 & \\ +56 & 1 & 56 & \\ +57 & 1 & 57 & \\ +58 & 1 & 58 & \\ +59 & 1 & 59 & \\ +60 & 1 & 60 & \\ +61 & 1 & 61 & \\ +62 & 1 & 62 & \\ +63 & 1 & 63 & \\ +64 & 3 & 64, 64, 64 & \\ +65 & 3 & 65, 65, 65 & \\ +66 & 3 & 66, 66, 66 & \\ +67 & 3 & 67, 67, 67 & \\ +68 & 3 & 68, 68, 68 & переместить объектив на заданное кол-во шагов (2 байта, int16, hi-low)\\ +69 & 3 & 69, 69, 69 & 5\\ +70 & 3 & 70, 70, 70 & 6\\ +71 & 3 & 71, 71, 71 & о\\ +72 & 4 & 72, 72, 255/0, 170 & \\ +73 & 3 & 73, 73, 73 & о\\ +74 & 3 & 74, 74, 170 & \\ +75 & 3 & 75, 75, 75 & 8\\ +76 & 3 & 76, 76, 76 & \\ +77 & 3 & 77, 77, 77 & \\ +78 & 3 & 78, 78, 78 & (для EF~200 эквивалент команды 94)\\ +79 & 3 & 79, 79, 79 & \\ +80 & 2 & 80, 80 & \\ +81 & 2 & 81, 81 & \\ +82 & 2 & 82, 82 & \\ +83 & 2 & 83, 83 & \\ +84 & 2 & 84, 84 & 4\\ +85 & 2 & 85, 85 & 5\\ +86 & 2 & 86, 86 & 6\\ +87 & 2 & 87, 87 & о\\ +88 & 3 & 88, 255/0, 170 & \\ +89 & 2 & 89, 89 & о\\ +90 & 2 & 90, 170 & \\ +91 & 2 & 91, 91 & \\ +92 & 2 & 92, 92 & \\ +93 & 2 & 93, 93 & \\ +\bf 94 & 2 & 94, 94 & включить ручное управление F\\ +95 & 2 & 95, 95 & \\ +96 & 1 & 96 & \\ +97 & 1 & 97 & \\ +98 & 1 & 98 & \\ +99 & 1 & 99 & \\ +100 & 1 & 100 & \\ +101 & 1 & 101 & \\ +102 & 1 & 102 & \\ +103 & 1 & 103 & \\ +104 & 1 & 240 & \\ +105 & 1 & 35 & \\ +106 & 2 & 35, 253 & \\ +107 & 2 & 232, 103 $\div$ 215, 185& \\ +108 & 2 & 108, 236 $\div$ 112, 0 & \\ +109 & 2 & 220, 80 $\div$ 103, 56 & \\ +110 & 2 & 112, 108 $\div$ 113, 62 & \\ +111 & 1 & 0/16 & \\ +112 & 1 & 112 & \\ +113 & 1 & 113 & \\ +114 & 1 & 114 & \\ +115 & 1 & 115 & \\ +116 & 1 & 116 & \\ +117 & 1 & 117 & \\ +118 & 1 & 118 & \\ +119 & 1 & 119 & \\ +120 & 1 & 120 & \\ +121 & 1 & 121 & \\ +122 & 1 & 122 & \\ +123 & 1 & 123 & \\ +124 & 1 & 124 & \\ +125 & 1 & 125 & \\ +126 & 1 & 126 & \\ +127 & 1 & 127 & \\ +128 & 6 & 129, 239, 0, 85, 0, 85 & модель объектива ?\\ +129 & 1 & 129 & \\ +130 & 1 & 130 & \\ +131 & 1 & 131 & \\ +132 & 1 & 132 & \\ +133 & 1 & 133 & \\ +134 & 1 & 134 & \\ +135 & 1 & 135 & \\ +136 & 1 & 136 & \\ +137 & 1 & 137 & \\ +138 & 1 & 138 & \\ +139 & 1 & 139 & \\ +140 & 1 & 140 & \\ +141 & 1 & 141 & \\ +142 & 1 & 142 & \\ +143 & 1 & 143 & \\ +\bf 144 & 2 & 0/32, $X$ & старший бит $X$ --- значение переключателя <> (нулю + соответствует AF)\\ +145 & 1 & 145 & \\ +146 & 1 & 146 & \\ +147 & 1 & 147 & \\ +148 & 1 & 255 & \\ +149 & 1 & 149 & \\ +150 & 1 & 150 & \\ +151 & 1 & 151 & \\ +152 & 1 & 152 & \\ +153 & 1 & 153 & \\ +154 & 1 & 154 & \\ +155 & 1 & 155 & \\ +156 & 1 & 156 & \\ +157 & 1 & 157 & \\ +158 & 1 & 158 & \\ +159 & 1 & 159 & \\ +160 & 2 & 0, 85 & \\ +161 & 1 & 161 & \\ +162 & 1 & 162 & \\ +163 & 1 & 163 & \\ +164 & 1 & 164 & \\ +165 & 1 & 165 & \\ +166 & 1 & 166 & \\ +167 & 1 & 167 & \\ +168 & 1 & 168 & \\ +169 & 1 & 169 & \\ +170 & 1 & 170 & \\ +171 & 1 & 171 & \\ +172 & 1 & 172 & \\ +173 & 1 & 173 & \\ +174 & 1 & 174 & \\ +175 & 1 & 175 & \\ +176 & 3 & 13, 13, 72 & \\ +177 & 2 & 91, 92 & \\ +178 & 3 & 96, 2, 71 & \\ +179 & 2 & 104, 92 & \\ +180 & 1 & 180 & \\ +181 & 1 & 181 & \\ +182 & 1 & 182 & \\ +183 & 1 & 183 & \\ +184 & 1 & 184 & \\ +185 & 1 & 185 & \\ +186 & 1 & 186 & \\ +187 & 1 & 187 & \\ +188 & 1 & 188 & \\ +189 & 1 & 189 & \\ +190 & 1 & 190 & \\ +191 & 1 & 191 & \\ +\bf 192 & 2 & short int & угловое положение лимба F, первый байт --- старший, нуль относительный\\ +193 & 1 & 193 & \\ +\bf 194 & 4 & $X_1, X_2, Y_1, Y_2$ & значение F в метрах; $X$~-- текущее F, $Y$~-- предыдущее F; + $F(\text{метр}) = 2.5\cdot X_1+X_2/100$ \\ +195 & 1 & 195 & \\ +196 & 2 & 0, 9 $\div$ 10, 1 & \\ +197 & 1 & 197 & \\ +198 & 1 & 198 & \\ +199 & 1 & 199 & \\ +200 & 1 & 200 & \\ +201 & 1 & 201 & \\ +202 & 1 & 202 & \\ +203 & 1 & 203 & \\ +204 & 1 & 204 & \\ +205 & 1 & 205 & \\ +206 & 1 & 206 & \\ +207 & 1 & 207 & \\ +208 & 1 & 208 & \\ +209 & 1 & 209 & \\ +210 & 1 & 210 & \\ +211 & 1 & 211 & \\ +212 & 1 & 212 & \\ +213 & 1 & 213 & \\ +214 & 1 & 214 & \\ +215 & 1 & 215 & \\ +216 & 1 & 216 & \\ +217 & 1 & 217 & \\ +218 & 1 & 218 & \\ +219 & 1 & 219 & \\ +220 & 1 & 220 & \\ +221 & 1 & 221 & \\ +222 & 1 & 222 & \\ +223 & 1 & 223 & \\ +224 & 2 & 61, 186 $\div$ 61, 172 & \\ +225 & 1 & 225 & \\ +226 & 1 & 226 & \\ +227 & 1 & 227 & \\ +228 & 2 & 30, 84 & \\ +229 & 1 & 229 & \\ +230 & 1 & 230 & \\ +231 & 1 & 231 & \\ +232 & 2 & 163, 203 $\div$ 162, 105 & \\ +233 & 1 & 233 & \\ +234 & 2 & 157, 166 $\div$ 163, 205 & \\ +235 & 1 & 235 & \\ +236 & 1 & 236 & \\ +237 & 1 & 237 & \\ +238 & 1 & 238 & \\ +239 & 1 & 239 & \\ +240 & 1 & 10 & \\ +241 & 1 & 241 & \\ +242 & 1 & 242 & \\ +243 & 1 & 243 & \\ +244 & 1 & 244 & \\ +245 & 1 & 245 & \\ +246 & 1 & 246 & \\ +247 & 1 & 247 & \\ +248 & 1 & 185 $\div$ 188 & \\ +249 & 1 & 3 $\div$ 7 & \\ +250 & 1 & 192 $\div$ 194 & \\ +251 & 1 & 251 & \\ +252 & 1 & 198 $\div$ 201 & \\ +253 & 1 & 0 & \\ +254 & 1 & 207 $\div$ 208 & \\ +255 & 1 & 255 & \\ +\hline\hline +\end{longtable} +Команды можно условно разделить на две половины: если старший бит команды равен нулю, объектив +выполняет определенные действия. Когда старший бит команды равен единицы, у объектива запрашиваются +определенные данные. + +Команды изменения F аналогичны (за исключением разрядности ответа). Младшие 4~байта принимают +значения 0100 (стоп), 0101 (F$+$), 0110 (F$-$), самый старший бит --- обязательно 0. +Биты $4\div6$ принимают любые значения, кроме 110, 011 и 111. +\end{document} + diff --git a/pins.pdf b/pins.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b9707c6ccfadc3473bcaaa6ebda77b18c250be81 GIT binary patch literal 52223 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 gs9&ov*W*^;05PzK{4#%b7B*Hc