diff --git a/STM8/Readme.koi8-r b/STM8/Readme.koi8-r new file mode 100644 index 0000000..1698dbe --- /dev/null +++ b/STM8/Readme.koi8-r @@ -0,0 +1,30 @@ +Протокол команд платформы SCORPIO +================================= + +Все команды должны быть заключены в квадратные скобки с символом '\n' после закрывающейся скобки +(анализатор протокола работает в строковом режиме). Пробелы внутри скобок игнорируются. + +Контроллер платформы имеет номер "2", поэтому парсер команд принимает лишь команды вида "[2 Xxx]\n". + +Список команд: + +* [2 ?] (отладочная команда) -- выдача оставшегося количества шагов. + +* [2 0] (изначально было "restart") -- остановить все моторы и реле (работающий watchdog не требует +команды принудительной перезагрузки). + +* [2 N xxx], где N - число от 1 до 6, а xxx - число от -32767 до 32767 -- запуск шагового двигателя +номер N на заданное количество шагов. Если двигатель стоит на концевике и не сможет двигаться в +заданном направлении, вместо эха команды сразу возвращается статус концевика в виде [2 N St=x], +где x - 1 или 2 в зависимости от номера концевика. После окончания движения возвращается статус +двигателя, если концевики не зажаты, St=3. + +* [2 N x], где N - число от 7 до 9 -- включить (x=1) или выключить (x=0) реле (7 - затвор, 8 - неон, +9 - плоское поле). Проверить статус можно, заменив x минусом (возврат будет таким же, как у статуса +моторов). + +* [2 a xxx], где x - число от -8 до 32767 (наследие от старого протокола) -- изменить скорость шаговых +двигателей на величину, равную 65535/(xxx-10)*0.125 шагов в секунду. + +* [2 N xxx], где N от 'b' до 'd', а xxx от 0 до 255 --- изменить яркость светодиодов ('b' - первый, +'c' - второй и 'd' - третий). Значение 0 соответствует минимальной, а 255 максимальной яркости. diff --git a/STM8/main.c b/STM8/main.c index 621c2f5..a3c5112 100644 --- a/STM8/main.c +++ b/STM8/main.c @@ -139,7 +139,6 @@ int main() { process_string(); } if(chk_esw){ - chk_esw = 0; stepper_get_esw(cur_motor); } }while(1); diff --git a/STM8/proto.c b/STM8/proto.c index 2f72691..35299d5 100644 --- a/STM8/proto.c +++ b/STM8/proto.c @@ -48,8 +48,7 @@ U8 move_motor(char *cmd){ if(steps) return stepper_move(N, steps); else{ // steps == 0 - just check endswitches - cur_motor = N; - chk_esw = 1; + prep2chkesw(N); return 0; } } diff --git a/STM8/stepper.c b/STM8/stepper.c index e6be9fa..c81abc0 100644 --- a/STM8/stepper.c +++ b/STM8/stepper.c @@ -86,7 +86,14 @@ U8 stepper_ch_speed(char *spd){ */ U8 check_endsw(){ // A1 - "+", A2 - "-" + U8 i; U8 pc = PORT(ESW_PORT, IDR); + for(i = 0; i < 255; ++i){ // wait a while for multiplexer + if(pc != PORT(ESW_PORT, IDR)){ + pc = PORT(ESW_PORT, IDR); + i = 0; + } + } if(0 == (pc & ESW_MINUS)) return 1; if(0 == (pc & ESW_PLUS)) return 2; return 0; @@ -148,9 +155,14 @@ void stop_motor(){ void stepper_get_esw(U8 Nmotor){ U8 sw; char str[] = "[2 0 St=0]\n"; // 3 - motor number, 5 - endswitch (3 if none) - IWDG_KR = KEY_REFRESH; // refresh watchdog if(Nmotor == 0 || Nmotor > 6) return; // no running motor + IWDG_KR = KEY_REFRESH; // refresh watchdog ESW_SELECT(Nmotor); + if(chk_esw > 1){ + --chk_esw; + return; + } + chk_esw = 0; str[3] = Nmotor + '0'; sw = check_endsw(); if(sw == 0) sw = 3; @@ -158,3 +170,14 @@ void stepper_get_esw(U8 Nmotor){ uart_write(str); cur_motor = 0; } + +/** + * prepare for end-switches selection: + * switch multiplexer and set flag + */ +void prep2chkesw(U8 N){ + if(N == 0 || N > 6) return; + ESW_SELECT(N); + cur_motor = N; + chk_esw = 255; +} diff --git a/STM8/stepper.h b/STM8/stepper.h index 0c6f4cb..a65ad45 100644 --- a/STM8/stepper.h +++ b/STM8/stepper.h @@ -42,6 +42,7 @@ U8 stepper_move(U8 Nmotor, int Nsteps); void stop_motor(); U8 check_endsw(); +void prep2chkesw(U8 Nmotor); void stepper_get_esw(U8 Nmotor); U8 chk_stpr_cmd(char N);