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


von Sven P. (Gast)


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:
1
{
2
  static unsigned char alter_status = 0,step = 0;
3
  unsigned char        neuer_status;
4
5
      neuer_status = Geber & (_BV(Schalter_A) | _BV(Schalter_B));
6
  if ((neuer_status ^ step)==(_BV(Schalter_A) | _BV(Schalter_B)))
7
  {
8
    if ((neuer_status ^ alter_status)==_BV(Schalter_A))
9
      richtung +=1;                  // Es war nach rechts
10
    else
11
      richtung -=1;                  // Es war nach links
12
    step = neuer_status;
13
  }
14
  alter_status = neuer_status;
15
}




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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Einen C-Compiler nehmen und ihn das übersetzen lassen?

Das hier bekomme ich, wenn ich den originalen Quelltext für einen
ATtiny2313 compiliere:
1
        in r25,48-0x20
2
        andi r25,lo8(3)
3
        lds r24,step.1508
4
        eor r24,r25
5
        cpi r24,lo8(3)
6
        brne .L2
7
        lds r24,alter_status.1507
8
        eor r24,r25
9
        cpi r24,lo8(2)
10
        brne .L4
11
        lds r24,richtung
12
        subi r24,lo8(-(1))
13
        rjmp .L8
14
.L4:
15
        lds r24,richtung
16
        subi r24,lo8(-(-1))
17
.L8:
18
        sts richtung,r24
19
        sts step.1508,r25
20
.L2:
21
        sts alter_status.1507,r25

von Sven P. (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

von Sven P. (Gast)


Lesenswert?

Natürlich nicht....^^

Ne, aber funktionieren tuts irgendwie immer noch net.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Sven P. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sven P. (Gast)


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.

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.