Nefunkční přerušení při odpojení ISP programátoru

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

Tak po dvou dnech jsem konečně došel k osvícení a vyřešil jsem tento gigantní problém. Abych to vysvětlil. Ten kód, který jsem zveřejnil, funguje jako driver pro ovládání 3 krokových motorů. Čili je to mezikus mezi arduino s GRBL a motory. Arduino odešle puls “step” do INT0-2 v Atmega a ta provede krok motoru. Problém byl, a teď si připravte mimické svaly, že jsem do Atmegy posílal pouze + , aniž bych měl připojené GND :smiley:
Takže když jsem měl Arduino i Atmegu připojené do USB, měli společnou kostru a fungovalo to. Jakmile jsem odpojil programátor Atmegy z USB, světe div se, nic se nedělo :slight_smile:

Teď už vše funguje jak má a já nyní z tohoto mého malého myšlenkového nedostatku tiše obviňuji nemoc :slight_smile:

To se stává i v lepších rodinách :wink: Z toho si nic nedělej…