Код: Выделить всё
volatile byte kolich_step, _ustkolich_step; // объявляем переменные
volatile bool _centr_, _trig_interr_01 ; // объявляем переменные
setup(){
DDRD &=0xF3; // настраиваем пины 2 и 3 как входы
PORTD |=0x0C;// включаем на 2 и 3 подтяжку
attachInterrupt(0, calc_center, RISING);// прерывание на пине 2 по фронту
attachInterrupt(1, calc_horizont, RISING); // прерывание на пине 3 по фронту
DDRB |=0x20; // пин 13 как выход
PORTB &=0xDF; // пин 13 low
}
loop(){
_ustkolich_step = Step_ust; // вход в блок не может быть volatile, поэтому промежуточное присвоение
speed_step =_centr_; // выход из блока не может быть volatile, поэтому промежуточное присвоение
if(! in_work){ // если вход 0, то
speed_step =0; // переключение скорости =0
}
void calc_horizont() // обрабатываем датчик горизонтального перемещения по фронту импульса на пине 3
{
kolich_step++; // увеличиваем внутренний счётчик, ВС, на 1
if (kolich_step > _ustkolich_step && _trig_interr_01) { // если ВС больше, чем уставка и разрешена сработка, то:
_trig_interr_01 =0; // запрещаем сработку
PORTB^=0x20; // инвертируем пин 13
}
}
void calc_center() // обработчик центральной метки, по фронту на пин 2
{
_centr_ =1; // говорим, что дошли до центра, скорость можно увеличить
kolich_step=0; // сбрасываем ВС в 0
_trig_interr_01 =1; // разрешаем сработку в горизонтальном блоке
}