Flankenerkennung bei Drehtaster

Gast #4159348
Lesenswert?
• ▲
▼
Hallo an alle,

Ich muss für einen Laborversuch einen Drehknopf auswerten, heisst ob er 
nach Links oder nach Rechts dreht.
Dazu folgendes im Datenblatt (bild im Anhang, achtung, low oben, high 
unten)

Mein erster Gedanke war folgender:
Warten bis eine fallende Flanke an A liegt. DANN erst schauen ob B high 
ist, falls ja, dann ist die Drehrichtung nach rechts, falls nicht, dann 
ist se nach Links.

NUR, wie warte ich auf diese Flanke?
Eine Idee habe ich:

solange warten bis eine fallende Flanke auftritt
while(A==1) {
}

wird die Schleife verlassen, so fand eine fallende Flanke statt.
Nur geht das Impuls jetzt weiter, es bleibt ja nicht stehen.

Wie kann ich da vorgehen?

Da es die erste Vorlesung ist, denke ich, kann es nicht allzu 
kompliziert sein...

Vielen dank an alle die helfen;)

Gruss
Angehängte Dateien:
#4159352
Lesenswert?
• ▲
▼
student schrieb:

> NUR, wie warte ich auf diese Flanke?
> Eine Idee habe ich:
>
> solange warten bis eine fallende Flanke auftritt
> while(A==1) {
> }

Schlechte Idee.

Wenn du in einem µC-Programm einen Satz anfängst mit 'Ich warte auf ...' 
und dann eine while Schleife zeigst, dann hast du in 99% aller Fälle 
schon verloren. Auf etwas aktiv warten ist in einem µC Gift!

Eine bessere Methode ist diese hier:
Es reicht völlig aus, wenn du in deiner Hauptschleife (die einzige 
Endlosschleife in main()) einfach immer wieder einen Blick auf den 
EIngang wirfst. Dein µC kann das problemlos ein paar Zehntausendmal pro 
Sekunde machen. Kein Mensch kann einen Drehgeber so schnell drehen, dass 
dir ein Pegelwechsel an so einem Eingang durch die Lappen gehen würde. 
Bei einem menschlichen 'Dreher' reicht es völlig aus, ein paar Hundert 
bis Tausend mal pro Sekunde den Eingang zu überwachen und das ganze mit 
einem Timer zu erledigen.

Drehgeber

Aber um deine Frage abschliessend zu beantworten:
Eine (steigende) Flanke detektierst du dann zb so
1
...
2

3
   alter_Wert = Eingangswert
4
   
5
   while( 1 ) {               // Hauptschleife
6

7
     neuer_Wert = Eingangswert
8

9
     if( neuer_Wert != alter_Wert ) {  // Ooops am Eingang hat sich was getan
10
       if( neuer_Wert == 1 ) {         // Aha, der Eingang ist von 0 auf 1 gewechselt
11
         ....
12
       }
13

14
       alter_Wert = neuer_Wert;
15
     }
16

17
     .... restliche Programmlogik
18

19
   }

das ganze beruht darauf, dass der µC die Schleife viel schneller 
abarbeiten kann, als je ein Mensch am Encoder drehen kann.
(und natürlich das im Teil '... restliche Programmlogik' beherzigt wird: 
_delay_ms sind selten die Lösung aber oft das Problem, also verwense sie 
nicht (zumindest nicht exzessiv)
Gast #4159390
Lesenswert?
• ▲
▼
Diese kleinen harmos aussehenden Drehgeber haben's in sich. Ich habe mal 
einen ganzen Tag geknobelt bis ich es mit IRQs auf fallend und steigend 
hinbekam. Leider ist der Code verschollen. Peter Danegger hat aber 
bereits vor langer Zeit unter der Rubrik "Projekte" eine Auswertung für 
einen Encoder gelegt, die er mit einer Zeitschleife, realisiert hat.

Und ja, die Taster können prellen. Z.B. hat Atmel diesem Problem im 
Datasheet des SAM3X (eingebauter Encoder) ein ganzes Kapitel gewidmet.
#4160023
Lesenswert?
• ▲
▼
Mitlesender schrieb:

> Diese kleinen harmos aussehenden Drehgeber haben's in sich. Ich habe mal
> einen ganzen Tag geknobelt bis ich es mit IRQs auf fallend und steigend
> hinbekam. Leider ist der Code verschollen.

Dann wäre es besser, sich auf die Standardauswertung von Drehencodern
zu verlassen, so wie sie schon seit Jahrzehnten bekannt ist. Diese
verlässt sich nicht auf irgendwelche Flanken, sondern erfasst die
Zustände. Eine Erklärung findet man u.a. in den DSE-FAQ!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.