Ви не увійшли.
Сторінки 1
boolean compare, triger, inc_cw, nc_cww;
byte division,division_CW,division_CWW, backlash_CW, backlash_CWW, backlash;
int counter_lcd , calibre_lcd;
// настройка вннешнего прерывания INT0 и INT1.
//INT0 PD2. Mode: Falling Edge. INT1 PD2. Mode: Rising Edge.
EICRA = (1<<ISC11) | (1<<ISC10) | (1<<ISC01) | (0<<ISC00);
EIMSK = (1<<INT1) | (1<<INT0);
EIFR = (1<<INTF1) | (1<<INTF0);
PCICR = (0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
//======================================================================
if((digitalRead(10) == 0)&&(triger == 0)) //compare.
{
temp++;
if(temp == 0xff)
{
if(counter_lcd < calibre_lcd) //motor_cww.
{
compare = 0;
PORTD |= (1<<5); //on motor cw.
while(compare == 0)
{
}
PORTD &= ~(1<<5); //off motor.
PORTB |= (1<<4); //on braking.
braking = 0x3300; //13056 time braking.
triger = 1; //set triger.
goto compare_end;
}
if(counter_lcd > calibre_lcd) //motor_cww.
{
compare = 0;
PORTD |= (1<<4);//on motor cww.
while(compare == 0)
{
}
PORTD &= ~(1<<4); //off motor.
PORTB |= (1<<4); //on braking.
braking = 0x3300; //13056 time braking.
triger = 1; //set triger.
}
}
}
compare_end:
ISR(INT0_vect)//INT0 PD2. Mode: Falling Edge. обработка прерываний с деление и люфтом INT0 and INT1 - ON
{
cli();
if((inc_cw == 1)&&(digitalRead(3) == 0))// энкодер++.
{
if(backlash_CW == backlash)//выбор люфта вперед.
{
if(division_CW == division) //деление входных импульсов.
{
counter_lcd++;
if(compare == 0)
{
if(counter_lcd == calibre_lcd)
{
PORTD &= ~(1<<5);
compare = 1;
}
}
division_CW = 0;
goto out_int_A;
}
division_CW++;
goto out_int_A;
}
backlash_CW++;
backlash_CWW = 0;
division_CWW = 0;
goto out_int_A;
}
if((inc_cww == 1)&&(digitalRead(3) == 1))//энкодер--.
{
if(backlash_CWW == backlash)//выбор люфта назад.
{
if(division_CWW == division)//деление входных импульсов.
{
counter_lcd--;
if(compare == 0)
{
if(counter_lcd == calibre_lcd)
{
PORTD &= ~(1<<4);
compare = 1;
}
}
division_CWW = 0;
goto out_int_A;
}
division_CWW++;
goto out_int_A;
}
backlash_CWW++;
backlash_CW = 0;
division_CW = 0;
}
out_int_A:
inc_cw = 0;
inc_cww = 0;
sei();
}
//==================================================================
//ISR(INT1_vect)//INT1 PD2. Mode: Rising Edge.
{
cli();
if(digitalRead(2) == 0){inc_cw = 1; inc_cww = 0; goto out_int_B;}//энкодер++.
if(digitalRead(2) == 1){inc_cww = 1; inc_cw = 0; goto out_int_B;}//энкодер--.
out_int_B:
sei();
}
//====================================================================
Вот мой код обработке энкодера, смысл в том что есть переменная calibre_lcd к значению которой крутится двигатель. В первом прерывании задаются направление энкодера в нулевом отсчёт. В коде есть выборка люфта и деление входных импульсов от энкодера.
Проблема такова, не срабатывает вот этот код, двигатель крутится постоянно. Я убирал люфт и деление, проблема остаётся значит дело не в них?
if(compare == 0)
{
if(counter_lcd == calibre_lcd)
{ PORTD &= ~(1<<5); // или PORTD &= ~(1<<4);
compare = 1;
}
}
Когда я вынес код из прерывания все заработало нормально
while(compare == 0)
{
if(counter_lcd == calibre_lcd)
{PORTD &= ~(1<<5); // или PORTD &= ~(1<<4);
compare = 1;
}
}
Неактивний
Сторінки 1