Napsal jsem si prográmek na ovládání krokových motorů. Využívám externího přerušení. Vše funguje jak má, ale jakmile odpojím programátor, přerušení přestane fungovat. Jedná se o Atmegu32 na vývojový desce EVB4.3. Píšu to v Arduino IDE. Kód zde:
[code]#define MOT11 16
#define MOT12 17
#define EN1 18 //enable
#define MOT21 19
#define MOT22 20
#define EN2 21 //enable
#define MOT31 31
#define MOT32 30
#define MOT33 29
#define MOT34 28
#define STOP 24 //Nouzovy STOP
#define INT0 10
#define INT1 11
#define INT2 2
#define DIR1 9
#define DIR2 12
#define DIR3 8
#define LED1 27
#define LED2 26
#define LED3 25
#define DELAY 0
#define F_CPU 16000000
int krok1=1,krok2=1,krok3=1;
void setup()
{
pinMode(MOT11,OUTPUT);
pinMode(MOT12,OUTPUT);
pinMode(EN1,OUTPUT);
pinMode(MOT21,OUTPUT);
pinMode(MOT22,OUTPUT);
pinMode(EN2,OUTPUT);
pinMode(MOT31,OUTPUT);
pinMode(MOT32,OUTPUT);
pinMode(MOT33,OUTPUT);
pinMode(MOT34,OUTPUT);
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED3,OUTPUT);
digitalWrite(LED1, HIGH);
digitalWrite(LED2, HIGH);
digitalWrite(LED3, HIGH);
pinMode(DIR1,INPUT); //DIR1
pinMode(DIR2,INPUT); //DIR2
pinMode(DIR3,INPUT); //DIR3
pinMode(STOP,INPUT);
digitalWrite(DIR1, HIGH);
digitalWrite(DIR2, HIGH);
digitalWrite(DIR3, HIGH);
digitalWrite(STOP, HIGH);
GICR =(1 << INT0)|(1 << INT1)|(1 << INT2);
MCUCR =(1 << ISC00)|(1 << ISC01)|(1 << ISC11)|(1 << ISC10);
MCUCSR =(1 << ISC2);
DDRD = (1<<PD2)|(1<<PD3);
PORTD = (0<<PD2)|(0<<PD3);
DDRB = (1<<PB2);
PORTB = (0<<PB2);
}
void loop(void)
{
sei();
//if (digitalRead(STOP)==LOW)
//{
// totalstop();
//}
}
ISR (INT2_vect)
{
GICR |= (0 << INT2);
digitalWrite(LED3,LOW);
motor3();
GICR |= (1 << INT2);
digitalWrite(LED3,HIGH);
}
ISR (INT1_vect)
{
GICR |= (0 << INT1);
digitalWrite(LED2,LOW);
digitalWrite(EN2,LOW);
motor2();
digitalWrite(EN2,HIGH);
GICR |= (1 << INT1);
digitalWrite(LED2,HIGH);
}
ISR (INT0_vect)
{
GICR |= (0 << INT0);
digitalWrite(LED1,LOW);
digitalWrite(EN1,LOW);
motor1();
digitalWrite(EN1,HIGH);
GICR |= (1 << INT0);
digitalWrite(LED1,HIGH);
}
void totalstop()
{
while(0)
{
GICR |= (0 << INT0);
GICR |= (0 << INT1);
GICR |= (0 << INT2);
}
}
void motor1()
{
if (krok1==5)
{
krok1=1;
}
if (krok1==0)
{
krok1=4;
}
if (krok1==1)
{
digitalWrite(MOT11,HIGH);
digitalWrite(MOT12,HIGH);
_delay_ms(DELAY);
if (digitalRead(DIR1)==LOW)
{
krok1++;
}
else
{
krok1–;
}
return;
}
if (krok1==2)
{
digitalWrite(MOT11,HIGH);
digitalWrite(MOT12,LOW);
_delay_ms(DELAY);
if (digitalRead(DIR1)==LOW)
{
krok1++;
}
else
{
krok1–;
}
return;
}
if (krok1==3)
{
digitalWrite(MOT11,LOW);
digitalWrite(MOT12,LOW);
_delay_ms(DELAY);
if (digitalRead(DIR1)==LOW)
{
krok1++;
}
else
{
krok1–;
}
return;
}
if (krok1==4)
{
digitalWrite(MOT11,LOW);
digitalWrite(MOT12,HIGH);
_delay_ms(DELAY);
if (digitalRead(DIR1)==LOW)
{
krok1++;
}
else
{
krok1–;
}
return;
}
}
void motor2()
{
if (krok2==5)
{
krok2=1;
}
if (krok2==0)
{
krok2=4;
}
if (krok2==1)
{
digitalWrite(MOT21,HIGH);
digitalWrite(MOT22,HIGH);
_delay_ms(DELAY);
if (digitalRead(DIR2)==LOW)
{
krok2++;
}
else
{
krok2–;
}
return;
}
if (krok2==2)
{
digitalWrite(MOT21,HIGH);
digitalWrite(MOT22,LOW);
_delay_ms(DELAY);
if (digitalRead(DIR2)==LOW)
{
krok2++;
}
else
{
krok2–;
}
return;
}
if (krok2==3)
{
digitalWrite(MOT21,LOW);
digitalWrite(MOT22,LOW);
_delay_ms(DELAY);
if (digitalRead(DIR2)==LOW)
{
krok2++;
}
else
{
krok2–;
}
return;
}
if (krok2==4)
{
digitalWrite(MOT21,LOW);
digitalWrite(MOT22,HIGH);
_delay_ms(DELAY);
if (digitalRead(DIR2)==LOW)
{
krok2++;
}
else
{
krok2–;
}
return;
}
}
void motor3()
{
if (krok3==5)
{
krok3=1;
}
if (krok3==0)
{
krok3=4;
}
if (krok3==1)
{
digitalWrite(MOT31,HIGH);
digitalWrite(MOT32,LOW);
digitalWrite(MOT33,LOW);
digitalWrite(MOT34,LOW);
_delay_ms(DELAY);
if (digitalRead(DIR3)==LOW)
{
krok3++;
}
else
{
krok3–;
}
return;
}
if (krok3==2)
{
digitalWrite(MOT31,LOW);
digitalWrite(MOT32,HIGH);
digitalWrite(MOT33,LOW);
digitalWrite(MOT34,LOW);
_delay_ms(DELAY);
if (digitalRead(DIR3)==LOW)
{
krok3++;
}
else
{
krok3–;
}
return;
}
if (krok3==3)
{
digitalWrite(MOT31,LOW);
digitalWrite(MOT32,LOW);
digitalWrite(MOT33,HIGH);
digitalWrite(MOT34,LOW);
_delay_ms(DELAY);
if (digitalRead(DIR3)==LOW)
{
krok3++;
}
else
{
krok3–;
}
return;
}
if (krok3==4)
{
digitalWrite(MOT31,LOW);
digitalWrite(MOT32,LOW);
digitalWrite(MOT33,LOW);
digitalWrite(MOT34,HIGH);
_delay_ms(DELAY);
if (digitalRead(DIR3)==LOW)
{
krok3++;
}
else
{
krok3–;
}
return;
}
} [/code]
Nějaký nápady? Děkuji předem za odpovědi