Wenn PCINT nicht ausgelöst -> Setze Variable auf 0

Gast #5832260
Lesenswert?

Hallo Zusammen,

irgendwie fehlt es mir gerade an ein bisschen Logik und ich hoffe mir 
könnte jemand von euch helfen.

Ich Zähle über den Pin Change Interrupt bei meinem ATMega324PA positive 
und negative Flanken von einem Motor.

Dreht sich der Motor nach Links -> Werte zählen Aufwärts
Dreht sich der Motor nach Rechts -> Werte zählen Abwärts.

Bei mir gibt es jedoch keine Möglichkeit die Endschalter abzufragen, da 
diese nicht mit dem µC verbunden sind.

Durch den PCINT gibt es immer ein paar takte Zähltolleranz, das heißt es 
kann auch sein, wenn der Motor nach Rechts gelaufen ist und auf 
Endposition steht -> Wert ist ein bisschen über 0.

Nun suche ich eine Möglichkeit über meinen Timer abzufragen, ob das 
Signal zum Verfahren des Motors anliegt, sich aber eine gewisse Zeit 
keine Pulse verändert haben. -> Motorposition = 0.
1
 
2
ISR(PCINT0_vect)   //Motor 1
3
{
4
  if (digitalRead(M1_AUF) == HIGH)
5
  {
6
    M1_ist_position++;  //Counting Motorpulses upwards when the EMK get poled from + to - and from - to +
7
  }
8
  if (digitalRead(M1_AB) == HIGH)
9
  {
10
    M1_ist_position--;  //Counting Motorpulses downwards when the EMK get poled from + to - and from - to + 
11
  }
12
  if (M1_ist_position <= 0) //Turn the Value to Zero when there is an Underflow
13
  {
14
    M1_ist_position = 0;
15
  }
16
}

Somit könnte ich ja irgendwie abfragen:

if (digitalRead(M1_AB) == HIGH) && Änderungen der Pulse in einer 
gewissen Zeit < als es sollte)
{
  M1_ist_position=0;
}

Nur fehlt mir irgendwie die Logik für "Änderungen der Pulse in einer 
gewissen Zeit < als es sollte).

Kann ich einfach eine Variable nehmen und den jetzigen Wert des Motors 
in die Variable speichern
und eine neue Variable nehmen und den Wert des Motors nach x Zeit 
einspeichern,

beide Variablen vergleichen und falls die Differenz zu gering ist -> Es 
hat zu wenig Pulse stattgefunden -> M1_ist_position=0?

Wie würdet ihr das Ganze vergleichen?

Wäre Froh über ein paar Ansätze ;)
Gast #5832267
Lesenswert?

Gehe ich recht in der Annahme das kein PCINT mehr kommt wenn der Motor 
in Endposition ist?
In dem Fall brauchst du einfach einen Timeout den du in der PCINT ISR 
zurück setzt, wenn die dann gewisse Zeit nicht aufgerufen wurde -> 
Timeout = Motor in Endposition.
Gast #5832275
Lesenswert?

Richtig, der PCINT wird nur ausgelöst, sobald eine Flankenänderung 
detektiert wird.

Da keine mehr detektiert wird, wenn der Motor auf Endposition ist, wäre 
dies wohl wirklich meine beste Lösung.

Ich versuche mich direkt einmal an so eine Implementierung.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren