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

Gast #5832260
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
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
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.
(Firma: matzetronics) #5832345
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.