Fixed bug with end-switches check

This commit is contained in:
eddyem 2017-06-30 10:58:07 +03:00
parent 84a915b18a
commit 78c1544a79
5 changed files with 56 additions and 4 deletions

30
STM8/Readme.koi8-r Normal file
View File

@ -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 максимальной яркости.

View File

@ -139,7 +139,6 @@ int main() {
process_string(); process_string();
} }
if(chk_esw){ if(chk_esw){
chk_esw = 0;
stepper_get_esw(cur_motor); stepper_get_esw(cur_motor);
} }
}while(1); }while(1);

View File

@ -48,8 +48,7 @@ U8 move_motor(char *cmd){
if(steps) return stepper_move(N, steps); if(steps) return stepper_move(N, steps);
else{ // steps == 0 - just check endswitches else{ // steps == 0 - just check endswitches
cur_motor = N; prep2chkesw(N);
chk_esw = 1;
return 0; return 0;
} }
} }

View File

@ -86,7 +86,14 @@ U8 stepper_ch_speed(char *spd){
*/ */
U8 check_endsw(){ U8 check_endsw(){
// A1 - "+", A2 - "-" // A1 - "+", A2 - "-"
U8 i;
U8 pc = PORT(ESW_PORT, IDR); 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_MINUS)) return 1;
if(0 == (pc & ESW_PLUS)) return 2; if(0 == (pc & ESW_PLUS)) return 2;
return 0; return 0;
@ -148,9 +155,14 @@ void stop_motor(){
void stepper_get_esw(U8 Nmotor){ void stepper_get_esw(U8 Nmotor){
U8 sw; U8 sw;
char str[] = "[2 0 St=0]\n"; // 3 - motor number, 5 - endswitch (3 if none) 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 if(Nmotor == 0 || Nmotor > 6) return; // no running motor
IWDG_KR = KEY_REFRESH; // refresh watchdog
ESW_SELECT(Nmotor); ESW_SELECT(Nmotor);
if(chk_esw > 1){
--chk_esw;
return;
}
chk_esw = 0;
str[3] = Nmotor + '0'; str[3] = Nmotor + '0';
sw = check_endsw(); sw = check_endsw();
if(sw == 0) sw = 3; if(sw == 0) sw = 3;
@ -158,3 +170,14 @@ void stepper_get_esw(U8 Nmotor){
uart_write(str); uart_write(str);
cur_motor = 0; 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;
}

View File

@ -42,6 +42,7 @@ U8 stepper_move(U8 Nmotor, int Nsteps);
void stop_motor(); void stop_motor();
U8 check_endsw(); U8 check_endsw();
void prep2chkesw(U8 Nmotor);
void stepper_get_esw(U8 Nmotor); void stepper_get_esw(U8 Nmotor);
U8 chk_stpr_cmd(char N); U8 chk_stpr_cmd(char N);