www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Pollin-Drehgeber mit AVR pollen


Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huhu schon wieder...

Ich weiß, dass es dieses Thema schon zig-mal hier gab, weshalb ich auch 
bereits allerhand verschiedene Methoden und Quelltext-Schnipsel 
durchprobiert hab, aber irgendwie hinkt das alles noch. Hier mein 
aktueller Versuch, dashier 
(http://www.mikrocontroller.net/attachment/highlight/22223) in Assembler 
umzusetzen.

Hardware: Pollin-Drehgeber, mit Pull-*down* (!) angeschlossen.

Software:
In TMPI2 befindet sich der Wert des PIN-Registers, an welchem der 
Drehgeber angeschlossen ist (PINx3 und PINx4, siehe Bitmaske). In 
(dseg_encoder+[0..1]) finden zwei Bytes für alter_status (Byte 0) und 
step (Byte 1) Platz (siehe C-Quelltext).

Im RAM bei dseg_buttons liegt ein "Interruptregister", welches vom 
Hauptprogramm regelmäßig gepollt wird.


Hier der Original-C-Quelltext:
{
  static unsigned char alter_status = 0,step = 0;
  unsigned char        neuer_status;

      neuer_status = Geber & (_BV(Schalter_A) | _BV(Schalter_B));
  if ((neuer_status ^ step)==(_BV(Schalter_A) | _BV(Schalter_B)))
  {
    if ((neuer_status ^ alter_status)==_BV(Schalter_A))
      richtung +=1;                  // Es war nach rechts
    else
      richtung -=1;                  // Es war nach links
    step = neuer_status;
  }
  alter_status = neuer_status;
}




Und hier gemischt mit meinem ASM-Versuch:

; Bits maskieren:
> neuer_status = Geber & (_BV(Schalter_A) | _BV(Schalter_B));
  andi     TMPI2, 0b00011000

; step laden und ver-xodern, dann mit Bitmaske vergleichen:
> if ((neuer_status ^ step)==(_BV(Schalter_A) | _BV(Schalter_B)))
  lds      TMPI1, (dseg_encoder+1)
  eor      TMPI1, TMPI2
  cpi      TMPI1, 0b00011000
  brne     t0_ovf_vec_noenc
> {

; Interruptregister laden
  lds        YL, dseg_buttons
; BT_ROT-Flag setzen; BR_DIR auf 1 (eine Richtung)
  sbr        YL, (1<<BT_DIR)|(1<<BT_ROT)

; alter_status laden, ver-xodern und mit einem Bit vergleichen:
> if ((neuer_status ^ alter_status)==_BV(Schalter_A))
  lds      TMPI1, (dseg_encoder+0)
  eor        TMPI1, TMPI2
  cpi        TMPI1, 0b00001000
  brne      t0_ovf_vec_dir
> {

; Richtung ändern (BT_DIR auf 0, andere Richtung eben)
  cbr        YL, (1<<BT_DIR)

> }
t0_ovf_vec_dir:
; Interruptregister speichern
  sts        dseg_buttons, YL

> step = neuer_status;
  sts        (dseg_encoder+1), TMPI2

> }
t0_ovf_vec_noenc:
> alter_status = neuer_status;
  sts        (dseg_encoder+0), TMPI2


Würd mich freuen, wenn da jemand eine Idee hätte, was hier schief läuft 
-.-

Danke für Antworten schonmal und viele Grüße,
Haku

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen C-Compiler nehmen und ihn das übersetzen lassen?

Das hier bekomme ich, wenn ich den originalen Quelltext für einen
ATtiny2313 compiliere:
        in r25,48-0x20
        andi r25,lo8(3)
        lds r24,step.1508
        eor r24,r25
        cpi r24,lo8(3)
        brne .L2
        lds r24,alter_status.1507
        eor r24,r25
        cpi r24,lo8(2)
        brne .L4
        lds r24,richtung
        subi r24,lo8(-(1))
        rjmp .L8
.L4:
        lds r24,richtung
        subi r24,lo8(-(-1))
.L8:
        sts richtung,r24
        sts step.1508,r25
.L2:
        sts alter_status.1507,r25

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da sag noch einer, ich könnt nich optimieren. Mein Handgestrickter 
Quelltext ist identisch mit dem Ergebnis des Compilers. Toll...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und, hast du länger als die 100 ms dafür gebraucht, die der Compiler
gebraucht hat? ;-)

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Natürlich nicht....^^

Ne, aber funktionieren tuts irgendwie immer noch net.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich kann dir nur sagen, dass ich den Originalcode schon verwendet
habe (mit dem ,,Pollin''-Encoder), allerdings mit Pullups.  Eigentlich
sollte das aber egal sein bei Gray-Code.

Autor: Sven P. (haku) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hier mal der vorläufige Quelltext, ich werd einfach net schlau draus -.-

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergesst den Quelltext... der is sauber und einwandfrei^^

Ich Schussel hab den Pollin-Drehgeber schön auf Streifenraster gelötet, 
dann noch fein säuberlich ein Loch reingebort für diesen Plastikstutzen 
(genau in der Mitte, quasi andres Ende der Welle), dabei auch fein 
säuberlich die Leiterbahn mittendurch durchbohrt, welche den Gegenpol 
für die beiden Codeausgänge geführt hat.

Sagt jetzt bitte nix.
Guckt lieber mal auf http://e.svgweb.de/new , ist zwar noch Baustelle, 
aber ein Video und ein paar Photos meines... "Projekts" sind schon da.

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.