Nano mit Interrupt und PWM

Moin,

ich bin gerade etwas am verzweifeln…

Ich habe am Int0 eine Gabellichtschranke und am Pin10(PWM) einen Motor.

Nun soll wenn ein bestimmter Zählerwert erreicht ist runtergeregelt werden.

Das Zählen funktioniert auch so lange der Motor 100% läuft wenn ich anfange per PWM runterzuregeln Zählt er nicht weiter :(…

Ich habe schon ein Osi an den Int0 gehängt doch das Signal sieht immer gleich aus keine einstreuungen aus dem PWM Signal.

Warum macht der Nano das?? geht PWM und Int0 nicht?

Ahso ich habe auch schon die andern Pins probiert gleiches ergebnis…

Sketch ?

int count = 0;
byte pwm = 0;
bool start = false;
bool richtung = false;
int start_r = 0;
int puls = 0;
bool puls_in = false;
int laeuft = 0;


void setup() 
{
  Serial.begin(9600);
  
  //Zäher Interrupt
  attachInterrupt(0, Counter, RISING);
  pinMode(2, INPUT);
  digitalWrite(2, INPUT_PULLUP);
  pinMode(3, INPUT);
  digitalWrite(3, INPUT_PULLUP);
  
  //Start
  pinMode(8, INPUT);
  digitalWrite(8, HIGH);
  
  //PWM
  pinMode(6, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  
  //Relais
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  
}


void loop() 
{
  //Richtung umschalten
  if(richtung == true)
  { 
    digitalWrite(4, HIGH);
    digitalWrite(5, HIGH);
  }else{
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);   
  }  
  
  //Starten der Tür mit Pin 8
  start = digitalRead(8);
  
  if(start == 1 && start_r == 0 && count == 0)
  {
    start_r = 1;
    richtung = true;
    laeuft = 1;
    count = 0;
    //digitalWrite(6,HIGH);
    //Serial.print("Richtung 1");
    //Serial.print("\n");
  }
  
  if(start == 1 && start_r == 2 && count == 0)
  {
    start_r = 3;
    richtung = false;
    laeuft = 1;
    count = 0;
    //digitalWrite(6,HIGH);
    //Serial.print("Richtung 2");
    //Serial.print("\n");
  }
  
  //PWM auf 0 Schreiben
  if(laeuft == 0)
  {
    pwm = 0;
  }
  //Schneller Stufe 1
  if(start_r != 0 && count < 10 && laeuft == 1)
  {
    pwm = 50;
  }
  //Schneller Stufe 2
  if(start_r != 0 && count > 12 && laeuft == 1)
  {
    pwm = 100;
  }
  //Schneller Stufe 3
  if(start_r != 0 && count > 20 && laeuft == 1)
  {
    pwm = 255;
  }
  
  //Langsamer Stufe 1
  if(start_r != 0 && count > 80 && laeuft == 1)
  {
    pwm = 100;
  }
  //Langsamer Stufe 2
  if(start_r != 0 && count > 90 && laeuft == 1)
  {
    pwm = 80;
  }
  //Langsamer Stufe 3
  if(start_r != 0 && count > 110 && laeuft == 1)
  {
    pwm = 40;
  } 
  
  //Abschalten
  if(start_r != 0 && count >= 125 && laeuft == 1)
  {
    count = 0;
    laeuft = 0;
    pwm = 0;
    //digitalWrite(6,LOW);
    if(start_r == 1)
    {
      start_r = 2;  
    }
    if(start_r == 3)
    {
      start_r = 0;
    }
    //Serial.print("Ende ");
    //Serial.print(start_r);
    //Serial.print("\n");
  }
  
  //PWM schreiben  
  analogWrite(6,pwm);
}



void Counter()
{  
  //Jede Nocke +1
  //15Umdrehungen * 8 Löchet = 120 Impulse
  if(laeuft == 1)
  {
    count++;
  }
  Serial.print(count);
  Serial.print("\n");
}

Da sind mindestens zwei Fehler drin:

1.) alle Variablen die innerhalb und außerhalb von ISRs verwendet werden müssen als volatile deklariert werden 2.) Serial hat in einer ISR nichts verloren. Der normale Weg ist da in der ISR ein flag zu setzen und in loop() darauf abzufragen ob etwas zu tun ist.