Forum: Mikrocontroller und Digitale Elektronik Flankenerkennung bei Drehtaster


von student (Gast)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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)

von Uwe B. (Firma: TU Darmstadt) (uwebonnes)


Lesenswert?

Benutze eine uC mit Quadraturencoder :-)

von Karl H. (kbuchegg)


Lesenswert?

student schrieb:

Nachtrag:

> 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.

Nö. A (damit ist wohl der Eingang gemeint) kann auch vorher schon 0 
gewesen sein.

von Mitlesender (Gast)


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.

von MaWin (Gast)


Lesenswert?

student schrieb:
> Mein erster Gedanke war folgender:

Murks aus Unkenntnis.

> Wie kann ich da vorgehen?

Erst mal lernen:
http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29
http://www.mikrocontroller.net/articles/Drehgeber

von Harald W. (wilhelms)


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!

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.