Forum: Projekte & Code DREHGEBER auslesen per externen Interrupt ATmega Assembler


von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Geschätztes Forum,

ein kleines Assemblerbeispiel, wie per ext. Interrupt ein Drehgeber z.B. 
STEC11B ausgelesen werden kann.


Lösungsprinzip:

Der Kanal-A löst bei jeden Flankenwechsel einen externen Interrupt aus.

Bei einem Interruptaufruf wird aber zuerst der Zustand vom Kanal-B 
ermittelt.

Anschließend startet eine Zeitschleife, es wird solange geawartet, bis 
sich das System beruhigt hat und
kein Pegelwechsel mehr Kanal-A erfolgt(z.B. 1ms pro Schleife).

Erst dann wird der Zustand vom Kanal-A ermittelt und ein ev. noch 
anstehender ext. Interrupt (INT0) gelöscht.


Bernhard

von Davis (Gast)


Lesenswert?

Bernhard S. schrieb:

> Lösungsprinzip:

Externe Interrupts sind keine gute Lösung. Wurde hier im Forum schon oft 
"durchgekaut". Einfach die Suchfunktion anwerfen. Viel Glück.

von Martin (Gast)


Lesenswert?

Bernhard S. schrieb:
> Der Kanal-A löst bei jeden Flankenwechsel einen externen Interrupt aus.

Schlechte Idee Nummer 1. Tasten fragt man nie mittels Interrupts ab. Und 
ein Drehgeber ist ja im Prinzip nichts anderes als zwei Tasten, die in 
einer bestimmten Reihenfolge betätigt werden. Wie Davis schon richtig 
sagte wurde das schon x-Mal durchexerziert.

> Anschließend startet eine Zeitschleife, es wird solange geawartet, bis
> sich das System beruhigt hat und
> kein Pegelwechsel mehr Kanal-A erfolgt(z.B. 1ms pro Schleife).

Damit blockierst du dein ganzes System pro Schleifendurchlauf für 1ms?
Schlechte Idee Nummer 2.

von Bernhard S. (bernhard)



Lesenswert?

@alle

ein mögliches einfaches Assembler-Beispiel, wie ein rastender Drehgeber 
ausgelesen werden kann.

Bei Drehrichtung-1 blinkt kurz die gelbe LED, bei Drehrichtung-2 die 
grüne.

Bei einem unkorrektem Interruptaufruf (z.B. Programmierfehler) leuchtet 
die rote LED.

Bei Programmen, die nicht zeitkritisch sind, kann ein solches Verfahren 
angewendet werden.

In diesem aktuellen Projekt nutze ich es z.B., es sind eh eine Menge 
Warteschleifen systembedingt erforderlich, bei Drehgeberbetätigung ist 
keine Bildaufbauverzögerung erkennbar:

Beitrag "Spektrumanalysator Frequenzspektrumanalysator Frequenzspektrometer Speki Wobbelgenerator TFT Atmega8"


Nutürlich behindert die 1ms-Warteschleife in der Interruptroutine die 
Programmabarbeitung in der Hauptschleife.

Aber ev. auftretende Interrupts (z.B. TWI) können durch verschachtelte 
Interrupts ermöglicht werden (bitte vorher INT0 deaktivieren).

Im Bild "DREHGEBER_PRINZIP_ext_INTERRUPT" habe ich versucht das Prinzip 
nochmal grafisch darzustellen.

Nach mehreren langsamen Drehversuchen kam das Bild 
"DREHGEBER_starkes_Prellen" zustande.


Bernhard

von Tany (Gast)


Lesenswert?

Martin schrieb:
> Schlechte Idee Nummer 2.

Taster muß an Interupt-PIN angeschossen werden, also PIN nicht frei 
wählbar.
Schlechte Idee Nummer 3

von Tobias F. (coldtobi)


Lesenswert?

Muss ich kurz mal widersprechen. Mann kann durchaus einen Drehgeber 
Interruptunterstützt auslesen.

Unterstützt, da man im Interrupt den Wechsel des Pegels von z.B A 
erkennt und sich das merkt. Ausserhalb des Interrupt-Contextes macht man 
dan Entprellung und die Drehrichtungserkennung machen und dann wieder 
den Interrupt aktivieren.

Im übrigen kann man sich eine Eigenschaft von zu Nutze machen:
Wenn A wechselt ist B stabil.

Hab ich vor kurzen selber implementiert und funktioniert sehr gut.

Davis schrieb:
> Externe Interrupts sind keine gute Lösung. Wurde hier im Forum schon oft
> "durchgekaut". Einfach die Suchfunktion anwerfen. Viel Glück.

von Falk B. (falk)


Lesenswert?

Niemand ist unnütz, er kann auch als schlechtes Beispiel dienen.

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.