Forum: Mikrocontroller und Digitale Elektronik Wenn PCINT nicht ausgelöst -> Setze Variable auf 0


von Thomas (Gast)


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 ;)

von Thomas (Gast)


Lesenswert?

"positive
und negative Flanken von einem Motor."

Soll natürlich steigende und fallende Flanken heißen.

von Tim T. (tim_taylor) Benutzerseite


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.

von Thomas (Gast)


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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Du könntest in der PCINT ISR einen Timer starten und bei 0 beginnen 
lassen. Rennt der Timer in den Overflow, wird dein Zähler auf 0 gesetzt 
- Motor steht.
Wie schnell der Timer läuft, machst du abhängig von der maximalen Zeit, 
in der du Flanken erwartest.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.