mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Drehencoder mit AVR will nicht so wie ich gern will


Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag.

Ich habe das Problem das ich mir ein Programm geschrieben habe, welches 
je nachdem ob ein Drehencoder Rechts oder Links herum gedreht wird 
entweder LED1 oder LED2 aufleuchten läßt (einen kurzen Impuls ausgibt).
.include "tn2313def.inc"

    ldi r16, 0b00000011
    out DDRD, r16      ; PD0+1 Sind Ausgänge
    ldi r16, 0x00
    out PORTD, r16
    out DDRB, r16      ; PB 0+1 Sind Eingänge
    ldi r16, 0b00000011
    out PORTB, r16      ; Eingänge haben einen Pull-Up Widerstand geschaltet

Loop:

    sbis PINB, 0
    rcall PINBR        ; Wenn Eingang PB0 auf Low zu Unterprogramm springen
    sbis PINB, 1
    rcall PINBL        ; Wenn Eingang PB1 auf Low zu Unterprogramm springen
    rjmp Loop

PINBR:

    ldi r16, 0x01
    out PORTD, r16      ; LED an PD0 einschalten
    ldi r16, 0xFF
    rcall Warte        ; Warteschleife
    ldi r16, 0x00
    out PORTD, r16      ; LED an PD0 abschalten
    rjmp PINB0_        ; In Unterprogramm springen

PINB0_:

    sbis PINB, 0
    rjmp PINB0_
    sbis PINB, 1
    rjmp PINB0_
    ret            ; Soblad beide Eingänge wieder Low zurück ins Programm

PINBL:

    ldi r16, 0x02
    out PORTD, r16
    ldi r16, 0xFF
    rcall Warte
    ldi r16, 0x00
    out PORTD, r16
    rjmp PINB1_

PINB1_:

    sbis PINB, 1
    rjmp PINB1_
    sbis PINB, 0
    rjmp PINB1_
    ret

Warte:

    dec r16
    brne warte
    ret

Irgendwie ist das Problem das teilweise die falsche LED angesteuert 
wird, desto schneller ich drehe desto öfter, aber teilweise auch bei 
gaanz langsamen drehen. Wenn ich die Tacktfrequenz erhöhe kommt dieser 
Fehler seltener vor.
An Aussenbeschaltung habe ich nur die LED`s mit vorwiderstand sowie den 
Drehencoder welcher auf Masse zieht.

Autor: Thomas G. (mrmp3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hier erstmal nen Link, ist eigentlich ganz cool erklärt.
http://www.mikrocontroller.net/articles/Drehgeber

Leider hab ich von Assembler nicht so viel Ahnung. Aber Ich sehe das du 
nicht mit Timern arbeitest, ist aber bei Drehimpulsgebern von Vorteil.

Ich kenne 2 Möglichkeiten:

1. Einen der Beiden Pins (A oder B) an einen Interrupt Eingang und bei 
steigender oder fallender Flanke in die Rountine rein und testen ob sich 
der andere Pin auch geändert hat oder noch bleibt. So kannst du 
ermitteln welche Richtung gedreht wurde, das hat aber den nachteil das 
du nur die halbe Auflösung hast.

2. Per Timer in festen Abständen die Zustände von A und B auslesen und 
so entscheiden ob gedreht wurde, und wenn ja in welche Richtung.




Ein Drehimpulsgeber prellt genau so wie ein normaler Taster ich vermute 
das dein Programm das nicht berücksichtigt und aufgrund des Prellens 
irgendwelche entscheidungen trifft. wie lange wartest du bist zum 
nächsten abfragen ?

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eigentlich haut er die Befehle mit 8MHz durch.

Entprellen habe ich mit n kleinen Kerko .. habe aber die Widerstände 
vergessen ^^

Edit:

Widerstände haben keine Besserung gebracht.

Zum Link:
Ich kann kein C :(

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Thomas G. (mrmp3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du dein Problem gelöst ?

Also rein aus nem Gefühl herraus würd ich sagen das der Tiefpass nicht 
ausreicht um den Geber zu entprellen.

Die Lösung deines Problems liegt wahrscheinlich darin das du nicht mit 
8Mhz abtasten solltest weil du dann jedes Prellen mit analysierst 
sondern z.B. aller 1ms und dann solltest du schnelle Pegelwechsel in 
deiner Software ausschließen.

Hab den Link von Hannes nicht eingesehen, vllt. steht da ja das selbe 
^^.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas G. schrieb:
> Hast du dein Problem gelöst ?
>
> Also rein aus nem Gefühl herraus würd ich sagen das der Tiefpass nicht
> ausreicht um den Geber zu entprellen.

Der Tiefpass ist gar nicht nötig, wenn der Drehgeber per MC ausgewertet 
wird.

>
> Die Lösung deines Problems liegt wahrscheinlich darin das du nicht mit
> 8Mhz abtasten solltest weil du dann jedes Prellen mit analysierst
> sondern z.B. aller 1ms und dann solltest du schnelle Pegelwechsel in
> deiner Software ausschließen.

Richtig, alle etwa 1 ms den aktuellen Zustand beider Pins mit dem 
vorherigen (gemerkten) Zustand vergleichen.

>
> Hab den Link von Hannes nicht eingesehen, vllt. steht da ja das selbe
> ^^.

Schade eigentlich. Aber der Frager hat den Link vermutlich auch nicht 
verfolgt, sonst hätte er ja weitere Fragen dazu gestellt. Vermutlich 
fehlt die Zeit, denn jetzt ist ja erstmal Tastenentprellung dran:
Beitrag "Taster Softwaretechnisch entprellen"

...

Autor: Thomas G. (mrmp3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hast du recht wenn die Entprellen per µC erfolgt ist der Tiefpass 
sinnlos aber selbst wenn er die Entprellung mit dem Tiefpass machen 
wöllt würde das nicht funktionieren denk ich weil die Zeiten einfach zu 
kurz sind. Oder irre ich mich da ???

Ich hab mich mit dem Link den ich gepostet hab beschäftigt der ist in C 
das versteh ich besser ^^.

Entprellen eines Tasters steht im Tutorial sogar in Assembler !
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten

Autor: Michael D. (etzen_michi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Info: Ich lese hier noch ^^.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas G. schrieb:
> Da hast du recht wenn die Entprellen per µC erfolgt ist der Tiefpass
> sinnlos aber selbst wenn er die Entprellung mit dem Tiefpass machen
> wöllt würde das nicht funktionieren denk ich weil die Zeiten einfach zu
> kurz sind. Oder irre ich mich da ???

Ich habe die Zeiten nicht überprüft, weil ich diesen Ansatz für eine 
Sackgasse halte. Denn ein MC, der Drehgeber auslesen soll, soll gewiss 
noch etwas Anderes tun als nur Drehgeber auszulesen. Daher hat er keine 
Zeit, Wartezeiten durch Vertrödeln von CPU-Takten zu generieren. Es muss 
also ein Timer her, der Drehgeber-Auslesen, Tastenentprellung und ggf. 
auch noch den Sekundentakt generiert, ohne der CPU Rechenzeit durch 
Zählen von Takten zu stehlen.

>
> Ich hab mich mit dem Link den ich gepostet hab beschäftigt der ist in C
> das versteh ich besser ^^.

Ist bei mir umgedreht, ich verstehe ASM besser als C. Der AVR übrigens 
auch (in Form von MC)... ;-)
Und weil der Frager kein C kann, habe ich (m)eine ASM-Routine verlinkt, 
die von anderen Leuten auf C und Bascom umgeschrieben wurde.

>
> Entprellen eines Tasters steht im Tutorial sogar in Assembler !
> http://www.mikrocontroller.net/articles/AVR-Tutorial:_Tasten

Ja sicher, ich benutze (und verstehe) Peter Danneggers Entprellroutine 
aber schon etwas länger als sie im Tutorial steht. Und ich passe sie 
auch an wechselnde Aufgaben an. Ich kann aber auch verstehen, wenn ein 
Anfänger diese Routine meidet, weil er sie nicht versteht. Die Routine 
ist hochoptimiert und für den Laien nicht leicht zu verstehen. Dafür 
braucht sie extrem wenig Ressourcen (Code, Rechenzeit) und kommt auch 
mit den labrigsten Tasten zurecht.

...

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Dierken schrieb:
> Info: Ich lese hier noch ^^.

Prima...
Nachdem Deine Tasten ja nun sauber entprellt werden, kannst Du Dich ja 
wieder dem Drehgeber widmen.

Ein Beispiel, das Drehgeber und Tasten einliest findest Du z.B. hier:
http://www.mikrocontroller.net/attachment/43903/sinus.zip

Viel Erfolg...

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.